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 270c012..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 \
@@ -24,10 +24,29 @@
 	CtsTargetInstrumentationApp \
 	CtsUsePermissionDiffCert
 
-# These test cases will be analyzed by the CTS API coverage tools. 
-CTS_COVERAGE_TEST_CASE_LIST := \
-	CtsAccelerationTestCases \
+cts_support_packages := \
 	CtsAccelerationTestStubs \
+	CtsDelegatingAccessibilityService \
+	CtsDeviceAdmin \
+	CtsMonkeyApp \
+	CtsMonkeyApp2 \
+	CtsTestStubs \
+	SignatureTest \
+	TestDeviceSetup \
+	$(cts_security_apps_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 \
 	CtsAccessibilityServiceTestCases \
 	CtsAccountManagerTestCases \
 	CtsAdminTestCases \
@@ -39,6 +58,7 @@
 	CtsDpiTestCases \
 	CtsDpiTestCases2 \
 	CtsDrmTestCases \
+	CtsEffectTestCases \
 	CtsExampleTestCases \
 	CtsGestureTestCases \
 	CtsGraphicsTestCases \
@@ -56,36 +76,46 @@
 	CtsPermissionTestCases \
 	CtsPermission2TestCases \
 	CtsPreferenceTestCases \
+	CtsPreference2TestCases \
 	CtsProviderTestCases \
 	CtsRenderscriptTestCases \
 	CtsSaxTestCases \
 	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 706a601..0a74154 100644
--- a/development/ide/eclipse/.classpath
+++ b/development/ide/eclipse/.classpath
@@ -4,6 +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/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"/>
@@ -13,8 +18,6 @@
     <classpathentry kind="src" path="cts/tests/SignatureTest/tests/src"/>
     <classpathentry kind="src" path="cts/tests/acceleration/src"/>
     <classpathentry kind="src" path="cts/tests/accessibilityservice/src"/>
-    <classpathentry kind="src" path="cts/tests/appsecurity-tests/src"/>
-    <classpathentry kind="src" path="cts/tests/appsecurity-tests/test-apps/AppWithData/src"/>
     <classpathentry kind="src" path="cts/tests/core/runner/src"/>
     <classpathentry kind="src" path="cts/tests/deviceadmin/src"/>
     <classpathentry kind="src" path="cts/tests/src"/>
@@ -38,7 +41,9 @@
     <classpathentry kind="src" path="cts/tests/tests/jni/src"/>
     <classpathentry kind="src" path="cts/tests/tests/location/src"/>
     <classpathentry kind="src" path="cts/tests/tests/media/src"/>
+    <classpathentry kind="src" path="cts/tests/tests/mediastress/src"/>
     <classpathentry kind="src" path="cts/tests/tests/net/src"/>
+    <classpathentry kind="src" path="cts/tests/tests/openglperf/src"/>
     <classpathentry kind="src" path="cts/tests/tests/os/src"/>
     <classpathentry kind="src" path="cts/tests/tests/performance/src"/>
     <classpathentry kind="src" path="cts/tests/tests/performance2/src"/>
@@ -54,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"/>
@@ -73,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/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java
new file mode 100644
index 0000000..0bc2c10
--- /dev/null
+++ b/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java
@@ -0,0 +1,47 @@
+package com.android.cts.monkey;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.File;
+
+abstract class AbstractMonkeyTest extends DeviceTestCase implements IBuildReceiver {
+
+    static final String[] PKGS = {"com.android.cts.monkey", "com.android.cts.monkey2"};
+    static final String[] APKS = {"CtsMonkeyApp.apk", "CtsMonkeyApp2.apk"};
+
+    CtsBuildHelper mBuild;
+    ITestDevice mDevice;
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDevice = getDevice();
+        for (int i = 0; i < PKGS.length; i++) {
+            mDevice.uninstallPackage(PKGS[i]);
+            File app = mBuild.getTestApp(APKS[i]);
+            mDevice.installPackage(app, false);
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        for (int i = 0; i < PKGS.length; i++) {
+            mDevice.uninstallPackage(PKGS[i]);
+        }
+    }
+
+    void clearLogCat() throws DeviceNotAvailableException {
+        mDevice.executeAdbCommand("logcat", "-c");
+    }
+}
diff --git a/hostsidetests/monkey/src/com/android/cts/monkey/CategoryTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/CategoryTest.java
new file mode 100644
index 0000000..3932653
--- /dev/null
+++ b/hostsidetests/monkey/src/com/android/cts/monkey/CategoryTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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 com.android.cts.monkey;
+
+public class CategoryTest extends AbstractMonkeyTest {
+
+    public void testDefaultCategories() throws Exception {
+        String out = mDevice.executeShellCommand("monkey -v -p " + PKGS[0] + " 5000");
+        assertTrue(out.contains("cmp=com.android.cts.monkey/.MonkeyActivity"));
+        assertTrue(out.contains("cmp=com.android.cts.monkey/.BaboonActivity"));
+    }
+
+    public void testSingleCategory() throws Exception {
+        String out = mDevice.executeShellCommand("monkey -v -p " + PKGS[0]
+                + " -c android.intent.category.LAUNCHER 5000");
+        assertTrue(out.contains("cmp=com.android.cts.monkey/.MonkeyActivity"));
+        assertFalse(out.contains("cmp=com.android.cts.monkey/.BaboonActivity"));
+
+        out = mDevice.executeShellCommand("monkey -v -p " + PKGS[0]
+                + " -c android.intent.category.MONKEY 5000");
+        assertFalse(out.contains("cmp=com.android.cts.monkey/.MonkeyActivity"));
+        assertTrue(out.contains("cmp=com.android.cts.monkey/.BaboonActivity"));
+    }
+
+    public void testMultipleCategories() throws Exception {
+        String out = mDevice.executeShellCommand("monkey -v -p " + PKGS[0]
+                + " -c android.intent.category.LAUNCHER"
+                + " -c android.intent.category.MONKEY 5000");
+        assertTrue(out.contains("cmp=com.android.cts.monkey/.MonkeyActivity"));
+        assertTrue(out.contains("cmp=com.android.cts.monkey/.BaboonActivity"));
+    }
+}
diff --git a/hostsidetests/monkey/src/com/android/cts/monkey/MonkeyTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/MonkeyTest.java
new file mode 100644
index 0000000..2bf27ed
--- /dev/null
+++ b/hostsidetests/monkey/src/com/android/cts/monkey/MonkeyTest.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.
+ */
+
+package com.android.cts.monkey;
+
+import com.android.tradefed.device.DeviceNotAvailableException;
+
+import java.util.Scanner;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class MonkeyTest extends AbstractMonkeyTest {
+
+    private static final Pattern LOG_PATTERN =
+            Pattern.compile("I/MonkeyActivity\\([\\d ]+\\): (.*)");
+    private static final String MONKEY = "@(>.<)@";
+    private static final String HUMAN = "(^_^)";
+
+    public void testIsMonkey() throws Exception {
+        clearLogCat();
+        mDevice.executeShellCommand("monkey -p " + PKGS[0] + " 500");
+        assertIsUserAMonkey(true);
+    }
+
+    public void testNotMonkey() throws Exception {
+        clearLogCat();
+        mDevice.executeShellCommand("am start -W -a android.intent.action.MAIN "
+                + "-n com.android.cts.monkey/com.android.cts.monkey.MonkeyActivity");
+        assertIsUserAMonkey(false);
+    }
+
+    private void assertIsUserAMonkey(boolean isMonkey) throws DeviceNotAvailableException {
+        String logs = mDevice.executeAdbCommand("logcat", "-d", "MonkeyActivity:I", "*:S");
+        boolean monkeyLogsFound = false;
+        Scanner s = new Scanner(logs);
+        try {
+            while (s.hasNextLine()) {
+                String line = s.nextLine();
+                Matcher m = LOG_PATTERN.matcher(line);
+                if (m.matches()) {
+                    monkeyLogsFound = true;
+                    assertEquals(isMonkey ? MONKEY : HUMAN, m.group(1));
+                }
+            }
+            assertTrue(monkeyLogsFound);
+        } finally {
+            s.close();
+        }
+    }
+}
diff --git a/hostsidetests/monkey/src/com/android/cts/monkey/PackageTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/PackageTest.java
new file mode 100644
index 0000000..aa6106b
--- /dev/null
+++ b/hostsidetests/monkey/src/com/android/cts/monkey/PackageTest.java
@@ -0,0 +1,37 @@
+/*
+ * 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 com.android.cts.monkey;
+
+public class PackageTest extends AbstractMonkeyTest {
+
+    public void testSinglePackage() throws Exception {
+        String out = mDevice.executeShellCommand("monkey -v -p " + PKGS[0] + " 5000");
+        assertTrue(out.contains("cmp=com.android.cts.monkey/.MonkeyActivity"));
+        assertFalse(out.contains("cmp=com.android.cts.monkey2/.ChimpActivity"));
+
+        out = mDevice.executeShellCommand("monkey -v -p " + PKGS[1] + " 5000");
+        assertFalse(out.contains("cmp=com.android.cts.monkey/.MonkeyActivity"));
+        assertTrue(out.contains("cmp=com.android.cts.monkey2/.ChimpActivity"));
+    }
+
+    public void testMultiplePackages() throws Exception {
+        String out = mDevice.executeShellCommand("monkey -v -p " + PKGS[0]
+                + " -p " + PKGS[1] + " 5000");
+        assertTrue(out.contains("cmp=com.android.cts.monkey/.MonkeyActivity"));
+        assertTrue(out.contains("cmp=com.android.cts.monkey2/.ChimpActivity"));
+    }
+}
diff --git a/hostsidetests/monkey/src/com/android/cts/monkey/SeedTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/SeedTest.java
new file mode 100644
index 0000000..062fb7d
--- /dev/null
+++ b/hostsidetests/monkey/src/com/android/cts/monkey/SeedTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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 com.android.cts.monkey;
+
+import java.util.Scanner;
+
+public class SeedTest extends AbstractMonkeyTest {
+
+    public void testSeed() throws Exception {
+        String cmd1 = "monkey -s 1337 -v -p " + PKGS[0] + " 500";
+        String out1 = mDevice.executeShellCommand(cmd1);
+        String out2 = mDevice.executeShellCommand(cmd1);
+        assertOutputs(out1, out2);
+
+        String cmd2 = "monkey -s 3007 -v -p " + PKGS[0] + " 125";
+        String out3 = mDevice.executeShellCommand(cmd2);
+        String out4 = mDevice.executeShellCommand(cmd2);
+        assertOutputs(out3, out4);
+    }
+
+    private void assertOutputs(String out1, String out2) {
+        Scanner s1 = new Scanner(out1);
+        Scanner s2 = new Scanner(out2);
+        while (s1.hasNextLine()) {
+            assertTrue(s2.hasNextLine());
+
+            String line1 = s1.nextLine().trim();
+            String line2 = s2.nextLine().trim();
+
+            if (line1.startsWith("//[calendar_time") || line1.startsWith("## Network stats")) {
+                // Skip these lines since they have timestamps.
+                continue;
+            }
+
+            assertEquals(line1, line2);
+        }
+        assertFalse(s2.hasNextLine());
+    }
+}
diff --git a/hostsidetests/monkey/src/com/android/cts/monkey/VerbosityTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/VerbosityTest.java
new file mode 100644
index 0000000..2956191
--- /dev/null
+++ b/hostsidetests/monkey/src/com/android/cts/monkey/VerbosityTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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 com.android.cts.monkey;
+
+public class VerbosityTest extends AbstractMonkeyTest {
+
+    public void testVerbosity() throws Exception {
+        String v0 = mDevice.executeShellCommand("monkey -s 1337 -p " + PKGS[0] + " 500");
+        assertTrue(v0.contains("Events injected"));
+        assertFalse(v0.contains("Sending Touch"));
+        assertFalse(v0.contains("Sending Trackball"));
+        assertFalse(v0.contains("Switch"));
+        assertFalse(v0.contains("Sleeping"));
+
+        String v1 = mDevice.executeShellCommand("monkey -v -p " + PKGS[0] + " 500");
+        assertTrue(v1.contains("Events injected"));
+        assertTrue(v1.contains("Sending Touch"));
+        assertTrue(v1.contains("Sending Trackball"));
+        assertTrue(v1.contains("Switch"));
+        assertFalse(v1.contains("Sleeping"));
+
+        String v2 = mDevice.executeShellCommand("monkey -v -v -p " + PKGS[0] + " 500");
+        assertTrue(v2.contains("Events injected"));
+        assertTrue(v2.contains("Sending Touch"));
+        assertTrue(v2.contains("Sending Trackball"));
+        assertTrue(v2.contains("Switch"));
+        assertTrue(v2.contains("Sleeping"));
+
+        assertTrue(v0.length() < v1.length());
+        assertTrue(v1.length() < v2.length());
+    }
+}
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/hostsidetests/monkey/test-apps/CtsMonkeyApp/AndroidManifest.xml b/hostsidetests/monkey/test-apps/CtsMonkeyApp/AndroidManifest.xml
new file mode 100644
index 0000000..55f3d6f
--- /dev/null
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?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.monkey">
+
+    <application>
+
+        <activity android:name=".MonkeyActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        
+        <activity android:name=".BaboonActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.MONKEY" />
+            </intent-filter>
+        </activity>
+
+    </application>
+</manifest>
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/BaboonActivity.java b/hostsidetests/monkey/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/BaboonActivity.java
new file mode 100644
index 0000000..f7b8f47
--- /dev/null
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/BaboonActivity.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 com.android.cts.monkey;
+
+import android.app.Activity;
+
+public class BaboonActivity extends Activity {
+}
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/MonkeyActivity.java b/hostsidetests/monkey/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/MonkeyActivity.java
new file mode 100644
index 0000000..fd792a7
--- /dev/null
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/MonkeyActivity.java
@@ -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.
+ */
+
+package com.android.cts.monkey;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.os.Bundle;
+import android.util.Log;
+
+/** @(>.<)@  I'm a monkey! */
+public class MonkeyActivity extends Activity {
+
+    private static final String TAG = "MonkeyActivity";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, ActivityManager.isUserAMonkey() ? "@(>.<)@" : "(^_^)");
+    }
+}
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/hostsidetests/monkey/test-apps/CtsMonkeyApp2/AndroidManifest.xml b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/AndroidManifest.xml
new file mode 100644
index 0000000..34bca75
--- /dev/null
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/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.monkey2">
+
+    <application>
+
+        <activity android:name=".ChimpActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+    </application>
+</manifest>
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp2/src/com/android/cts/monkey2/ChimpActivity.java b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/src/com/android/cts/monkey2/ChimpActivity.java
new file mode 100644
index 0000000..ef9fcc3
--- /dev/null
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/src/com/android/cts/monkey2/ChimpActivity.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 com.android.cts.monkey2;
+
+import android.app.Activity;
+
+public class ChimpActivity extends Activity {
+}
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 22ba384..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" />
@@ -116,6 +117,8 @@
     <application android:label="Android TestCase"
                 android:icon="@drawable/size_48x48" android:name="android.app.cts.MockApplication">
 
+        <activity android:name="android.app.cts.ActionBarActivity" />
+
         <activity android:name="android.media.cts.AudioManagerStub"
             android:label="AudioManagerStub"/>
         <activity android:name="android.media.cts.AudioManagerStubHelper"
@@ -509,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"
@@ -652,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">
@@ -763,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"
@@ -951,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" />
@@ -974,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/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/ActionBarActivity.java b/tests/tests/app/src/android/app/cts/ActionBarActivity.java
new file mode 100644
index 0000000..11cee03
--- /dev/null
+++ b/tests/tests/app/src/android/app/cts/ActionBarActivity.java
@@ -0,0 +1,30 @@
+/*
+ * 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.app.cts;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.os.Bundle;
+
+public class ActionBarActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        ActionBar bar = getActionBar();
+        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
+    }
+}
diff --git a/tests/tests/app/src/android/app/cts/ActionBarTest.java b/tests/tests/app/src/android/app/cts/ActionBarTest.java
new file mode 100644
index 0000000..796cd74
--- /dev/null
+++ b/tests/tests/app/src/android/app/cts/ActionBarTest.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.app.cts;
+
+import android.app.ActionBar;
+import android.app.ActionBar.Tab;
+import android.app.ActionBar.TabListener;
+import android.app.FragmentTransaction;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+
+public class ActionBarTest extends ActivityInstrumentationTestCase2<ActionBarActivity> {
+
+    private ActionBarActivity mActivity;
+    private ActionBar mBar;
+
+    public ActionBarTest() {
+        super(ActionBarActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        mBar = mActivity.getActionBar();
+    }
+
+    @UiThreadTest
+    public void testAddTab() {
+        assertEquals(0, mBar.getTabCount());
+
+        Tab t1 = createTab("Tab 1");
+        mBar.addTab(t1);
+        assertEquals(1, mBar.getTabCount());
+        assertEquals(t1, mBar.getSelectedTab());
+        assertEquals(t1, mBar.getTabAt(0));
+
+        Tab t2 = createTab("Tab 2");
+        mBar.addTab(t2);
+        assertEquals(2, mBar.getTabCount());
+        assertEquals(t1, mBar.getSelectedTab());
+        assertEquals(t2, mBar.getTabAt(1));
+
+        Tab t3 = createTab("Tab 3");
+        mBar.addTab(t3, true);
+        assertEquals(3, mBar.getTabCount());
+        assertEquals(t3, mBar.getSelectedTab());
+        assertEquals(t3, mBar.getTabAt(2));
+
+        Tab t4 = createTab("Tab 2.5");
+        mBar.addTab(t4, 2);
+        assertEquals(4, mBar.getTabCount());
+        assertEquals(t4, mBar.getTabAt(2));
+        assertEquals(t3, mBar.getTabAt(3));
+
+        Tab t5 = createTab("Tab 0.5");
+        mBar.addTab(t5, 0, true);
+        assertEquals(5, mBar.getTabCount());
+        assertEquals(t5, mBar.getSelectedTab());
+        assertEquals(t5, mBar.getTabAt(0));
+        assertEquals(t1, mBar.getTabAt(1));
+        assertEquals(t2, mBar.getTabAt(2));
+        assertEquals(t4, mBar.getTabAt(3));
+        assertEquals(t3, mBar.getTabAt(4));
+    }
+
+    private Tab createTab(String name) {
+        return mBar.newTab().setText("Tab 1").setTabListener(new TestTabListener());
+    }
+
+    static class TestTabListener implements TabListener {
+        @Override
+        public void onTabSelected(Tab tab, FragmentTransaction ft) {
+        }
+
+        @Override
+        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+        }
+
+        @Override
+        public void onTabReselected(Tab tab, FragmentTransaction ft) {
+        }
+    }
+}
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
new file mode 100644
index 0000000..8fda601
--- /dev/null
+++ b/tests/tests/preference2/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_PACKAGE_NAME := CtsPreference2TestCases
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+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/preference2/AndroidManifest.xml b/tests/tests/preference2/AndroidManifest.xml
new file mode 100644
index 0000000..5043e1f
--- /dev/null
+++ b/tests/tests/preference2/AndroidManifest.xml
@@ -0,0 +1,41 @@
+<?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.preference2">
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <activity
+            android:name="android.preference2.cts.PreferenceFragmentActivity" >
+        </activity>
+        <activity
+            android:name="android.preference2.cts.PreferenceStubActivity" >
+        </activity>
+        <activity
+            android:name="android.preference2.cts.PreferenceFromCodeActivity" >
+        </activity>
+        <activity android:name="android.preference2.cts.PreferencesFromXml" />
+        <activity android:name="android.preference2.cts.PreferenceWithHeaders" />
+    </application>
+
+    <!-- This is a self-instrumenting test package. -->
+    <instrumentation android:name="android.test.InstrumentationTestRunner"
+                     android:targetPackage="com.android.cts.preference2"
+                     android:label="CTS Test Cases for android.preference"/>
+
+</manifest>
+
diff --git a/tests/tests/preference2/res/drawable-hdpi/ic_launcher.png b/tests/tests/preference2/res/drawable-hdpi/ic_launcher.png
new file mode 100755
index 0000000..8074c4c
--- /dev/null
+++ b/tests/tests/preference2/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/tests/tests/preference2/res/drawable-ldpi/ic_launcher.png b/tests/tests/preference2/res/drawable-ldpi/ic_launcher.png
new file mode 100755
index 0000000..1095584
--- /dev/null
+++ b/tests/tests/preference2/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/tests/tests/preference2/res/drawable-mdpi/ic_launcher.png b/tests/tests/preference2/res/drawable-mdpi/ic_launcher.png
new file mode 100755
index 0000000..a07c69f
--- /dev/null
+++ b/tests/tests/preference2/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/tests/tests/preference2/res/drawable-mdpi/ic_settings_applications.png b/tests/tests/preference2/res/drawable-mdpi/ic_settings_applications.png
new file mode 100755
index 0000000..745ff2a
--- /dev/null
+++ b/tests/tests/preference2/res/drawable-mdpi/ic_settings_applications.png
Binary files differ
diff --git a/tests/tests/preference2/res/drawable-mdpi/ic_settings_display.png b/tests/tests/preference2/res/drawable-mdpi/ic_settings_display.png
new file mode 100755
index 0000000..85af393
--- /dev/null
+++ b/tests/tests/preference2/res/drawable-mdpi/ic_settings_display.png
Binary files differ
diff --git a/tests/tests/preference2/res/layout/main.xml b/tests/tests/preference2/res/layout/main.xml
new file mode 100755
index 0000000..a6b7f10
--- /dev/null
+++ b/tests/tests/preference2/res/layout/main.xml
@@ -0,0 +1,26 @@
+<?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="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical" >
+
+    <TextView
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        />
+
+</LinearLayout>
diff --git a/tests/tests/preference2/res/values/arrays.xml b/tests/tests/preference2/res/values/arrays.xml
new file mode 100755
index 0000000..198d989
--- /dev/null
+++ b/tests/tests/preference2/res/values/arrays.xml
@@ -0,0 +1,149 @@
+<?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>
+    <!-- Used in View/Spinner1.java -->
+    <string-array name="colors">
+        <item>red</item>
+        <item>orange</item>
+        <item>yellow</item>
+        <item>green</item>
+        <item>blue</item>
+        <item>violet</item>
+    </string-array>
+
+    <!-- Used in View/Spinner1.java -->
+    <string-array name="planets">
+        <item>Mercury</item>
+        <item>Venus</item>
+        <item>Earth</item>
+        <item>Mars</item>
+        <item>Jupiter</item>
+        <item>Saturn</item>
+        <item>Uranus</item>
+        <item>Neptune</item>
+        <item>Pluto</item>
+    </string-array>
+
+    <!-- Used in content/ClipboardSample.java -->
+    <string-array name="clip_data_types">
+        <item>No data in clipboard</item>
+        <item>Text clip</item>
+        <item>Intent clip</item>
+        <item>Uri clip</item>
+    </string-array>
+
+    <!-- Used in App/SearchInvoke.java -->
+    <string-array name="search_menuModes">
+        <item>Search Key</item>
+        <item>Menu Item</item>
+        <item>Type-To-Search</item>
+        <item>Disabled</item>
+    </string-array>
+
+    <!-- Used in app/dialog examples -->
+    <string-array name="select_dialog_items">
+        <item>Command one</item>
+        <item>Command two</item>
+        <item>Command three</item>
+        <item>Command four</item>
+    </string-array>
+
+    <string-array name="select_dialog_items2">
+        <item>Map</item>
+        <item>Satellite</item>
+        <item>Traffic</item>
+        <item>Street view</item>
+    </string-array>
+
+    <string-array name="select_dialog_items3">
+        <item>Every Monday</item>
+        <item>Every Tuesday</item>
+        <item>Every Wednesday</item>
+        <item>Every Thursday</item>
+        <item>Every Friday</item>
+        <item>Every Saturday</item>
+        <item>Every Sunday</item>
+    </string-array>
+
+    <!-- Used in app/menu examples -->
+    <string-array name="entries_list_preference">
+        <item>Alpha Option 01</item>
+        <item>Beta Option 02</item>
+        <item>Charlie Option 03</item>
+    </string-array>
+
+    <!-- Used in app/menu examples -->
+    <string-array name="entryvalues_list_preference">
+        <item>alpha</item>
+        <item>beta</item>
+        <item>charlie</item>
+    </string-array>
+
+    <!-- Used in app/Sample Device Admin -->
+    <string-array name="password_qualities">
+        <item>Unspecified</item>
+        <item>Something</item>
+        <item>Numeric</item>
+        <item>Alphabetic</item>
+        <item>Alphanumeric</item>
+        <item>Complex</item>
+    </string-array>
+
+    <!-- Used in app/Screen Orientation -->
+    <string-array name="screen_orientations">
+        <item>UNSPECIFIED</item>
+        <item>LANDSCAPE</item>
+        <item>PORTRAIT</item>
+        <item>USER</item>
+        <item>BEHIND</item>
+        <item>SENSOR</item>
+        <item>NOSENSOR</item>
+        <item>SENSOR_LANDSCAPE</item>
+        <item>SENSOR_PORTRAIT</item>
+        <item>REVERSE_LANDSCAPE</item>
+        <item>REVERSE_PORTRAIT</item>
+        <item>FULL_SENSOR</item>
+    </string-array>
+
+    <!-- Used in view/Secure View examples -->
+    <string-array name="secure_view_clicked">
+        <item>*bzzt*\nTransferred $1,000,000 to J. Phisher.  Thank you!</item>
+        <item>*bzzt*\nSending all life savings to the International Cabal of Evil Penguins.</item>
+        <item>*bzzt*\nOpening portal to R\'lyeh.  Long live Cthulhu!</item>
+        <item>*bzzt*\nYou\'re not very good at this, are you?</item>
+        <item>*bzzt*\nGo away...</item>
+    </string-array>
+
+    <!-- Used in view/Split Touch View example -->
+    <string-array name="cheese_responses">
+        <item>I\'m afraid we\'re fresh out.</item>
+        <item>I\'m afraid we never have that at the end of the week, sir.  We get it fresh on Monday.
+        </item>
+        <item>Ah. It\'s been on order, sir, for two weeks.  I was expecting it this morning.</item>
+        <item>Normally, sir, yes.  Today the van broke down.</item>
+        <item>No.</item>
+        <item>No.</item>
+        <item>No.</item>
+        <item>Yes, sir.  It\'s, ah ..... it\'s a bit runny.</item>
+        <item>Well, it\'s very runny, actually, sir.</item>
+        <item>I think it\'s a bit runnier than you\'ll like it, sir.</item>
+        <item>Oh... The cat\'s eaten it.</item>
+        <item>No.</item>
+        <item>No.</item>
+        <item>No.</item>
+        <item>Mmm... cheese.</item>
+    </string-array>
+</resources>
diff --git a/tests/tests/preference2/res/values/attrs.xml b/tests/tests/preference2/res/values/attrs.xml
new file mode 100755
index 0000000..e80e204
--- /dev/null
+++ b/tests/tests/preference2/res/values/attrs.xml
@@ -0,0 +1,21 @@
+<?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>
+     <declare-styleable name="CustPref">
+        <attr name="icon" format="integer"/>
+        <attr name="title" format="string"/>
+    </declare-styleable>
+</resources>
diff --git a/tests/tests/preference2/res/values/colors.xml b/tests/tests/preference2/res/values/colors.xml
new file mode 100755
index 0000000..bfcd0b4
--- /dev/null
+++ b/tests/tests/preference2/res/values/colors.xml
@@ -0,0 +1,22 @@
+<?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>
+    <color name="white">#FFFFFF</color>
+    <color name="android_orange">#FF9E18</color>
+    <color name="android_yellow">#F2E406</color>
+    <color name="black">#000000</color>
+    <color name="red">#FF0000</color>
+</resources>
diff --git a/tests/tests/preference2/res/values/strings.xml b/tests/tests/preference2/res/values/strings.xml
new file mode 100755
index 0000000..d43d3eb
--- /dev/null
+++ b/tests/tests/preference2/res/values/strings.xml
@@ -0,0 +1,106 @@
+<?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="app_name">CtsPreferenceTestCases</string>
+    <string name="test_prefs">Test Preferences</string>
+
+    <string name="preferences_from_xml">Preference/1. Preferences from XML</string>
+    <string name="launching_preferences">Preference/2. Launching preferences</string>
+    <string name="preference_dependencies">Preference/3. Preference dependencies</string>
+    <string name="default_values">Preference/4. Default values</string>
+    <string name="preferences_from_code">Preference/5. Preferences from code</string>
+    <string name="advanced_preferences">Preference/6. Advanced preferences</string>
+    <string name="fragment_preferences">Preference/7. Fragment</string>
+    <string name="preference_with_headers">Preference/8. Headers</string>
+
+    <string name="launch_preference_activity">Launch PreferenceActivity</string>
+    <string name="counter_value_is">The counter value is</string>
+
+    <string name="inline_preferences">In-line preferences</string>
+    <string name="dialog_based_preferences">Dialog-based preferences</string>
+    <string name="launch_preferences">Launch preferences</string>
+    <string name="preference_attributes">Preference attributes</string>
+
+    <string name="title_checkbox_preference">Checkbox preference</string>
+    <string name="summary_checkbox_preference">This is a checkbox</string>
+    <string name="summary_on_checkbox_preference">Checkbox preference On</string>
+    <string name="summary_off_checkbox_preference">Checkbox preference Off</string>
+
+    <string name="title_switch_preference">Switch preference</string>
+    <string name="summary_switch_preference">This is a switch</string>
+    <string name="summary_on_switch_preference">Switch Summary On</string>
+    <string name="summary_off_switch_preference">Switch Summary Off</string>
+     <string name="switchtext_on">Switch Text On</string>
+    <string name="switchtext_off">Switch Text Off</string>
+
+    <string name="summary_switch_preference_yes_no">This is a switch with custom text</string>
+
+    <string name="title_yesno_preference">Yes or no preference</string>
+    <string name="summary_yesno_preference">An example that uses a yes/no dialog</string>
+    <string name="dialog_title_yesno_preference">Do you like bananas?</string>
+
+    <string name="title_edittext_preference">Edit text preference</string>
+    <string name="summary_edittext_preference">An example that uses an edit text dialog</string>
+    <string name="dialog_title_edittext_preference">Enter your favorite animal</string>
+
+    <string name="title_list_preference">List preference</string>
+    <string name="summary_list_preference">An example that uses a list dialog</string>
+    <string name="dialog_title_list_preference">Choose one</string>
+
+    <string name="title_screen_preference">Screen preference</string>
+    <string name="summary_screen_preference">Shows another screen of preferences</string>
+
+    <string name="title_fragment_preference">Fragment preference</string>
+    <string name="summary_fragment_preference">Shows another fragment of preferences</string>
+
+    <string name="title_next_screen_toggle_preference">Toggle preference</string>
+    <string name="summary_next_screen_toggle_preference">
+    Preference that is on the next screen but same hierarchy</string>
+
+    <string name="title_intent_preference">Intent preference</string>
+    <string name="summary_intent_preference">Launches an Activity from an Intent</string>
+
+    <string name="title_my_preference">My preference</string>
+    <string name="summary_my_preference">This is a custom counter preference</string>
+
+    <string name="title_advanced_toggle_preference">Haunted preference</string>
+    <string name="summary_on_advanced_toggle_preference">I\'m on! :)</string>
+    <string name="summary_off_advanced_toggle_preference">I\'m off! :(</string>
+
+    <string name="title_parent_preference">Parent checkbox preference</string>
+    <string name="summary_parent_preference">This is visually a parent</string>
+    <string name="title_child_preference">Child checkbox preference</string>
+    <string name="summary_child_preference">This is visually a child</string>
+
+    <string name="example_preference_dependency">Example preference dependency</string>
+    <string name="title_wifi">WiFi</string>
+    <string name="title_wifi_settings">WiFi settings</string>
+
+    <string name="default_value_list_preference">beta</string>
+    <string name="default_value_edittext_preference">Default value</string>
+    <string name="text_edittext_preference">Edit Text</string>
+    <string name="preset_title">Preset Title</string>
+    <string name="dialog_message">"Dialog Message"</string>
+    
+    <string name="title_dialog_preference">Dialog preference</string>
+    <string name="dialogtitle_dialog_preference">Dialog Title</string>
+    <string name="summary_dialog_preference">An example that uses a dialog</string>
+    <string name="positive_button_text">"Accept"</string>
+    <string name="negative_button_text">"Decline"</string>
+
+    <string name="cust_title_dialog_preference">Custom Dialog preference</string>
+    <string name="cust_dialogtitle_dialog_preference">Custom Dialog Title</string>
+</resources>
diff --git a/tests/tests/preference2/res/xml/fragmented_preferences.xml b/tests/tests/preference2/res/xml/fragmented_preferences.xml
new file mode 100755
index 0000000..24537b4
--- /dev/null
+++ b/tests/tests/preference2/res/xml/fragmented_preferences.xml
@@ -0,0 +1,102 @@
+<?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.
+-->
+
+<!-- This is a primitive example showing the different types of preferences available. -->
+<PreferenceScreen
+        xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <PreferenceCategory
+            android:title="@string/inline_preferences">
+
+        <CheckBoxPreference
+                android:key="checkbox_preference"
+                android:title="@string/title_checkbox_preference"
+                android:summary="@string/summary_checkbox_preference" />
+
+        <SwitchPreference
+                android:key="checkbox_preference"
+                android:title="@string/title_switch_preference"
+                android:summary="@string/summary_switch_preference" />
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+            android:title="@string/dialog_based_preferences">
+
+        <EditTextPreference
+                android:key="edittext_preference"
+                android:title="@string/title_edittext_preference"
+                android:summary="@string/summary_edittext_preference"
+                android:dialogTitle="@string/dialog_title_edittext_preference" />
+
+        <ListPreference
+                android:key="list_preference"
+                android:title="@string/title_list_preference"
+                android:summary="@string/summary_list_preference"
+                android:entries="@array/entries_list_preference"
+                android:entryValues="@array/entryvalues_list_preference"
+                android:dialogTitle="@string/dialog_title_list_preference" />
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+            android:title="@string/launch_preferences">
+
+        <!-- This PreferenceScreen tag sends the user to a new fragment of
+             preferences.  If running in a large screen, they can be embedded
+             inside of the overall preferences UI. -->
+        <PreferenceScreen
+                android:fragment="
+                    com.example.android.apis.preference.PreferenceWithHeaders$Prefs1FragmentInner"
+                android:title="@string/title_fragment_preference"
+                android:summary="@string/summary_fragment_preference">
+            <!-- Arbitrary key/value pairs can be included for fragment arguments -->
+            <extra android:name="someKey" android:value="somePrefValue" />
+        </PreferenceScreen>
+
+        <!-- This PreferenceScreen tag sends the user to a completely different
+             activity, switching out of the current preferences UI. -->
+        <PreferenceScreen
+                android:title="@string/title_intent_preference"
+                android:summary="@string/summary_intent_preference">
+
+            <intent android:action="android.intent.action.VIEW"
+                    android:data="http://www.android.com" />
+
+        </PreferenceScreen>
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+            android:title="@string/preference_attributes">
+
+        <CheckBoxPreference
+                android:key="parent_checkbox_preference"
+                android:title="@string/title_parent_preference"
+                android:summary="@string/summary_parent_preference" />
+
+        <!-- The visual style of a child is defined by this styled theme attribute. -->
+        <CheckBoxPreference
+                android:key="child_checkbox_preference"
+                android:dependency="parent_checkbox_preference"
+                android:layout="?android:attr/preferenceLayoutChild"
+                android:title="@string/title_child_preference"
+                android:summary="@string/summary_child_preference" />
+
+    </PreferenceCategory>
+
+</PreferenceScreen>
+
diff --git a/tests/tests/preference2/res/xml/fragmented_preferences_inner.xml b/tests/tests/preference2/res/xml/fragmented_preferences_inner.xml
new file mode 100755
index 0000000..fe235db
--- /dev/null
+++ b/tests/tests/preference2/res/xml/fragmented_preferences_inner.xml
@@ -0,0 +1,24 @@
+<?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.
+-->
+
+<PreferenceScreen
+        xmlns:android="http://schemas.android.com/apk/res/android">
+    <CheckBoxPreference
+            android:key="next_screen_checkbox_preference"
+            android:title="@string/title_next_screen_toggle_preference"
+            android:summary="@string/summary_next_screen_toggle_preference" />
+</PreferenceScreen>
+
diff --git a/tests/tests/preference2/res/xml/pref_cb.xml b/tests/tests/preference2/res/xml/pref_cb.xml
new file mode 100755
index 0000000..b5f77b9
--- /dev/null
+++ b/tests/tests/preference2/res/xml/pref_cb.xml
@@ -0,0 +1,58 @@
+<?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.
+-->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:in="http://schemas.android.com/apk/res/com.android.cts.preference2" >
+
+    <PreferenceCategory android:title="@string/inline_preferences" >
+        <android.preference2.cts.CustomCheckBoxPreference
+            android:id="@+id/custom_check"
+            style="?android:attr/buttonStyleSmall"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="25dp"
+            android:key="custom_checkbox_pref_1"
+            in:icon="@drawable/ic_launcher"
+            in:title="@string/preset_title" />
+        <android.preference2.cts.CustomSwitchPreference
+            android:id="@+id/custom_switch"
+            style="?android:attr/buttonStyleSmall"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="25dp"
+            android:key="custom_switch_pref_1"
+            in:icon="@drawable/ic_launcher"
+            in:title="@string/preset_title" />
+
+         <android.preference2.cts.CustomDialogPreference
+            android:id="@+id/custom_switch"
+            style="?android:attr/buttonStyleSmall"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="25dp"
+            android:key="custom_dialog_pref_1"
+            in:icon="@drawable/ic_launcher"
+            in:title="@string/preset_title" />
+
+         <android.preference2.cts.CustomEditTextPreference
+            android:id="@+id/custom_switch"
+            style="?android:attr/buttonStyleSmall"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="25dp"
+            android:key="custom_edittext_pref_1"
+            in:icon="@drawable/ic_launcher"
+            in:title="@string/preset_title" />
+    </PreferenceCategory>
+</PreferenceScreen>
diff --git a/tests/tests/preference2/res/xml/preference_dependencies.xml b/tests/tests/preference2/res/xml/preference_dependencies.xml
new file mode 100755
index 0000000..405cad6
--- /dev/null
+++ b/tests/tests/preference2/res/xml/preference_dependencies.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.
+-->
+<PreferenceScreen
+        xmlns:android="http://schemas.android.com/apk/res/android">
+    <PreferenceCategory
+            android:title="@string/example_preference_dependency">
+        <CheckBoxPreference
+                android:key="wifi"
+                android:title="@string/title_wifi" />
+        <EditTextPreference
+                android:layout="?android:attr/preferenceLayoutChild"
+                android:title="@string/title_wifi_settings"
+                android:dependency="wifi" />
+    </PreferenceCategory>
+</PreferenceScreen>
diff --git a/tests/tests/preference2/res/xml/preference_headers.xml b/tests/tests/preference2/res/xml/preference_headers.xml
new file mode 100755
index 0000000..45ee629
--- /dev/null
+++ b/tests/tests/preference2/res/xml/preference_headers.xml
@@ -0,0 +1,42 @@
+<?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.
+-->
+<preference-headers
+        xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <header android:fragment=
+        "com.example.android.apis.preference.PreferenceWithHeaders$Prefs1Fragment"
+            android:icon="@drawable/ic_settings_applications"
+            android:title="Prefs 1"
+            android:summary="An example of some preferences." />
+
+    <header android:fragment=
+        "com.example.android.apis.preference.PreferenceWithHeaders$Prefs2Fragment"
+            android:icon="@drawable/ic_settings_display"
+            android:title="Prefs 2"
+            android:summary="Some other preferences you can see.">
+        <!-- Arbitrary key/value pairs can be included with a header as
+             arguments to its fragment. -->
+        <extra android:name="someKey" android:value="someHeaderValue" />
+    </header>
+
+    <header android:icon="@drawable/ic_settings_display"
+            android:title="Intent"
+            android:summary="Launches an Intent.">
+        <intent android:action="android.intent.action.VIEW"
+                android:data="http://www.android.com" />
+    </header>
+
+</preference-headers>
diff --git a/tests/tests/preference2/res/xml/preferences.xml b/tests/tests/preference2/res/xml/preferences.xml
new file mode 100755
index 0000000..fa35107
--- /dev/null
+++ b/tests/tests/preference2/res/xml/preferences.xml
@@ -0,0 +1,110 @@
+<?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.
+-->
+
+<!-- This is a primitive example showing the different types of preferences available. -->
+
+<PreferenceScreen
+        xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <PreferenceCategory
+            android:title="@string/inline_preferences">
+ 
+        <CheckBoxPreference android:id="@+id/checkbox1"
+                android:key="checkbox_preference"
+                android:title="@string/title_checkbox_preference"
+                android:summary="@string/summary_checkbox_preference" />
+
+        <SwitchPreference
+                android:key="checkbox_preference"
+                android:title="@string/title_switch_preference"
+                android:summary="@string/summary_switch_preference" />
+
+        <SwitchPreference
+                android:key="checkbox_preference"
+                android:title="@string/title_switch_preference"
+                android:summary="@string/summary_switch_preference_yes_no"
+                android:switchTextOn = "YES"
+                android:switchTextOff = "NO" />
+    </PreferenceCategory>
+
+    <PreferenceCategory
+            android:title="@string/dialog_based_preferences">
+
+        <EditTextPreference
+                android:key="edittext_preference"
+                android:title="@string/title_edittext_preference"
+                android:summary="@string/summary_edittext_preference"
+                android:dialogTitle="@string/dialog_title_edittext_preference" />
+        <ListPreference
+                android:key="list_preference"
+                android:title="@string/title_list_preference"
+                android:summary="@string/summary_list_preference"
+                android:entries="@array/entries_list_preference"
+                android:entryValues="@array/entryvalues_list_preference"
+                android:dialogTitle="@string/dialog_title_list_preference" />
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+            android:title="@string/launch_preferences">
+
+        <!-- This PreferenceScreen tag serves as a screen break (similar to page break
+             in word processing). Like for other preference types, we assign a key
+             here so it is able to save and restore its instance state. -->
+        <PreferenceScreen
+                android:key="screen_preference"
+                android:title="@string/title_screen_preference"
+                android:summary="@string/summary_screen_preference">
+
+            <!-- You can place more preferences here that will be shown on the next screen. -->
+
+            <CheckBoxPreference
+                    android:key="next_screen_checkbox_preference"
+                    android:title="@string/title_next_screen_toggle_preference"
+                    android:summary="@string/summary_next_screen_toggle_preference" />
+
+        </PreferenceScreen>
+
+        <PreferenceScreen
+                android:title="@string/title_intent_preference"
+                android:summary="@string/summary_intent_preference">
+
+            <intent android:action="android.intent.action.VIEW"
+                    android:data="http://www.android.com" />
+
+        </PreferenceScreen>
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+            android:title="@string/preference_attributes">
+
+        <CheckBoxPreference
+                android:key="parent_checkbox_preference"
+                android:title="@string/title_parent_preference"
+                android:summary="@string/summary_parent_preference" />
+
+        <!-- The visual style of a child is defined by this styled theme attribute. -->
+        <CheckBoxPreference
+                android:key="child_checkbox_preference"
+                android:dependency="parent_checkbox_preference"
+                android:layout="?android:attr/preferenceLayoutChild"
+                android:title="@string/title_child_preference"
+                android:summary="@string/summary_child_preference" />
+    </PreferenceCategory>
+
+</PreferenceScreen>
+
diff --git a/tests/tests/preference2/src/android/preference2/cts/CheckBoxPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/CheckBoxPreferenceTest.java
new file mode 100755
index 0000000..de129e0
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/CheckBoxPreferenceTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.preference2.cts;
+
+import android.preference.CheckBoxPreference;
+import android.test.ActivityInstrumentationTestCase2;
+
+import com.android.cts.preference2.R;
+
+public class CheckBoxPreferenceTest
+        extends ActivityInstrumentationTestCase2<PreferenceFromCodeActivity> {
+
+    private PreferenceFromCodeActivity mActivity;
+
+    public CheckBoxPreferenceTest() {
+        super(PreferenceFromCodeActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+    }
+
+    public void testNotNull() {
+        CheckBoxPreference checkBoxPref = (CheckBoxPreference) mActivity.findPreference(
+                    "checkbox_preference");
+        assertNotNull(checkBoxPref);
+    }
+
+    public void testGetSummary() {
+        CheckBoxPreference checkBoxPref = (CheckBoxPreference) mActivity.findPreference(
+                    "checkbox_preference");
+        String summary = (String) checkBoxPref.getSummary();
+        String summaryExp = mActivity.getResources().getString(
+            R.string.summary_checkbox_preference);
+        assertEquals(summaryExp, summary);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomCheckBoxPreference.java b/tests/tests/preference2/src/android/preference2/cts/CustomCheckBoxPreference.java
new file mode 100755
index 0000000..d51eddd
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/CustomCheckBoxPreference.java
@@ -0,0 +1,52 @@
+/*
+ * 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.preference2.cts;
+
+import com.android.cts.preference2.R;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.preference.CheckBoxPreference;
+import android.util.AttributeSet;
+
+public class CustomCheckBoxPreference extends CheckBoxPreference {
+    private Drawable mIcon;
+    private String mTitle;
+    public CustomCheckBoxPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(attrs);
+        setIcon(mIcon);
+        this.setTitle(mTitle);
+    }
+
+    public CustomCheckBoxPreference(Context context) {
+        super(context);
+    }
+
+    public CustomCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init(attrs);
+        setIcon(mIcon);
+        this.setTitle(mTitle);
+    }
+
+    private void init(AttributeSet attrs) {
+        TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.CustPref);
+        mTitle = a.getString(R.styleable.CustPref_title);
+        mIcon = a.getDrawable(R.styleable.CustPref_icon);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomCheckBoxPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/CustomCheckBoxPreferenceTest.java
new file mode 100755
index 0000000..25ba3f3
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/CustomCheckBoxPreferenceTest.java
@@ -0,0 +1,44 @@
+ /*
+ * 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.preference2.cts;
+
+import android.preference.CheckBoxPreference;
+import android.test.ActivityInstrumentationTestCase2;
+
+public class CustomCheckBoxPreferenceTest
+        extends ActivityInstrumentationTestCase2<PreferencesFromXml> {
+
+    private PreferencesFromXml mActivity;
+    private CheckBoxPreference mCheckBoxPref;
+
+    public CustomCheckBoxPreferenceTest() {
+        super(PreferencesFromXml.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        mCheckBoxPref = (CheckBoxPreference) mActivity.findPreference(
+                "custom_checkbox_pref_1");
+    }
+
+    public void testNotNull() {
+        assertNotNull(mCheckBoxPref);
+    }
+
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomDialogPreference.java b/tests/tests/preference2/src/android/preference2/cts/CustomDialogPreference.java
new file mode 100755
index 0000000..db584ac
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/CustomDialogPreference.java
@@ -0,0 +1,48 @@
+/*
+ * 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.preference2.cts;
+
+import com.android.cts.preference2.R;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.preference.DialogPreference;
+import android.util.AttributeSet;
+
+public class CustomDialogPreference extends DialogPreference {
+    private Drawable mIcon;
+    private String mTitle;
+    public CustomDialogPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(attrs);
+        setIcon(mIcon);
+        this.setTitle(mTitle);
+    }
+
+    public CustomDialogPreference(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init(attrs);
+        setIcon(mIcon);
+        this.setTitle(mTitle);
+    }
+
+    private void init(AttributeSet attrs) {
+        TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.CustPref);
+        mTitle = a.getString(R.styleable.CustPref_title);
+        mIcon = a.getDrawable(R.styleable.CustPref_icon);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomDialogPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/CustomDialogPreferenceTest.java
new file mode 100755
index 0000000..5384420
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/CustomDialogPreferenceTest.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.preference2.cts;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+public class CustomDialogPreferenceTest
+        extends ActivityInstrumentationTestCase2<PreferencesFromXml> {
+
+    private PreferencesFromXml mActivity;
+    private CustomDialogPreference mDialogPref;
+
+    public CustomDialogPreferenceTest() {
+        super(PreferencesFromXml.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        mDialogPref = (CustomDialogPreference) mActivity.findPreference(
+               "custom_dialog_pref_1");
+    }
+
+    public void testNotNull() {
+        assertNotNull(mDialogPref);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomEditTextPreference.java b/tests/tests/preference2/src/android/preference2/cts/CustomEditTextPreference.java
new file mode 100755
index 0000000..51fdf13
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/CustomEditTextPreference.java
@@ -0,0 +1,52 @@
+/*
+ * 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.preference2.cts;
+
+import com.android.cts.preference2.R;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.preference.EditTextPreference;
+import android.util.AttributeSet;
+
+public class CustomEditTextPreference extends EditTextPreference {
+    private Drawable mIcon;
+    private String mTitle;
+    public CustomEditTextPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(attrs);
+        setIcon(mIcon);
+        this.setTitle(mTitle);
+    }
+
+    public CustomEditTextPreference(Context context) {
+        super(context);
+    }
+
+    public CustomEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init(attrs);
+        setIcon(mIcon);
+        this.setTitle(mTitle);
+    }
+
+    private void init(AttributeSet attrs) {
+        TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.CustPref);
+        mTitle =a.getString(R.styleable.CustPref_title);
+        mIcon  = a.getDrawable(R.styleable.CustPref_icon);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomEditTextPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/CustomEditTextPreferenceTest.java
new file mode 100755
index 0000000..c131539
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/CustomEditTextPreferenceTest.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.preference2.cts;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+public class CustomEditTextPreferenceTest
+        extends ActivityInstrumentationTestCase2<PreferencesFromXml> {
+
+    private PreferencesFromXml mActivity;
+    private CustomEditTextPreference mEditTextPref;
+
+    public CustomEditTextPreferenceTest() {
+        super(PreferencesFromXml.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = (PreferencesFromXml)getActivity();
+        mEditTextPref = (CustomEditTextPreference) mActivity.findPreference(
+                "custom_edittext_pref_1");
+    }
+
+    public void testNotNull() {
+        assertNotNull(mEditTextPref);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomSwitchPreference.java b/tests/tests/preference2/src/android/preference2/cts/CustomSwitchPreference.java
new file mode 100755
index 0000000..54e7861
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/CustomSwitchPreference.java
@@ -0,0 +1,53 @@
+/*
+ * 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.preference2.cts;
+
+
+import com.android.cts.preference2.R;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.preference.SwitchPreference;
+import android.util.AttributeSet;
+
+public class CustomSwitchPreference extends SwitchPreference {
+    private Drawable mIcon;
+    private String mTitle;
+    public CustomSwitchPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(attrs);
+        setIcon(mIcon);
+        this.setTitle(mTitle);
+    }
+
+    public CustomSwitchPreference(Context context) {
+        super(context);
+    }
+
+    public CustomSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init(attrs);
+        setIcon(mIcon);
+        this.setTitle(mTitle);
+    }
+    
+    private void init(AttributeSet attrs) {
+        TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.CustPref);
+        mTitle =a.getString(R.styleable.CustPref_title);
+        mIcon  = a.getDrawable(R.styleable.CustPref_icon);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomSwitchPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/CustomSwitchPreferenceTest.java
new file mode 100755
index 0000000..937e48f
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/CustomSwitchPreferenceTest.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.preference2.cts;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+public class CustomSwitchPreferenceTest
+        extends ActivityInstrumentationTestCase2<PreferencesFromXml> {
+
+    private PreferencesFromXml mActivity;
+    private CustomSwitchPreference mSwitchPref;
+
+    public CustomSwitchPreferenceTest() {
+        super(PreferencesFromXml.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        mSwitchPref = (CustomSwitchPreference) mActivity.findPreference(
+                "custom_switch_pref_1");
+    }
+
+    public void testNotNull() {
+        assertNotNull(mSwitchPref);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/DialogPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/DialogPreferenceTest.java
new file mode 100755
index 0000000..1136cee
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/DialogPreferenceTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.preference2.cts;
+
+import android.graphics.drawable.Drawable;
+import android.preference.DialogPreference;
+import android.test.ActivityInstrumentationTestCase2;
+
+import com.android.cts.preference2.R;
+
+public class DialogPreferenceTest
+        extends ActivityInstrumentationTestCase2<PreferenceFromCodeActivity> {
+
+    private PreferenceFromCodeActivity mActivity;
+    private DialogPreference mDialogPreference;
+
+    public DialogPreferenceTest() {
+        super(PreferenceFromCodeActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        mDialogPreference = (DialogPreference)mActivity.findPreference(
+                "dialog_preference");
+    }
+
+    public void testGetTitle() {
+        String title = (String) mDialogPreference.getTitle();
+        String titleExp = mActivity.getResources().getString(R.string.title_dialog_preference);
+        assertEquals(titleExp, title);
+    }
+
+    public void testGetDialogTitle() {
+        String title = (String) mDialogPreference.getDialogTitle();
+        String titleExp = mActivity.getResources().getString(
+                R.string.dialogtitle_dialog_preference);
+        assertEquals(titleExp, title);
+    }
+
+    public void testGetDialogIcon() {
+        Drawable drawable = mDialogPreference.getDialogIcon();
+        Drawable drawableExp = mActivity.getResources().getDrawable(R.drawable.ic_launcher);
+        assertEquals(drawableExp.getBounds(), drawable.getBounds());
+    }
+
+    public void testGetDialogMessage() {
+        CharSequence dialogMessage = mDialogPreference.getDialogMessage();
+        CharSequence dialogMessageExp =  mActivity.getResources().getString(
+                R.string.dialog_message);
+        assertEquals(dialogMessageExp, dialogMessage);
+    }
+
+    public void testGetPositiveButtonText() {
+        CharSequence positiveButtonText = mDialogPreference.getPositiveButtonText();
+        CharSequence postiveButtonTextExp =  mActivity.getResources().getString(
+                R.string.positive_button_text);
+        assertEquals(positiveButtonText, postiveButtonTextExp);
+    }
+
+    public void testGetNegativeButtonText() {
+        CharSequence negativeButtonText = mDialogPreference.getNegativeButtonText();
+        CharSequence negativeButtonTextExp =  mActivity.getResources().getString(
+                R.string.negative_button_text);
+        assertEquals(negativeButtonText, negativeButtonTextExp);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/EditTextPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/EditTextPreferenceTest.java
new file mode 100755
index 0000000..e0d5c8c
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/EditTextPreferenceTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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.preference2.cts;
+
+import android.preference.EditTextPreference;
+import android.test.ActivityInstrumentationTestCase2;
+import android.widget.EditText;
+
+public class EditTextPreferenceTest
+        extends ActivityInstrumentationTestCase2<PreferenceFromCodeActivity> {
+
+    private PreferenceFromCodeActivity mActivity;
+    private EditTextPreference mEditTextPref;
+
+    public EditTextPreferenceTest() {
+        super(PreferenceFromCodeActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        mEditTextPref = (EditTextPreference) mActivity.findPreference(
+                "edittext_preference");
+    }
+
+    public void testGetEditText() {
+        EditText editText = mEditTextPref.getEditText();
+        assertNotNull(editText);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/ListPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/ListPreferenceTest.java
new file mode 100755
index 0000000..32596ff
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/ListPreferenceTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.preference2.cts;
+
+import android.preference.ListPreference;
+import android.test.ActivityInstrumentationTestCase2;
+
+import com.android.cts.preference2.R;
+
+public class ListPreferenceTest
+        extends ActivityInstrumentationTestCase2<PreferenceFromCodeActivity> {
+
+    private PreferenceFromCodeActivity mActivity;
+    private ListPreference mListPref;
+
+    public ListPreferenceTest() {
+        super(PreferenceFromCodeActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        mListPref = (ListPreference) mActivity.findPreference("list_preference");
+    }
+
+    public void testGetEntries() {
+        String[] entries = convertToStringArray((CharSequence[]) mListPref.getEntries());
+        String[] entriesExp = mActivity.getResources().getStringArray(
+                R.array.entries_list_preference);
+        compareArrays(entriesExp, entries);
+    }
+
+    public void testGetEntryValues() {
+        String[] entryValues = convertToStringArray((CharSequence[]) mListPref.getEntryValues());
+        String[] entryValuesExp = mActivity.getResources().getStringArray(
+                R.array.entryvalues_list_preference);
+        compareArrays(entryValuesExp,entryValues);
+    }
+
+    public void testIsEnabled() {
+        boolean isEnabled = mListPref.isEnabled();
+        assertTrue(isEnabled);
+    }
+
+    private synchronized String[] convertToStringArray(CharSequence[] array){
+        String[] strArray = new String[array.length];
+        for(int i = 0; i < array.length; i++){
+            strArray[i] = (String) array[i];
+        }
+        return strArray;
+    }
+
+    private void compareArrays(String[] firstArray,String[] secArray){
+        assertEquals(firstArray.length, secArray.length);
+        for(int i = 0; i < firstArray.length; i++) {
+            assertEquals(firstArray[i], secArray[i]);
+        }
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceCategoryTest.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceCategoryTest.java
new file mode 100755
index 0000000..33adceb
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/PreferenceCategoryTest.java
@@ -0,0 +1,43 @@
+/*
+ * 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.preference2.cts;
+
+import android.preference.Preference;
+import android.test.ActivityInstrumentationTestCase2;
+
+public class PreferenceCategoryTest
+        extends ActivityInstrumentationTestCase2<PreferenceFromCodeActivity> {
+
+    private PreferenceFromCodeActivity mActivity;
+
+    public PreferenceCategoryTest() {
+        super(PreferenceFromCodeActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+    }
+
+    public void testPreferenceCategory() {
+         Preference prefCat = mActivity.findPreference("pref-1");
+         assertNotNull(prefCat);
+         assertTrue(!prefCat.isEnabled());
+
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceFragmentActivity.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceFragmentActivity.java
new file mode 100755
index 0000000..4f12d17
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/PreferenceFragmentActivity.java
@@ -0,0 +1,48 @@
+/*
+ * 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.preference2.cts;
+
+import android.app.Activity;
+import android.app.FragmentTransaction;
+import android.os.Bundle;
+import android.preference.PreferenceFragment;
+
+/**
+ * Demonstration of PreferenceFragment, showing a single fragment in an
+ * activity.
+ */
+public class PreferenceFragmentActivity extends Activity {
+
+    public PrefFragment prefFragment;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        prefFragment = new PrefFragment();
+
+        FragmentTransaction transaction = getFragmentManager().beginTransaction()
+                .replace(android.R.id.content, prefFragment, PrefFragment.TAG);
+        transaction.commit();
+    }
+
+    public class PrefFragment extends PreferenceFragment {
+        public static final String TAG = "Pref-1";
+
+        public PrefFragment() {
+
+        }
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceFragmentTest.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceFragmentTest.java
new file mode 100755
index 0000000..4c883c2
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/PreferenceFragmentTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.preference2.cts;
+
+import android.preference.PreferenceManager;
+import android.preference.PreferenceScreen;
+import android.preference2.cts.PreferenceFragmentActivity.PrefFragment;
+import android.test.ActivityInstrumentationTestCase2;
+
+public class PreferenceFragmentTest
+        extends ActivityInstrumentationTestCase2<PreferenceFragmentActivity> {
+
+    private PreferenceFragmentActivity mActivity;
+
+    public PreferenceFragmentTest() {
+        super(PreferenceFragmentActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+    }
+
+    public void testGetPreferenceManager() {
+        PrefFragment prefFragment =  (PrefFragment) mActivity.getFragmentManager().
+                findFragmentByTag(PrefFragment.TAG);
+        PreferenceManager prefManager = prefFragment.getPreferenceManager();
+        assertNotNull(prefManager);
+    }
+
+    public void testGetPreferenceScreen() {
+        PrefFragment prefsFragment = (PrefFragment) mActivity.getFragmentManager().
+            findFragmentByTag(PrefFragment.TAG);
+        PreferenceScreen prefScreen = prefsFragment.getPreferenceScreen();
+        assertNull(prefScreen);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceFromCodeActivity.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceFromCodeActivity.java
new file mode 100755
index 0000000..ee0dde1
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/PreferenceFromCodeActivity.java
@@ -0,0 +1,114 @@
+/*
+ * 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.preference2.cts;
+
+import com.android.cts.preference2.R;
+
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.EditTextPreference;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceScreen;
+import android.preference.SwitchPreference;
+
+public class PreferenceFromCodeActivity extends PreferenceActivity {
+    private Preference mPref;
+    protected PreferenceScreen mPrefScreen;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mPrefScreen = getPreferenceManager().createPreferenceScreen(this);
+        addPreferenceCategory();
+        setPreferenceScreen(mPrefScreen);
+    }
+
+    private void addPreferenceCategory() {
+        PreferenceCategory prefCat = new PreferenceCategory(this);
+        prefCat.setTitle(R.string.inline_preferences);
+        prefCat.setKey("pref-1");
+        mPrefScreen.addPreference(prefCat);
+
+        //CheckBox Preference
+        CheckBoxPreference checkboxPref = new CheckBoxPreference(this);
+        checkboxPref.setKey("checkbox_preference");
+        checkboxPref.setTitle(R.string.title_checkbox_preference);
+        checkboxPref.setSummary(R.string.summary_checkbox_preference);
+        checkboxPref.setSummaryOn(R.string.summary_on_checkbox_preference);
+        checkboxPref.setSummaryOff(R.string.summary_off_checkbox_preference);
+        checkboxPref.setChecked(true);
+        checkboxPref.shouldDisableDependents();
+        prefCat.addPreference(checkboxPref);
+
+        // Switch preference
+        SwitchPreference switchPref = new SwitchPreference(this);
+        switchPref.setKey("switch_preference");
+        switchPref.setTitle(R.string.title_switch_preference);
+        switchPref.setSummary(R.string.summary_switch_preference);
+        switchPref.setSummaryOn(R.string.summary_on_switch_preference);
+        switchPref.setSummaryOff(R.string.summary_off_switch_preference);
+        switchPref.setSwitchTextOff(R.string.switchtext_off);
+        switchPref.setSwitchTextOn(R.string.switchtext_on);
+        prefCat.addPreference(switchPref);
+
+        SwitchPreference switchPref2 = new SwitchPreference(this);
+        switchPref2.setKey("switch_preference_2");
+        switchPref2.setTitle(R.string.title_switch_preference);
+        switchPref2.setSummary(R.string.summary_switch_preference);
+        switchPref2.setSummaryOn(R.string.summary_on_switch_preference);
+        switchPref2.setSummaryOff(R.string.summary_off_switch_preference);
+        prefCat.addPreference(switchPref2);
+
+        // Dialog based preferences
+        PreferenceCategory dialogBasedPrefCat = new PreferenceCategory(this);
+        dialogBasedPrefCat.setTitle(R.string.dialog_based_preferences);
+        mPrefScreen.addPreference(dialogBasedPrefCat);
+
+        // Edit text preference
+        EditTextPreference editTextPref = new EditTextPreference(this);
+        editTextPref.setDialogTitle(R.string.dialog_title_edittext_preference);
+        editTextPref.setKey("edittext_preference");
+        editTextPref.setTitle(R.string.title_edittext_preference);
+        editTextPref.setSummary(R.string.summary_edittext_preference);
+        editTextPref.setText(getResources().getString(R.string.text_edittext_preference));
+        dialogBasedPrefCat.addPreference(editTextPref);
+
+        EditTextPreference dialogPref = new EditTextPreference(this);
+        dialogPref.setDialogTitle(R.string.dialogtitle_dialog_preference);
+        dialogPref.setKey("dialog_preference");
+        dialogPref.setTitle(R.string.title_dialog_preference);
+        dialogPref.setSummary(R.string.summary_dialog_preference);
+        dialogPref.setDialogIcon(R.drawable.ic_launcher);
+        dialogPref.setDialogMessage(R.string.dialog_message);
+        dialogPref.setNegativeButtonText(R.string.negative_button_text);
+        dialogPref.setPositiveButtonText(R.string.positive_button_text);
+
+        dialogBasedPrefCat.addPreference(dialogPref);
+
+        ListPreference listPref = new ListPreference(this);
+        listPref.setEntries(R.array.entries_list_preference);
+        listPref.setEntryValues(R.array.entryvalues_list_preference);
+        listPref.setDialogTitle(R.string.dialog_title_list_preference);
+        listPref.setKey("list_preference");
+        listPref.setTitle(R.string.title_list_preference);
+        listPref.setSummary(R.string.summary_list_preference);
+        dialogBasedPrefCat.addPreference(listPref);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeaders.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeaders.java
new file mode 100755
index 0000000..7a23daf
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeaders.java
@@ -0,0 +1,50 @@
+/*
+ * 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.preference2.cts;
+
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+import android.widget.Button;
+import com.android.cts.preference2.R;
+import java.util.List;
+
+/**
+ * Demonstration of PreferenceActivity to make a top-level preference
+ * panel with headers.
+ */
+
+public class PreferenceWithHeaders extends PreferenceActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState); 
+        // Add a button to the header list.
+        if (hasHeaders()) {
+            Button button = new Button(this);
+            button.setText("Some action");
+            setListFooter(button);
+        }
+    }
+
+    /**
+     * Populate the activity with the top-level headers.
+     */
+    @Override
+    public void onBuildHeaders(List<Header> target) {
+        loadHeadersFromResource(R.xml.preference_headers, target);
+    }
+}
+
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeadersTest.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeadersTest.java
new file mode 100755
index 0000000..5b78369
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeadersTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.preference2.cts;
+
+import com.android.cts.preference2.R;
+
+import android.os.Bundle;
+import android.preference.PreferenceFragment;
+import android.test.ActivityInstrumentationTestCase2;
+
+public class PreferenceWithHeadersTest
+        extends ActivityInstrumentationTestCase2<PreferenceWithHeaders> {
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+    }
+
+    private PreferenceWithHeaders mActivity;
+
+    public PreferenceWithHeadersTest() {
+        super(PreferenceWithHeaders.class);
+    }
+
+    public void testHasHeaders() {
+        assertTrue(mActivity.hasHeaders());
+    }
+
+    public void testOnIsHidingHeaders() {
+        assertFalse(mActivity.onIsHidingHeaders());
+    }
+
+    public class PrefsOneFragment extends PreferenceFragment {
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            addPreferencesFromResource(R.xml.preferences);
+        }
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferencesFromXml.java b/tests/tests/preference2/src/android/preference2/cts/PreferencesFromXml.java
new file mode 100755
index 0000000..0a61461
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/PreferencesFromXml.java
@@ -0,0 +1,30 @@
+/*
+ * 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.preference2.cts;
+
+import com.android.cts.preference2.R;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+
+public class PreferencesFromXml extends PreferenceActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        addPreferencesFromResource(R.xml.pref_cb);
+    }
+}
diff --git a/tests/tests/preference2/src/android/preference2/cts/SwitchPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/SwitchPreferenceTest.java
new file mode 100755
index 0000000..3bd42d2
--- /dev/null
+++ b/tests/tests/preference2/src/android/preference2/cts/SwitchPreferenceTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.preference2.cts;
+
+import 	android.content.res.Resources;
+import android.preference.SwitchPreference;
+import android.test.ActivityInstrumentationTestCase2;
+
+import com.android.cts.preference2.R;
+
+public class SwitchPreferenceTest
+        extends ActivityInstrumentationTestCase2<PreferenceFromCodeActivity> {
+
+    private PreferenceFromCodeActivity mActivity;
+    private SwitchPreference mSwitchPref;
+    private Resources mResources;
+
+    public SwitchPreferenceTest() {
+        super(PreferenceFromCodeActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        mSwitchPref = (SwitchPreference) mActivity.findPreference(
+                "switch_preference");
+        mResources = mActivity.getResources();
+    }
+
+    public void testGetTitle() {
+        String title = (String) mSwitchPref.getTitle();
+        String titleExp = mResources.getString(R.string.title_switch_preference);
+        assertEquals(titleExp, title);
+    }
+
+    public void testGetSummary() {
+        String summary = (String) mSwitchPref.getSummary();
+        String summaryExp = mResources.getString(R.string.summary_switch_preference);  
+        assertEquals(summaryExp, summary);
+    }
+
+    public void testGetSummaryOn() {
+        String summaryOn = (String) mSwitchPref.getSummaryOn();
+        String summaryOnExp = mResources.getString(
+                R.string.summary_on_switch_preference);
+        assertEquals(summaryOnExp, summaryOn);
+    }
+
+    public void testSummaryOff() {
+        String summaryOff = (String) mSwitchPref.getSummaryOff();
+        String summaryOffExp = mResources.getString(
+                R.string.summary_off_switch_preference);
+        assertEquals(summaryOffExp, summaryOff);
+    }
+
+    public void testSetSwitchTextOff_One() throws Throwable {
+        final CharSequence switchOff = "SwitchedOff";
+        this.runTestOnUiThread(new Runnable() {
+            public void run() {
+                mSwitchPref.setSwitchTextOff(switchOff);
+            }
+        });
+        CharSequence switchOffExp = mSwitchPref.getSwitchTextOff();
+        assertEquals(switchOffExp, switchOff);
+    }
+
+    public void testSetSwitchTextOff_Two() throws Throwable {
+        final CharSequence switchOffExp = mResources.getString(
+                R.string.switchtext_off);
+        CharSequence switchOff = mSwitchPref.getSwitchTextOff();
+        assertEquals(switchOffExp, switchOff);
+    }
+
+    public void testSetSwitchTextOn_One() throws Throwable {
+        final CharSequence switchOn = "SwitchedOff";
+        this.runTestOnUiThread(new Runnable() {
+            public void run() {
+                mSwitchPref.setSwitchTextOn(switchOn);
+            }
+        }); 
+        CharSequence switchOnExp = mSwitchPref.getSwitchTextOn();
+        assertEquals(switchOnExp, switchOn);
+    }
+
+    public void testSetSwitchTextOn_Two() throws Throwable {
+        final CharSequence switchOnExp = mResources.getString(
+                R.string.switchtext_on);
+
+        CharSequence switchOn = mSwitchPref.getSwitchTextOn();
+        assertEquals(switchOnExp, switchOn);
+    }
+}
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_StatusUpdatesTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_StatusUpdatesTest.java
new file mode 100644
index 0000000..2f3cdeb
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_StatusUpdatesTest.java
@@ -0,0 +1,189 @@
+/*
+ * 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.ContentProviderOperation;
+import android.content.ContentProviderResult;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.Im;
+import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract.StatusUpdates;
+import android.test.AndroidTestCase;
+
+import java.util.ArrayList;
+
+public class ContactsContract_StatusUpdatesTest extends AndroidTestCase {
+
+    private static final String ACCOUNT_TYPE = "com.android.cts.provider";
+    private static final String ACCOUNT_NAME = "ContactsContract_StatusUpdatesTest";
+
+    private ContentResolver mResolver;
+    private long dataId;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResolver = mContext.getContentResolver();
+
+        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+
+        ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
+                .withValue(RawContacts.ACCOUNT_TYPE, ACCOUNT_TYPE)
+                .withValue(RawContacts.ACCOUNT_NAME, ACCOUNT_NAME)
+                .build());
+
+        ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
+                .withValueBackReference(Data.RAW_CONTACT_ID, 0)
+                .withValue(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE)
+                .withValue(Im.TYPE, Im.TYPE_HOME)
+                .withValue(Im.PROTOCOL, Im.PROTOCOL_GOOGLE_TALK)
+                .build());
+
+        ContentProviderResult[] results = mResolver.applyBatch(ContactsContract.AUTHORITY, ops);
+        assertNotNull(results[0].uri);
+        assertNotNull(results[1].uri);
+
+        dataId = ContentUris.parseId(results[1].uri);
+    }
+
+    public void testInsertStatus() throws Exception {
+        Uri uri = insertStatusUpdate(dataId, StatusUpdates.DO_NOT_DISTURB, null, null);
+        assertPresence(uri, StatusUpdates.DO_NOT_DISTURB);
+        assertStatus(uri, null);
+        assertHasTimestamp(uri, false);
+        assertRowCount(uri, 1);
+
+        Uri uri2 = insertStatusUpdate(dataId, StatusUpdates.AVAILABLE, null, null);
+        assertEquals(uri, uri2);
+
+        assertPresence(uri, StatusUpdates.AVAILABLE);
+        assertStatus(uri, null);
+        assertHasTimestamp(uri, false);
+        assertRowCount(uri, 1);
+
+        Uri uri3 = insertStatusUpdate(dataId, StatusUpdates.AWAY, "Grabbing a byte", null);
+        assertEquals(uri2, uri3);
+
+        assertPresence(uri, StatusUpdates.AWAY);
+        assertStatus(uri, "Grabbing a byte");
+        assertHasTimestamp(uri, false);
+        assertRowCount(uri, 1);
+
+        // Inserting a new status message causes a timestamp to be inserted
+        Uri uri4 = insertStatusUpdate(dataId, StatusUpdates.IDLE, "Taking a bit of a break", null);
+        assertEquals(uri3, uri4);
+
+        assertPresence(uri, StatusUpdates.IDLE);
+        assertStatus(uri, "Taking a bit of a break");
+        assertHasTimestamp(uri, true);
+        assertRowCount(uri, 1);
+    }
+
+    private Uri insertStatusUpdate(long dataId, int presence, String status, Long timestamp)
+            throws Exception {
+        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+        ops.add(ContentProviderOperation.newInsert(StatusUpdates.CONTENT_URI)
+                .withValue(StatusUpdates.DATA_ID, dataId)
+                .withValue(StatusUpdates.PRESENCE, presence)
+                .withValue(StatusUpdates.STATUS, status)
+                .withValue(StatusUpdates.STATUS_TIMESTAMP, timestamp)
+                .withValue(StatusUpdates.PROTOCOL, Im.PROTOCOL_GOOGLE_TALK)
+                .withValue(StatusUpdates.IM_HANDLE, "mrBugDroid1337")
+                .build());
+
+        ContentProviderResult[] results = mResolver.applyBatch(ContactsContract.AUTHORITY, ops);
+        assertNotNull(results[0].uri);
+        return results[0].uri;
+    }
+
+    private void assertRowCount(Uri uri, int count) throws Exception {
+        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+        ops.add(ContentProviderOperation.newAssertQuery(uri)
+                .withExpectedCount(count)
+                .build());
+
+        mResolver.applyBatch(ContactsContract.AUTHORITY, ops);
+    }
+
+    private void assertPresence(Uri uri, int status) throws Exception {
+        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+        ops.add(ContentProviderOperation.newAssertQuery(uri)
+                .withValue(StatusUpdates.PRESENCE, status)
+                .withExpectedCount(1)
+                .build());
+
+        mResolver.applyBatch(ContactsContract.AUTHORITY, ops);
+    }
+
+    private void assertStatus(Uri uri, String status) throws Exception {
+        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+        ops.add(ContentProviderOperation.newAssertQuery(uri)
+                .withValue(StatusUpdates.STATUS, status)
+                .withExpectedCount(1)
+                .build());
+
+        mResolver.applyBatch(ContactsContract.AUTHORITY, ops);
+    }
+
+    private void assertHasTimestamp(Uri uri, boolean hasTimestmap) throws Exception {
+        Cursor cursor = mResolver.query(uri, null, null, null, null);
+        try {
+            assertTrue(cursor.moveToNext());
+
+            if (hasTimestmap) {
+                assertNotNull(cursor.getString(cursor.getColumnIndexOrThrow(
+                        StatusUpdates.STATUS_TIMESTAMP)));
+            } else {
+                assertNull(cursor.getString(cursor.getColumnIndexOrThrow(
+                        StatusUpdates.STATUS_TIMESTAMP)));
+            }
+        } finally {
+            cursor.close();
+        }
+    }
+
+    public void testGetPresencePrecedence() {
+        assertPrecedence(StatusUpdates.AVAILABLE);
+        assertPrecedence(StatusUpdates.AWAY);
+        assertPrecedence(StatusUpdates.DO_NOT_DISTURB);
+        assertPrecedence(StatusUpdates.IDLE);
+        assertPrecedence(StatusUpdates.INVISIBLE);
+        assertPrecedence(StatusUpdates.OFFLINE);
+    }
+
+    private void assertPrecedence(int status) {
+        assertTrue(StatusUpdates.getPresencePrecedence(status) >= 0);
+    }
+
+    public void testGetPresenceIconresourceId() {
+        assertResource(StatusUpdates.AVAILABLE);
+        assertResource(StatusUpdates.AWAY);
+        assertResource(StatusUpdates.DO_NOT_DISTURB);
+        assertResource(StatusUpdates.IDLE);
+        assertResource(StatusUpdates.INVISIBLE);
+        assertResource(StatusUpdates.OFFLINE);
+    }
+
+    private void assertResource(int status) {
+        assertTrue(0 != StatusUpdates.getPresenceIconResourceId(status));
+    }
+}
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>
