diff --git a/CtsBuild.mk b/CtsBuild.mk
index 1b12293..dbe93c7 100644
--- a/CtsBuild.mk
+++ b/CtsBuild.mk
@@ -14,6 +14,28 @@
 
 LOCAL_PATH := $(call my-dir)
 
+# 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
+
+# File indicating which tests should be blacklisted due to unsupported abi.
+CTS_UNSUPPORTED_ABIS := cts/tests/expectations/unsupportedabis.txt
+
+# Holds the target architecture to build for.
+CTS_TARGET_ARCH := $(TARGET_ARCH)
+
 # Functions to get the paths of the build outputs.
 
 define cts-get-lib-paths
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/Android.mk b/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
index d595a20..ed66992 100644
--- a/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
+++ b/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
@@ -16,7 +16,7 @@
 LOCAL_PATH := $(call my-dir)
 
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+include external/stlport/libstlport.mk
 
 LOCAL_MODULE := libcameraanalyzer
 
@@ -31,12 +31,10 @@
 
 LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include/colorchecker $(JNI_H_INCLUDE)
 
-LOCAL_CXX_STL := libc++
 LOCAL_STATIC_LIBRARIES := libcolorchecker
-LOCAL_SHARED_LIBRARIES := \
-    libjnigraphics \
-    libcutils \
-    libutils \
-    liblog \
+LOCAL_SHARED_LIBRARIES := libjnigraphics \
+                          libstlport \
+                          libcutils \
+                          libutils liblog
 
 include $(BUILD_SHARED_LIBRARY)
diff --git a/apps/CtsVerifier/lib/colorchecker/Android.mk b/apps/CtsVerifier/lib/colorchecker/Android.mk
index 48f1356..38f595f 100644
--- a/apps/CtsVerifier/lib/colorchecker/Android.mk
+++ b/apps/CtsVerifier/lib/colorchecker/Android.mk
@@ -19,7 +19,7 @@
 # Build image analysis library
 
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+include external/stlport/libstlport.mk
 
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE := libcolorchecker
@@ -35,9 +35,8 @@
                    whitebalancetest.cpp
 
 LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include/colorchecker
-LOCAL_CXX_STL := libc++
-LOCAL_SHARED_LIBRARIES := \
-    libcutils \
-    libutils \
+LOCAL_SHARED_LIBRARIES := libstlport \
+                          libcutils \
+                          libutils
 
 include $(BUILD_STATIC_LIBRARY)
diff --git a/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp b/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp
index ef7d2c6..46b8cc8 100644
--- a/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp
+++ b/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp
@@ -549,10 +549,10 @@
         (pointBottomRight.x() >= mImage->getHeight()) ||
         (pointBottomRight.y() < 0) ||
         (pointBottomRight.y() >= mImage->getWidth()) ||
-        (std::abs(pointUpperLeft.x() - pointBottomRight.x()) <= 5) ||
-        (std::abs(pointUpperLeft.y() - pointBottomRight.y()) <= 5) ||
-        (std::abs(pointUpperLeft.x() - pointBottomRight.x()) >= 30) ||
-        (std::abs(pointUpperLeft.y() - pointBottomRight.y()) >= 30)) {
+        (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
diff --git a/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp b/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp
index cc3bca9..1c5bc17 100644
--- a/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp
+++ b/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp
@@ -19,7 +19,6 @@
 #include <utils/Log.h>
 #include <utils/Timers.h>
 #include <cmath>
-#include <cstring>
 
 #include "vec2.h"
 #include "vec3.h"
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerService.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerService.java
old mode 100755
new mode 100644
diff --git a/build/config.mk b/build/config.mk
index a836f92..931220b 100644
--- a/build/config.mk
+++ b/build/config.mk
@@ -12,29 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# 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
-
-# File indicating which tests should be blacklisted due to unsupported abi.
-CTS_UNSUPPORTED_ABIS := cts/tests/expectations/unsupportedabis.txt
-
-# Holds the target architecture to build for.
-CTS_TARGET_ARCH := $(TARGET_ARCH)
-
-# CTS build rules
 BUILD_CTS_EXECUTABLE := cts/build/test_executable.mk
 BUILD_CTS_PACKAGE := cts/build/test_package.mk
 BUILD_CTS_GTEST_PACKAGE := cts/build/test_gtest_package.mk
diff --git a/build/test_executable.mk b/build/test_executable.mk
index 3cabdf3..02b3e4c 100644
--- a/build/test_executable.mk
+++ b/build/test_executable.mk
@@ -23,7 +23,6 @@
 #    as needed by CTS.
 #
 
-LOCAL_CXX_STL := libc++
 include $(BUILD_EXECUTABLE)
 
 cts_executable_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
diff --git a/hostsidetests/security/Android.mk b/hostsidetests/security/Android.mk
index d9fbc65..0c976a3 100644
--- a/hostsidetests/security/Android.mk
+++ b/hostsidetests/security/Android.mk
@@ -29,15 +29,7 @@
 
 LOCAL_CTS_TEST_PACKAGE := android.host.security
 
-selinux_general_seapp_contexts := $(call intermediates-dir-for,ETC,general_seapp_contexts)/general_seapp_contexts
-
-selinux_general_file_contexts := $(call intermediates-dir-for,ETC,general_file_contexts)/general_file_contexts
-
-selinux_general_property_contexts := $(call intermediates-dir-for,ETC,general_property_contexts)/general_property_contexts
-
-selinux_general_service_contexts := $(call intermediates-dir-for,ETC,general_service_contexts)/general_service_contexts
-
-LOCAL_JAVA_RESOURCE_FILES := $(HOST_OUT_EXECUTABLES)/sepolicy-analyze $(HOST_OUT_EXECUTABLES)/checkseapp $(HOST_OUT_EXECUTABLES)/checkfc $(selinux_general_seapp_contexts) $(selinux_general_file_contexts) $(selinux_general_property_contexts) $(selinux_general_service_contexts)
+LOCAL_JAVA_RESOURCE_FILES := $(HOST_OUT_EXECUTABLES)/sepolicy-analyze
 
 selinux_general_policy := $(call intermediates-dir-for,ETC,general_sepolicy.conf)/general_sepolicy.conf
 
diff --git a/hostsidetests/security/src/android/cts/security/SELinuxHostTest.java b/hostsidetests/security/src/android/cts/security/SELinuxHostTest.java
index 5f1fbfc..96845b1 100644
--- a/hostsidetests/security/src/android/cts/security/SELinuxHostTest.java
+++ b/hostsidetests/security/src/android/cts/security/SELinuxHostTest.java
@@ -20,30 +20,19 @@
 import com.android.ddmlib.Log;
 import com.android.ddmlib.Log.LogLevel;
 import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.device.CollectingOutputReceiver;
-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.BufferedReader;
 import java.io.File;
-import java.io.FileReader;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.lang.String;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import java.util.Scanner;
-import java.util.Set;
 
 /**
  * Host-side SELinux tests.
@@ -55,17 +44,7 @@
 public class SELinuxHostTest extends DeviceTestCase {
 
     private File sepolicyAnalyze;
-    private File checkSeapp;
-    private File checkFc;
-    private File aospSeappFile;
-    private File aospFcFile;
-    private File aospPcFile;
-    private File aospSvcFile;
     private File devicePolicyFile;
-    private File deviceSeappFile;
-    private File deviceFcFile;
-    private File devicePcFile;
-    private File deviceSvcFile;
 
     /**
      * A reference to the device under test.
@@ -95,49 +74,11 @@
         sepolicyAnalyze = copyResourceToTempFile("/sepolicy-analyze");
         sepolicyAnalyze.setExecutable(true);
 
-        /* retrieve the checkseapp executable from jar */
-        checkSeapp = copyResourceToTempFile("/checkseapp");
-        checkSeapp.setExecutable(true);
-
-        /* retrieve the checkfc executable from jar */
-        checkFc = copyResourceToTempFile("/checkfc");
-        checkFc.setExecutable(true);
-
         /* obtain sepolicy file from running device */
         devicePolicyFile = File.createTempFile("sepolicy", ".tmp");
         devicePolicyFile.deleteOnExit();
         mDevice.executeAdbCommand("pull", "/sys/fs/selinux/policy",
                 devicePolicyFile.getAbsolutePath());
-
-        /* obtain seapp_contexts file from running device */
-        deviceSeappFile = File.createTempFile("seapp_contexts", ".tmp");
-        deviceSeappFile.deleteOnExit();
-        mDevice.executeAdbCommand("pull", "/seapp_contexts",
-                deviceSeappFile.getAbsolutePath());
-
-        /* obtain file_contexts file from running device */
-        deviceFcFile = File.createTempFile("file_contexts", ".tmp");
-        deviceFcFile.deleteOnExit();
-        mDevice.executeAdbCommand("pull", "/file_contexts",
-                deviceFcFile.getAbsolutePath());
-
-        /* obtain property_contexts file from running device */
-        devicePcFile = File.createTempFile("property_contexts", ".tmp");
-        devicePcFile.deleteOnExit();
-        mDevice.executeAdbCommand("pull", "/property_contexts",
-                devicePcFile.getAbsolutePath());
-
-        /* obtain service_contexts file from running device */
-        deviceSvcFile = File.createTempFile("service_contexts", ".tmp");
-        deviceSvcFile.deleteOnExit();
-        mDevice.executeAdbCommand("pull", "/service_contexts",
-                deviceSvcFile.getAbsolutePath());
-
-        /* retrieve the AOSP *_contexts files from jar */
-        aospSeappFile = copyResourceToTempFile("/general_seapp_contexts");
-        aospFcFile = copyResourceToTempFile("/general_file_contexts");
-        aospPcFile = copyResourceToTempFile("/general_property_contexts");
-        aospSvcFile = copyResourceToTempFile("/general_service_contexts");
     }
 
     /**
@@ -164,540 +105,4 @@
         assertTrue("The following SELinux domains were found to be in permissive mode:\n"
                    + errorString, errorString.length() == 0);
     }
-
-    /**
-     * Asserts that specified type is not associated with the specified
-     * attribute.
-     *
-     * @param attribute
-     *  The attribute name.
-     * @param type
-     *  The type name.
-     */
-    private void assertNotInAttribute(String attribute, String badtype) throws Exception {
-        /* run sepolicy-analyze attribute check on policy file */
-        ProcessBuilder pb = new ProcessBuilder(sepolicyAnalyze.getAbsolutePath(),
-                devicePolicyFile.getAbsolutePath(), "attribute", attribute);
-        pb.redirectOutput(ProcessBuilder.Redirect.PIPE);
-        pb.redirectErrorStream(true);
-        Process p = pb.start();
-        p.waitFor();
-        BufferedReader result = new BufferedReader(new InputStreamReader(p.getInputStream()));
-        String type;
-        while ((type = result.readLine()) != null) {
-            assertFalse("Attribute " + attribute + " includes " + type + "\n",
-                        type.equals(badtype));
-        }
-    }
-
-    /**
-     * Tests that mlstrustedsubject does not include untrusted_app
-     * and that mlstrustedobject does not include app_data_file.
-     * This helps prevent circumventing the per-user isolation of
-     * normal apps via levelFrom=user.
-     *
-     * @throws Exception
-     */
-    public void testMLSAttributes() throws Exception {
-        assertNotInAttribute("mlstrustedsubject", "untrusted_app");
-        assertNotInAttribute("mlstrustedobject", "app_data_file");
-    }
-
-    /**
-     * Tests that the seapp_contexts file on the device is valid.
-     *
-     * @throws Exception
-     */
-    public void testValidSeappContexts() throws Exception {
-        File OutputFile = File.createTempFile("seapp_output", ".tmp");
-        OutputFile.deleteOnExit();
-
-        /* run checkseapp on seapp_contexts */
-        ProcessBuilder pb = new ProcessBuilder(checkSeapp.getAbsolutePath(),
-                "-p", devicePolicyFile.getAbsolutePath(),
-                deviceSeappFile.getAbsolutePath(),
-                "-o", OutputFile.getAbsolutePath());
-        pb.redirectOutput(ProcessBuilder.Redirect.PIPE);
-        pb.redirectErrorStream(true);
-        Process p = pb.start();
-        p.waitFor();
-        BufferedReader result = new BufferedReader(new InputStreamReader(p.getInputStream()));
-        String line;
-        StringBuilder errorString = new StringBuilder();
-        while ((line = result.readLine()) != null) {
-            errorString.append(line);
-            errorString.append("\n");
-        }
-        assertTrue("The seapp_contexts file was invalid:\n"
-                   + errorString, errorString.length() == 0);
-    }
-
-    /**
-     * Asserts that the actual file contents starts with the expected file
-     * contents.
-     *
-     * @param expectedFile
-     *  The file with the expected contents.
-     * @param actualFile
-     *  The actual file being checked.
-     */
-    private void assertFileStartsWith(File expectedFile, File actualFile) throws Exception {
-        BufferedReader expectedReader = new BufferedReader(new FileReader(expectedFile.getAbsolutePath()));
-        BufferedReader actualReader = new BufferedReader(new FileReader(actualFile.getAbsolutePath()));
-        String expectedLine, actualLine;
-        while ((expectedLine = expectedReader.readLine()) != null) {
-            actualLine = actualReader.readLine();
-            assertEquals("Lines do not match:", expectedLine, actualLine);
-        }
-    }
-
-    /**
-     * Tests that the seapp_contexts file on the device contains
-     * the standard AOSP entries.
-     *
-     * @throws Exception
-     */
-    public void testAospSeappContexts() throws Exception {
-        assertFileStartsWith(aospSeappFile, deviceSeappFile);
-    }
-
-    /**
-     * Tests that the file_contexts file on the device contains
-     * the standard AOSP entries.
-     *
-     * @throws Exception
-     */
-    public void testAospFileContexts() throws Exception {
-        assertFileStartsWith(aospFcFile, deviceFcFile);
-    }
-
-    /**
-     * Tests that the property_contexts file on the device contains
-     * the standard AOSP entries.
-     *
-     * @throws Exception
-     */
-    public void testAospPropertyContexts() throws Exception {
-        assertFileStartsWith(aospPcFile, devicePcFile);
-    }
-
-    /**
-     * Tests that the service_contexts file on the device contains
-     * the standard AOSP entries.
-     *
-     * @throws Exception
-     */
-    public void testAospServiceContexts() throws Exception {
-        assertFileStartsWith(aospSvcFile, deviceSvcFile);
-    }
-
-    /**
-     * Tests that the file_contexts file on the device is valid.
-     *
-     * @throws Exception
-     */
-    public void testValidFileContexts() throws Exception {
-
-        /* run checkfc on file_contexts */
-        ProcessBuilder pb = new ProcessBuilder(checkFc.getAbsolutePath(),
-                devicePolicyFile.getAbsolutePath(),
-                deviceFcFile.getAbsolutePath());
-        pb.redirectOutput(ProcessBuilder.Redirect.PIPE);
-        pb.redirectErrorStream(true);
-        Process p = pb.start();
-        p.waitFor();
-        BufferedReader result = new BufferedReader(new InputStreamReader(p.getInputStream()));
-        String line;
-        StringBuilder errorString = new StringBuilder();
-        while ((line = result.readLine()) != null) {
-            errorString.append(line);
-            errorString.append("\n");
-        }
-        assertTrue("The file_contexts file was invalid:\n"
-                   + errorString, errorString.length() == 0);
-    }
-
-    /**
-     * Tests that the property_contexts file on the device is valid.
-     *
-     * @throws Exception
-     */
-    public void testValidPropertyContexts() throws Exception {
-
-        /* run checkfc -p on property_contexts */
-        ProcessBuilder pb = new ProcessBuilder(checkFc.getAbsolutePath(),
-                "-p", devicePolicyFile.getAbsolutePath(),
-                devicePcFile.getAbsolutePath());
-        pb.redirectOutput(ProcessBuilder.Redirect.PIPE);
-        pb.redirectErrorStream(true);
-        Process p = pb.start();
-        p.waitFor();
-        BufferedReader result = new BufferedReader(new InputStreamReader(p.getInputStream()));
-        String line;
-        StringBuilder errorString = new StringBuilder();
-        while ((line = result.readLine()) != null) {
-            errorString.append(line);
-            errorString.append("\n");
-        }
-        assertTrue("The property_contexts file was invalid:\n"
-                   + errorString, errorString.length() == 0);
-    }
-
-    /**
-     * Tests that the service_contexts file on the device is valid.
-     *
-     * @throws Exception
-     */
-    public void testValidServiceContexts() throws Exception {
-
-        /* run checkfc -p on service_contexts */
-        ProcessBuilder pb = new ProcessBuilder(checkFc.getAbsolutePath(),
-                "-p", devicePolicyFile.getAbsolutePath(),
-                devicePcFile.getAbsolutePath());
-        pb.redirectOutput(ProcessBuilder.Redirect.PIPE);
-        pb.redirectErrorStream(true);
-        Process p = pb.start();
-        p.waitFor();
-        BufferedReader result = new BufferedReader(new InputStreamReader(p.getInputStream()));
-        String line;
-        StringBuilder errorString = new StringBuilder();
-        while ((line = result.readLine()) != null) {
-            errorString.append(line);
-            errorString.append("\n");
-        }
-        assertTrue("The service_contexts file was invalid:\n"
-                   + errorString, errorString.length() == 0);
-    }
-
-   /**
-     * Tests that the policy defines no booleans (runtime conditional policy).
-     *
-     * @throws Exception
-     */
-    public void testNoBooleans() throws Exception {
-
-        /* run sepolicy-analyze booleans check on policy file */
-        ProcessBuilder pb = new ProcessBuilder(sepolicyAnalyze.getAbsolutePath(),
-                devicePolicyFile.getAbsolutePath(), "booleans");
-        pb.redirectOutput(ProcessBuilder.Redirect.PIPE);
-        pb.redirectErrorStream(true);
-        Process p = pb.start();
-        p.waitFor();
-        BufferedReader result = new BufferedReader(new InputStreamReader(p.getInputStream()));
-        String line;
-        StringBuilder errorString = new StringBuilder();
-        while ((line = result.readLine()) != null) {
-            errorString.append(line);
-            errorString.append("\n");
-        }
-        assertTrue("The policy contained booleans:\n"
-                   + errorString, errorString.length() == 0);
-    }
-
-    /**
-     * Tests that important domain labels are being appropriately applied.
-     */
-
-    /**
-     * Asserts that no processes are running in a domain.
-     *
-     * @param domain
-     *  The domain or SELinux context to check.
-     */
-    private void assertDomainEmpty(String domain) throws DeviceNotAvailableException {
-        List<ProcessDetails> procs = ProcessDetails.getProcMap(mDevice).get(domain);
-        String msg = "Expected no processes in SELinux domain \"" + domain + "\""
-            + " Found: \"" + procs + "\"";
-        assertNull(msg, procs);
-    }
-
-    /**
-     * Asserts that a domain exists and that only one, well defined, process is
-     * running in that domain.
-     *
-     * @param domain
-     *  The domain or SELinux context to check.
-     * @param executable
-     *  The path of the executable or application package name.
-     */
-    private void assertDomainOne(String domain, String executable) throws DeviceNotAvailableException {
-        List<ProcessDetails> procs = ProcessDetails.getProcMap(mDevice).get(domain);
-        String msg = "Expected 1 process in SELinux domain \"" + domain + "\""
-            + " Found \"" + procs + "\"";
-        assertNotNull(msg, procs);
-        assertEquals(msg, 1, procs.size());
-
-        msg = "Expected executable \"" + executable + "\" in SELinux domain \"" + domain + "\""
-            + "Found: \"" + procs + "\"";
-        assertEquals(msg, executable, procs.get(0).procTitle);
-    }
-
-    /**
-     * Asserts that a domain may exist. If a domain exists, the cardinality of
-     * the domain is verified to be 1 and that the correct process is running in
-     * that domain.
-     *
-     * @param domain
-     *  The domain or SELinux context to check.
-     * @param executable
-     *  The path of the executable or application package name.
-     */
-    private void assertDomainZeroOrOne(String domain, String executable)
-        throws DeviceNotAvailableException {
-        List<ProcessDetails> procs = ProcessDetails.getProcMap(mDevice).get(domain);
-        if (procs == null) {
-            /* not on all devices */
-            return;
-        }
-
-        String msg = "Expected 1 process in SELinux domain \"" + domain + "\""
-            + " Found: \"" + procs + "\"";
-        assertEquals(msg, 1, procs.size());
-
-        msg = "Expected executable \"" + executable + "\" in SELinux domain \"" + domain + "\""
-            + "Found: \"" + procs.get(0) + "\"";
-        assertEquals(msg, executable, procs.get(0).procTitle);
-    }
-
-    /**
-     * Asserts that a domain must exist, and that the cardinality is greater
-     * than or equal to 1.
-     *
-     * @param domain
-     *  The domain or SELinux context to check.
-     * @param executables
-     *  The path of the allowed executables or application package names.
-     */
-    private void assertDomainN(String domain, String... executables)
-        throws DeviceNotAvailableException {
-        List<ProcessDetails> procs = ProcessDetails.getProcMap(mDevice).get(domain);
-        String msg = "Expected 1 or more processes in SELinux domain but found none.";
-        assertNotNull(msg, procs);
-
-        Set<String> execList = new HashSet<String>(Arrays.asList(executables));
-
-        for (ProcessDetails p : procs) {
-            msg = "Expected one of \"" + execList + "\" in SELinux domain \"" + domain + "\""
-                + " Found: \"" + p + "\"";
-            assertTrue(msg, execList.contains(p.procTitle));
-        }
-    }
-
-    /**
-     * Asserts that a domain, if it exists, is only running the listed executables.
-     *
-     * @param domain
-     *  The domain or SELinux context to check.
-     * @param executables
-     *  The path of the allowed executables or application package names.
-     */
-    private void assertDomainHasExecutable(String domain, String... executables)
-        throws DeviceNotAvailableException {
-        List<ProcessDetails> procs = ProcessDetails.getProcMap(mDevice).get(domain);
-        if (procs == null) {
-            return; // domain doesn't exist
-        }
-
-        Set<String> execList = new HashSet<String>(Arrays.asList(executables));
-
-        for (ProcessDetails p : procs) {
-            String msg = "Expected one of \"" + execList + "\" in SELinux domain \""
-                + domain + "\"" + " Found: \"" + p + "\"";
-            assertTrue(msg, execList.contains(p.procTitle));
-        }
-    }
-
-    /* Init is always there */
-    public void testInitDomain() throws DeviceNotAvailableException {
-        assertDomainOne("u:r:init:s0", "/init");
-    }
-
-    /* Ueventd is always there */
-    public void testUeventdDomain() throws DeviceNotAvailableException {
-        assertDomainOne("u:r:ueventd:s0", "/sbin/ueventd");
-    }
-
-    /* Devices always have healthd */
-    public void testHealthdDomain() throws DeviceNotAvailableException {
-        assertDomainOne("u:r:healthd:s0", "/sbin/healthd");
-    }
-
-    /* Servicemanager is always there */
-    public void testServicemanagerDomain() throws DeviceNotAvailableException {
-        assertDomainOne("u:r:servicemanager:s0", "/system/bin/servicemanager");
-    }
-
-    /* Vold is always there */
-    public void testVoldDomain() throws DeviceNotAvailableException {
-        assertDomainOne("u:r:vold:s0", "/system/bin/vold");
-    }
-
-    /* netd is always there */
-    public void testNetdDomain() throws DeviceNotAvailableException {
-        assertDomainOne("u:r:netd:s0", "/system/bin/netd");
-    }
-
-    /* Debuggerd is always there */
-    public void testDebuggerdDomain() throws DeviceNotAvailableException {
-        assertDomainN("u:r:debuggerd:s0", "/system/bin/debuggerd", "/system/bin/debuggerd64");
-    }
-
-    /* Surface flinger is always there */
-    public void testSurfaceflingerDomain() throws DeviceNotAvailableException {
-        assertDomainOne("u:r:surfaceflinger:s0", "/system/bin/surfaceflinger");
-    }
-
-    /* Zygote is always running */
-    public void testZygoteDomain() throws DeviceNotAvailableException {
-        assertDomainN("u:r:zygote:s0", "zygote", "zygote64");
-    }
-
-    /* drm server is always present */
-    public void testDrmServerDomain() throws DeviceNotAvailableException {
-        assertDomainOne("u:r:drmserver:s0", "/system/bin/drmserver");
-    }
-
-    /* Media server is always running */
-    public void testMediaserverDomain() throws DeviceNotAvailableException {
-        assertDomainN("u:r:mediaserver:s0", "media.log", "/system/bin/mediaserver");
-    }
-
-    /* Installd is always running */
-    public void testInstalldDomain() throws DeviceNotAvailableException {
-        assertDomainOne("u:r:installd:s0", "/system/bin/installd");
-    }
-
-    /* keystore is always running */
-    public void testKeystoreDomain() throws DeviceNotAvailableException {
-        assertDomainOne("u:r:keystore:s0", "/system/bin/keystore");
-    }
-
-    /* System server better be running :-P */
-    public void testSystemServerDomain() throws DeviceNotAvailableException {
-        assertDomainOne("u:r:system_server:s0", "system_server");
-    }
-
-    /*
-     * Some OEMs do not use sdcardd so transient. Other OEMs have multiple sdcards
-     * so they run the daemon multiple times.
-     */
-    public void testSdcarddDomain() throws DeviceNotAvailableException {
-        assertDomainHasExecutable("u:r:sdcardd:s0", "/system/bin/sdcard");
-    }
-
-    /* Watchdogd may or may not be there */
-    public void testWatchdogdDomain() throws DeviceNotAvailableException {
-        assertDomainZeroOrOne("u:r:watchdogd:s0", "/sbin/watchdogd");
-    }
-
-    /* Wifi may be off so cardinality of 0 or 1 is ok */
-    public void testWpaDomain() throws DeviceNotAvailableException {
-        assertDomainZeroOrOne("u:r:wpa:s0", "/system/bin/wpa_supplicant");
-    }
-
-    /*
-     * Nothing should be running in this domain, cardinality test is all thats
-     * needed
-     */
-    public void testInitShellDomain() throws DeviceNotAvailableException {
-        assertDomainEmpty("u:r:init_shell:s0");
-    }
-
-    /*
-     * Nothing should be running in this domain, cardinality test is all thats
-     * needed
-     */
-    public void testRecoveryDomain() throws DeviceNotAvailableException {
-        assertDomainEmpty("u:r:recovery:s0");
-    }
-
-    /*
-     * Nothing should be running in this domain, cardinality test is all thats
-     * needed
-     */
-    public void testSuDomain() throws DeviceNotAvailableException {
-        assertDomainEmpty("u:r:su:s0");
-    }
-
-    /*
-     * There will at least be some kernel thread running and all kthreads should
-     * be in kernel context.
-     */
-    public void testKernelDomain() throws DeviceNotAvailableException {
-        String domain = "u:r:kernel:s0";
-        List<ProcessDetails> procs = ProcessDetails.getProcMap(mDevice).get(domain);
-        assertNotNull(procs);
-        for (ProcessDetails p : procs) {
-            assertTrue("Non Kernel thread \"" + p + "\" found!", p.isKernel());
-        }
-    }
-
-    private static class ProcessDetails {
-        public String label;
-        public String user;
-        public int pid;
-        public int ppid;
-        public String procTitle;
-
-        private static HashMap<String, ArrayList<ProcessDetails>> procMap;
-        private static int kernelParentThreadpid = -1;
-
-        ProcessDetails(String label, String user, int pid, int ppid, String procTitle) {
-            this.label = label;
-            this.user = user;
-            this.pid = pid;
-            this.ppid = ppid;
-            this.procTitle = procTitle;
-        }
-
-        @Override
-        public String toString() {
-            return "label: " + label
-                    + " user: " + user
-                    + " pid: " + pid
-                    + " ppid: " + ppid
-                    + " cmd: " + procTitle;
-        }
-
-
-        private static void createProcMap(ITestDevice tDevice) throws DeviceNotAvailableException {
-
-            /* take the output of a ps -Z to do our analysis */
-            CollectingOutputReceiver psOut = new CollectingOutputReceiver();
-            tDevice.executeShellCommand("ps -Z", psOut);
-            String psOutString = psOut.getOutput();
-            Pattern p = Pattern.compile(
-                    "^([\\w_:]+)\\s+([\\w_]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\p{Graph}+)$",
-                    Pattern.MULTILINE);
-            Matcher m = p.matcher(psOutString);
-            procMap = new HashMap<String, ArrayList<ProcessDetails>>();
-            while(m.find()) {
-                String domainLabel = m.group(1);
-                String user = m.group(2);
-                int pid = Integer.parseInt(m.group(3));
-                int ppid = Integer.parseInt(m.group(4));
-                String procTitle = m.group(5);
-                ProcessDetails proc = new ProcessDetails(domainLabel, user, pid, ppid, procTitle);
-                if (procMap.get(domainLabel) == null) {
-                    procMap.put(domainLabel, new ArrayList<ProcessDetails>());
-                }
-                procMap.get(domainLabel).add(proc);
-                if (procTitle.equals("kthreadd") && ppid == 0) {
-                    kernelParentThreadpid = pid;
-                }
-            }
-        }
-
-        public static HashMap<String, ArrayList<ProcessDetails>> getProcMap(ITestDevice tDevice)
-                throws DeviceNotAvailableException{
-            if (procMap == null) {
-                createProcMap(tDevice);
-            }
-            return procMap;
-        }
-
-        public boolean isKernel() {
-            return (pid == kernelParentThreadpid || ppid == kernelParentThreadpid);
-        }
-    }
 }
diff --git a/libs/commonutil/src/com/android/cts/util/StatisticsUtils.java b/libs/commonutil/src/com/android/cts/util/StatisticsUtils.java
deleted file mode 100644
index d6589af..0000000
--- a/libs/commonutil/src/com/android/cts/util/StatisticsUtils.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.util;
-
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Set of static helper methods for CTS tests.
- */
-public class StatisticsUtils {
-
-
-    /**
-     * Private constructor for static class.
-     */
-    private StatisticsUtils() {}
-
-    /**
-     * Get the value of the 95th percentile using nearest rank algorithm.
-     *
-     * @throws IllegalArgumentException if the collection is null or empty
-     */
-    public static <TValue extends Comparable<? super TValue>> TValue get95PercentileValue(
-            Collection<TValue> collection) {
-        validateCollection(collection);
-
-        List<TValue> arrayCopy = new ArrayList<TValue>(collection);
-        Collections.sort(arrayCopy);
-
-        // zero-based array index
-        int arrayIndex = (int) Math.round(arrayCopy.size() * 0.95 + .5) - 1;
-
-        return arrayCopy.get(arrayIndex);
-    }
-
-    /**
-     * Calculate the mean of a collection.
-     *
-     * @throws IllegalArgumentException if the collection is null or empty
-     */
-    public static <TValue extends Number> double getMean(Collection<TValue> collection) {
-        validateCollection(collection);
-
-        double sum = 0.0;
-        for(TValue value : collection) {
-            sum += value.doubleValue();
-        }
-        return sum / collection.size();
-    }
-
-    /**
-     * Calculate the bias-corrected sample variance of a collection.
-     *
-     * @throws IllegalArgumentException if the collection is null or empty
-     */
-    public static <TValue extends Number> double getVariance(Collection<TValue> collection) {
-        validateCollection(collection);
-
-        double mean = getMean(collection);
-        ArrayList<Double> squaredDiffs = new ArrayList<Double>();
-        for(TValue value : collection) {
-            double difference = mean - value.doubleValue();
-            squaredDiffs.add(Math.pow(difference, 2));
-        }
-
-        double sum = 0.0;
-        for (Double value : squaredDiffs) {
-            sum += value;
-        }
-        return sum / (squaredDiffs.size() - 1);
-    }
-
-    /**
-     * Calculate the bias-corrected standard deviation of a collection.
-     *
-     * @throws IllegalArgumentException if the collection is null or empty
-     */
-    public static <TValue extends Number> double getStandardDeviation(
-            Collection<TValue> collection) {
-        return Math.sqrt(getVariance(collection));
-    }
-
-    /**
-     * Validate that a collection is not null or empty.
-     *
-     * @throws IllegalStateException if collection is null or empty.
-     */
-    private static <T> void validateCollection(Collection<T> collection) {
-        if(collection == null || collection.size() == 0) {
-            throw new IllegalStateException("Collection cannot be null or empty");
-        }
-    }
-
-}
diff --git a/libs/commonutil/src/com/android/cts/util/StatisticsUtilsTest.java b/libs/commonutil/src/com/android/cts/util/StatisticsUtilsTest.java
deleted file mode 100644
index d78ba99..0000000
--- a/libs/commonutil/src/com/android/cts/util/StatisticsUtilsTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.util;
-
-import junit.framework.TestCase;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Unit tests for the {@link StatisticsUtils} class.
- */
-public class StatisticsUtilsTest extends TestCase {
-
-    /**
-     * Test {@link StatisticsUtils#get95PercentileValue(Collection)}.
-     */
-    public void testGet95PercentileValue() {
-        Collection<Integer> values = new HashSet<Integer>();
-        for (int i = 0; i < 100; i++) {
-            values.add(i);
-        }
-        assertEquals(95, (int) StatisticsUtils.get95PercentileValue(values));
-
-        values = new HashSet<Integer>();
-        for (int i = 0; i < 1000; i++) {
-            values.add(i);
-        }
-        assertEquals(950, (int) StatisticsUtils.get95PercentileValue(values));
-
-        values = new HashSet<Integer>();
-        for (int i = 0; i < 100; i++) {
-            values.add(i * i);
-        }
-        assertEquals(95 * 95, (int) StatisticsUtils.get95PercentileValue(values));
-    }
-
-    /**
-     * Test {@link StatisticsUtils#getMean(Collection)}.
-     */
-    public void testGetMean() {
-        List<Integer> values = Arrays.asList(0, 1, 2, 3, 4);
-        double mean = StatisticsUtils.getMean(values);
-        assertEquals(2.0, mean, 0.00001);
-
-        values = Arrays.asList(1, 2, 3, 4, 5);
-        mean = StatisticsUtils.getMean(values);
-        assertEquals(3.0, mean, 0.00001);
-
-        values = Arrays.asList(0, 1, 4, 9, 16);
-        mean = StatisticsUtils.getMean(values);
-        assertEquals(6.0, mean, 0.00001);
-    }
-
-    /**
-     * Test {@link StatisticsUtils#getVariance(Collection)}.
-     */
-    public void testGetVariance() {
-        List<Integer> values = Arrays.asList(0, 1, 2, 3, 4);
-        double variance = StatisticsUtils.getVariance(values);
-        assertEquals(2.5, variance, 0.00001);
-
-        values = Arrays.asList(1, 2, 3, 4, 5);
-        variance = StatisticsUtils.getVariance(values);
-        assertEquals(2.5, variance, 0.00001);
-
-        values = Arrays.asList(0, 2, 4, 6, 8);
-        variance = StatisticsUtils.getVariance(values);
-        assertEquals(10.0, variance, 0.00001);
-    }
-
-    /**
-     * Test {@link StatisticsUtils#getStandardDeviation(Collection)}.
-     */
-    public void testGetStandardDeviation() {
-        List<Integer> values = Arrays.asList(0, 1, 2, 3, 4);
-        double stddev = StatisticsUtils.getStandardDeviation(values);
-        assertEquals(Math.sqrt(2.5), stddev, 0.00001);
-
-        values = Arrays.asList(1, 2, 3, 4, 5);
-        stddev = StatisticsUtils.getStandardDeviation(values);
-        assertEquals(Math.sqrt(2.5), stddev, 0.00001);
-
-        values = Arrays.asList(0, 2, 4, 6, 8);
-        stddev = StatisticsUtils.getStandardDeviation(values);
-        assertEquals(Math.sqrt(10.0), stddev, 0.00001);
-    }
-
-
-}
diff --git a/suite/audio_quality/test/Android.mk b/suite/audio_quality/test/Android.mk
index bd0033f..4582fe7 100644
--- a/suite/audio_quality/test/Android.mk
+++ b/suite/audio_quality/test/Android.mk
@@ -34,7 +34,7 @@
 # functions and linker error happens
 LOCAL_WHOLE_STATIC_LIBRARIES := libcts_audio_quality
 LOCAL_CFLAGS:= -g -fno-exceptions
-LOCAL_LDFLAGS:= -g -lrt -ldl -lm -fno-exceptions -lpthread
+LOCAL_LDFLAGS:= -g -lrt -ldl -lstdc++ -lm -fno-exceptions -lpthread
 LOCAL_MODULE:= cts_audio_quality_test
 include $(BUILD_HOST_EXECUTABLE)
 
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/Boid.h b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/Boid.h
index 3e4367a..e50acd0 100644
--- a/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/Boid.h
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/Boid.h
@@ -16,7 +16,6 @@
 #define BOID_H
 
 #include <graphics/Vector2D.h>
-#include <utils/Compat.h>
 
 class Boid {
 public:
@@ -25,14 +24,14 @@
     void flock(const Boid* boids[], int numBoids, int index, float limitX, float limitY);
     // The following floats are the parameters for the flocking algorithm, changing these
     // modifies the boid's behaviour.
-    static const CONSTEXPR float MAX_SPEED = 2.0f;// Upper limit of boid velocity.
-    static const CONSTEXPR float MAX_FORCE = 0.05f;// Upper limit of the force used to push a boid.
-    static const CONSTEXPR float NEIGHBOUR_RADIUS = 70.0f;// Radius used to find neighbours, was 50.
-    static const CONSTEXPR float DESIRED_BOID_DIST = 35.0f;// Distance boids want to be from others, was 25.
+    static const float MAX_SPEED = 2.0f;// Upper limit of boid velocity.
+    static const float MAX_FORCE = 0.05f;// Upper limit of the force used to push a boid.
+    static const float NEIGHBOUR_RADIUS = 70.0f;// Radius used to find neighbours, was 50.
+    static const float DESIRED_BOID_DIST = 35.0f;// Distance boids want to be from others, was 25.
     // The weightings of the components.
-    static const CONSTEXPR float SEPARATION_WEIGHT = 2.0f;
-    static const CONSTEXPR float ALIGNMENT_WEIGHT = 1.0f;
-    static const CONSTEXPR float COHESION_WEIGHT = 1.0f;
+    static const float SEPARATION_WEIGHT = 2.0f;
+    static const float ALIGNMENT_WEIGHT = 1.0f;
+    static const float COHESION_WEIGHT = 1.0f;
     Vector2D mPosition;
     Vector2D mVelocity;
     Vector2D mAcceleration;
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/FlockingScene.h b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/FlockingScene.h
index 7cdcffe..97bd4cc 100644
--- a/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/FlockingScene.h
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/FlockingScene.h
@@ -15,7 +15,6 @@
 #define FLOCKINGSCENE_H
 
 #include <graphics/Program.h>
-#include <utils/Compat.h>
 
 #include "../Scene.h"
 #include "Boid.h"
@@ -42,6 +41,6 @@
     float mBoardHeight;
     Program* mMainProgram;
     Program* mWaterProgram;
-    static const CONSTEXPR float BOID_SCALE = 1.0f / 50.0f;
+    static const float BOID_SCALE = 1.0f / 50.0f;
 };
 #endif
diff --git a/suite/cts/deviceTests/opengl/test/Android.mk b/suite/cts/deviceTests/opengl/test/Android.mk
index 5270bac..a4abe4f 100644
--- a/suite/cts/deviceTests/opengl/test/Android.mk
+++ b/suite/cts/deviceTests/opengl/test/Android.mk
@@ -18,7 +18,6 @@
 
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_MODULE_TAGS := optional
 LOCAL_SRC_FILES := $(patsubst ./%,%, $(shell cd $(LOCAL_PATH); \
@@ -27,8 +26,8 @@
 
 #$(info $(LOCAL_SRC_FILES))
 LOCAL_C_INCLUDES += external/gtest/include $(LOCAL_PATH)/../jni/graphics/
-LOCAL_STATIC_LIBRARIES := libgtest_host libgtest_main_host liblog
-LOCAL_LDFLAGS:= -g -lpthread
+LOCAL_STATIC_LIBRARIES := libutils libcutils libgtest_host libgtest_main_host liblog
+LOCAL_LDFLAGS:= -g -lrt -ldl -lstdc++ -lm -fno-exceptions -lpthread
 LOCAL_MODULE:= cts_device_opengl_test
 include $(BUILD_HOST_EXECUTABLE)
 
diff --git a/tests/tests/bionic/Android.mk b/tests/tests/bionic/Android.mk
index f441d7a..e1afd50 100644
--- a/tests/tests/bionic/Android.mk
+++ b/tests/tests/bionic/Android.mk
@@ -4,7 +4,6 @@
 list_executable := $(test_executable)_list
 
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_MODULE := $(test_executable)
 LOCAL_MODULE_TAGS := optional
@@ -13,24 +12,25 @@
 LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)32
 LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
 
+LOCAL_ADDITION_DEPENDENCIES := \
+    $(LOCAL_PATH)/Android.mk \
+
 LOCAL_SHARED_LIBRARIES += \
+    libstlport \
     libdl \
 
 LOCAL_WHOLE_STATIC_LIBRARIES += \
     libBionicTests \
-    libBionicCtsGtestMain \
 
 LOCAL_STATIC_LIBRARIES += \
-    libtinyxml2 \
-    liblog \
     libgtest \
+    libgtest_main \
 
 LOCAL_CTS_TEST_PACKAGE := android.bionic
 include $(BUILD_CTS_EXECUTABLE)
 
 ifeq ($(HOST_OS)-$(HOST_ARCH),$(filter $(HOST_OS)-$(HOST_ARCH),linux-x86 linux-x86_64))
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE := $(list_executable)
@@ -39,14 +39,18 @@
 LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)
 LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
 
+LOCAL_ADDITION_DEPENDENCIES := \
+    $(LOCAL_PATH)/Android.mk \
+
+# A main without the extra output from the gtest main.
+LOCAL_SRC_FILES := \
+    main.cpp \
+
 LOCAL_LDLIBS += \
-    -lrt -ldl -lutil \
+    -lrt \
 
 LOCAL_WHOLE_STATIC_LIBRARIES += \
     libBionicTests \
-    libBionicCtsGtestMain \
-
-LOCAL_CXX_STL := libc++
 
 include $(BUILD_HOST_NATIVE_TEST)
 endif  # ifeq ($(HOST_OS)-$(HOST_ARCH),$(filter $(HOST_OS)-$(HOST_ARCH),linux-x86 linux-x86_64))
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/bionic/main.cpp
similarity index 75%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/bionic/main.cpp
index 6660366..b661af4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/bionic/main.cpp
@@ -14,7 +14,11 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+#include <gtest/gtest.h>
 
+int main(int argc, char **argv) {
+  // Do not use gtest_main to avoid the Running main() ... output.
+  testing::InitGoogleTest(&argc, argv);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/tests/tests/drm/jni/android_drm_cts_NativeCodeTest.cpp b/tests/tests/drm/jni/android_drm_cts_NativeCodeTest.cpp
index e5c9f96..398a44e 100644
--- a/tests/tests/drm/jni/android_drm_cts_NativeCodeTest.cpp
+++ b/tests/tests/drm/jni/android_drm_cts_NativeCodeTest.cpp
@@ -16,7 +16,6 @@
 
 #include <jni.h>
 #include <sys/types.h>
-#include <string.h>
 #include <unistd.h>
 #include <sys/syscall.h>
 #include <utils/Log.h>
diff --git a/tests/tests/hardware/Android.mk b/tests/tests/hardware/Android.mk
index 153445d..e5203e5 100644
--- a/tests/tests/hardware/Android.mk
+++ b/tests/tests/hardware/Android.mk
@@ -19,11 +19,8 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := cts-sensors-tests
-
 LOCAL_MODULE_TAGS := tests
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil
-
 LOCAL_SDK_VERSION := current
 
 # TODO: sensors need to be refactored out into their own namespace: android.hardware.sensors.cts
@@ -52,8 +49,11 @@
 
 LOCAL_PACKAGE_NAME := CtsHardwareTestCases
 
-LOCAL_SDK_VERSION := current
-
+# uncomment when b/13281332 is fixed
+# please also uncomment the equivalent code in
+# cts/apps/CtsVerifiers/Android.mk
+#
+# LOCAL_SDK_VERSION := current
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelperTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelperTest.java
index daac8d1..6f99692 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelperTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelperTest.java
@@ -30,6 +30,80 @@
 public class SensorCtsHelperTest extends TestCase {
 
     /**
+     * Test {@link SensorCtsHelper#get95PercentileValue(Collection)}.
+     */
+    public void testGet95PercentileValue() {
+        Collection<Integer> values = new HashSet<Integer>();
+        for (int i = 0; i < 100; i++) {
+            values.add(i);
+        }
+        assertEquals(95, (int) SensorCtsHelper.get95PercentileValue(values));
+
+        values = new HashSet<Integer>();
+        for (int i = 0; i < 1000; i++) {
+            values.add(i);
+        }
+        assertEquals(950, (int) SensorCtsHelper.get95PercentileValue(values));
+
+        values = new HashSet<Integer>();
+        for (int i = 0; i < 100; i++) {
+            values.add(i * i);
+        }
+        assertEquals(95 * 95, (int) SensorCtsHelper.get95PercentileValue(values));
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getMean(Collection)}.
+     */
+    public void testGetMean() {
+        List<Integer> values = Arrays.asList(0, 1, 2, 3, 4);
+        double mean = SensorCtsHelper.getMean(values);
+        assertEquals(2.0, mean, 0.00001);
+
+        values = Arrays.asList(1, 2, 3, 4, 5);
+        mean = SensorCtsHelper.getMean(values);
+        assertEquals(3.0, mean, 0.00001);
+
+        values = Arrays.asList(0, 1, 4, 9, 16);
+        mean = SensorCtsHelper.getMean(values);
+        assertEquals(6.0, mean, 0.00001);
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getVariance(Collection)}.
+     */
+    public void testGetVariance() {
+        List<Integer> values = Arrays.asList(0, 1, 2, 3, 4);
+        double variance = SensorCtsHelper.getVariance(values);
+        assertEquals(2.5, variance, 0.00001);
+
+        values = Arrays.asList(1, 2, 3, 4, 5);
+        variance = SensorCtsHelper.getVariance(values);
+        assertEquals(2.5, variance, 0.00001);
+
+        values = Arrays.asList(0, 2, 4, 6, 8);
+        variance = SensorCtsHelper.getVariance(values);
+        assertEquals(10.0, variance, 0.00001);
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getStandardDeviation(Collection)}.
+     */
+    public void testGetStandardDeviation() {
+        List<Integer> values = Arrays.asList(0, 1, 2, 3, 4);
+        double stddev = SensorCtsHelper.getStandardDeviation(values);
+        assertEquals(Math.sqrt(2.5), stddev, 0.00001);
+
+        values = Arrays.asList(1, 2, 3, 4, 5);
+        stddev = SensorCtsHelper.getStandardDeviation(values);
+        assertEquals(Math.sqrt(2.5), stddev, 0.00001);
+
+        values = Arrays.asList(0, 2, 4, 6, 8);
+        stddev = SensorCtsHelper.getStandardDeviation(values);
+        assertEquals(Math.sqrt(10.0), stddev, 0.00001);
+    }
+
+    /**
      * Test {@link SensorCtsHelper#getFrequency(Number, TimeUnit)}.
      */
     public void testGetFrequency() {
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
index 6633903..f95ea0b 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
@@ -25,8 +25,6 @@
 import android.hardware.cts.helpers.TestSensorEvent;
 import android.util.SparseIntArray;
 
-import com.android.cts.util.StatisticsUtils;
-
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
@@ -133,7 +131,7 @@
         for (int i = 1; i < mTimestamps.size(); i++) {
             deltas.add(mTimestamps.get(i) - mTimestamps.get(i - 1));
         }
-        double deltaMean = StatisticsUtils.getMean(deltas);
+        double deltaMean = SensorCtsHelper.getMean(deltas);
         List<Double> jitters = new ArrayList<Double>(deltas.size());
         for (long delta : deltas) {
             jitters.add(Math.abs(delta - deltaMean));
diff --git a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java b/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
index 4ee9a80..2c926a8 100644
--- a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
+++ b/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
@@ -16,17 +16,14 @@
 
 package android.keystore.cts;
 
-import android.security.KeyPairGeneratorSpec;
 import android.security.KeyStoreParameter;
 import android.test.AndroidTestCase;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
-import java.math.BigInteger;
 import java.security.Key;
 import java.security.KeyFactory;
-import java.security.KeyPairGenerator;
 import java.security.KeyStore;
 import java.security.KeyStore.Entry;
 import java.security.KeyStore.PrivateKeyEntry;
@@ -44,7 +41,6 @@
 import java.security.spec.PKCS8EncodedKeySpec;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Calendar;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Enumeration;
@@ -52,11 +48,9 @@
 import java.util.Iterator;
 import java.util.Set;
 
-import javax.crypto.BadPaddingException;
 import javax.crypto.Cipher;
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
-import javax.security.auth.x500.X500Principal;
 
 public class AndroidKeyStoreTest extends AndroidTestCase {
     private KeyStore mKeyStore;
@@ -2256,51 +2250,4 @@
         assertEquals(Arrays.toString(expectedSecret.getEncoded()),
                 Arrays.toString(actualSecret.getEncoded()));
     }
-
-    public void testKeyStore_Encrypting_RSA_NONE_NOPADDING() throws Exception {
-
-        String alias = "MyKey";
-        KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
-        assertNotNull(ks);
-        ks.load(null);
-
-        Calendar cal = Calendar.getInstance();
-        cal.set(1944, 5, 6);
-        Date now = cal.getTime();
-        cal.clear();
-
-        cal.set(1945, 8, 2);
-        Date end = cal.getTime();
-
-        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
-        assertNotNull(kpg);
-        kpg.initialize(new KeyPairGeneratorSpec.Builder(mContext)
-                .setAlias(alias)
-                .setStartDate(now)
-                .setEndDate(end)
-                .setSerialNumber(BigInteger.valueOf(1))
-                .setSubject(new X500Principal("CN=test1"))
-                .build());
-
-        kpg.generateKeyPair();
-
-        RSAPrivateKey key = (RSAPrivateKey) ks.getKey(alias, null);
-        assertNotNull(key);
-        String cipher = key.getAlgorithm() + "/NONE/NOPADDING";
-        Cipher encrypt = Cipher.getInstance(cipher);
-        assertNotNull(encrypt);
-        encrypt.init(Cipher.ENCRYPT_MODE, key);
-
-        byte[] plainText = new byte[encrypt.getBlockSize()];
-        Arrays.fill(plainText, (byte) 0xFF);
-
-        // We expect a BadPaddingException here as the message size (plaintext)
-        // is bigger than the modulus.
-        try {
-            encrypt.doFinal(plainText);
-            fail("Expected BadPaddingException");
-        } catch (BadPaddingException e) {
-            // pass on exception as it is expected
-        }
-    }
 }
diff --git a/tests/tests/media/libmediandkjni/native-media-jni.cpp b/tests/tests/media/libmediandkjni/native-media-jni.cpp
index 2624c25..9bca242 100644
--- a/tests/tests/media/libmediandkjni/native-media-jni.cpp
+++ b/tests/tests/media/libmediandkjni/native-media-jni.cpp
@@ -234,7 +234,7 @@
     AMediaFormat **format = new AMediaFormat*[numtracks];
     bool *sawInputEOS = new bool[numtracks];
     bool *sawOutputEOS = new bool[numtracks];
-    simplevector<int> *sizes = new simplevector<int>[numtracks];
+    simplevector<int> sizes[numtracks];
 
     ALOGV("input has %d tracks", numtracks);
     for (int i = 0; i < numtracks; i++) {
@@ -354,8 +354,6 @@
     }
     env->ReleaseIntArrayElements(ret, org, 0);
 
-    delete[] sizes;
-    delete[] sawOutputEOS;
     delete[] sawInputEOS;
     for (int i = 0; i < numtracks; i++) {
         AMediaFormat_delete(format[i]);
diff --git a/tests/tests/media/res/raw/monotestgsm.wav b/tests/tests/media/res/raw/monotestgsm.wav
deleted file mode 100644
index 6062f36..0000000
--- a/tests/tests/media/res/raw/monotestgsm.wav
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/src/android/media/cts/DecoderTest.java b/tests/tests/media/src/android/media/cts/DecoderTest.java
index 9014f8d..42f1b23 100644
--- a/tests/tests/media/src/android/media/cts/DecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTest.java
@@ -149,25 +149,20 @@
     }
 
     public void testDecodeMonoMp3() throws Exception {
-        monoTest(R.raw.monotestmp3, 44100);
+        monoTest(R.raw.monotestmp3);
         testTimeStampOrdering(R.raw.monotestmp3);
     }
 
     public void testDecodeMonoM4a() throws Exception {
-        monoTest(R.raw.monotestm4a, 44100);
+        monoTest(R.raw.monotestm4a);
         testTimeStampOrdering(R.raw.monotestm4a);
     }
 
     public void testDecodeMonoOgg() throws Exception {
-        monoTest(R.raw.monotestogg, 44100);
+        monoTest(R.raw.monotestogg);
         testTimeStampOrdering(R.raw.monotestogg);
     }
 
-    public void testDecodeMonoGsm() throws Exception {
-        monoTest(R.raw.monotestgsm, 8000);
-        testTimeStampOrdering(R.raw.monotestgsm);
-    }
-
     public void testDecodeAacTs() throws Exception {
         testTimeStampOrdering(R.raw.sinesweeptsaac);
     }
@@ -503,11 +498,11 @@
     }
 
 
-    private void monoTest(int res, int expectedLength) throws Exception {
+    private void monoTest(int res) throws Exception {
         short [] mono = decodeToMemory(res, RESET_MODE_NONE, CONFIG_MODE_NONE, -1, null);
-        if (mono.length == expectedLength) {
+        if (mono.length == 44100) {
             // expected
-        } else if (mono.length == expectedLength * 2) {
+        } else if (mono.length == 88200) {
             // the decoder output 2 channels instead of 1, check that the left and right channel
             // are identical
             for (int i = 0; i < mono.length; i += 2) {
@@ -518,18 +513,10 @@
         }
 
         short [] mono2 = decodeToMemory(res, RESET_MODE_RECONFIGURE, CONFIG_MODE_NONE, -1, null);
-
-        assertEquals("count different after reconfigure: ", mono.length, mono2.length);
-        for (int i = 0; i < mono.length; i++) {
-            assertEquals("samples at " + i + " don't match", mono[i], mono2[i]);
-        }
+        assertTrue(Arrays.equals(mono, mono2));
 
         short [] mono3 = decodeToMemory(res, RESET_MODE_FLUSH, CONFIG_MODE_NONE, -1, null);
-
-        assertEquals("count different after flush: ", mono.length, mono3.length);
-        for (int i = 0; i < mono.length; i++) {
-            assertEquals("samples at " + i + " don't match", mono[i], mono3[i]);
-        }
+        assertTrue(Arrays.equals(mono, mono3));
     }
 
     /**
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
index 014c1a5..89d6efa 100644
--- a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
+++ b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
@@ -657,7 +657,6 @@
             } catch (InterruptedException e) {
                 // don't care
             }
-            cleanupGl();
             mCompositionThread = null;
             mSurface = null;
             mStartCompletionSemaphore = null;
@@ -967,7 +966,6 @@
 
             public void cleanup() {
                 mNumTextureUpdated.set(0);
-                mVerticesData.clear();
                 if (mTextureId != 0) {
                     int[] textures = new int[] {
                             mTextureId
diff --git a/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java b/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java
index 9da229c..029a632 100644
--- a/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java
+++ b/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java
@@ -29,10 +29,6 @@
 import android.util.Log;
 import android.view.Surface;
 
-import android.media.MediaCodecInfo;
-import android.media.MediaCodecInfo.CodecCapabilities;
-import android.media.MediaCodecInfo.CodecProfileLevel;
-
 import com.android.cts.media.R;
 
 import java.io.File;
@@ -115,28 +111,28 @@
     private String mOutputFile;
 
     public void testExtractDecodeEditEncodeMuxQCIF() throws Throwable {
-        if(!setSize(176, 144)) return;
+        setSize(176, 144);
         setSource(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
         setCopyVideo();
         TestWrapper.runTest(this);
     }
 
     public void testExtractDecodeEditEncodeMuxQVGA() throws Throwable {
-        if(!setSize(320, 240)) return;
+        setSize(320, 240);
         setSource(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
         setCopyVideo();
         TestWrapper.runTest(this);
     }
 
     public void testExtractDecodeEditEncodeMux720p() throws Throwable {
-        if(!setSize(1280, 720)) return;
+        setSize(1280, 720);
         setSource(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
         setCopyVideo();
         TestWrapper.runTest(this);
     }
 
     public void testExtractDecodeEditEncodeMuxAudio() throws Throwable {
-        if(!setSize(1280, 720)) return;
+        setSize(1280, 720);
         setSource(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
         setCopyAudio();
         setVerifyAudioFormat();
@@ -144,7 +140,7 @@
     }
 
     public void testExtractDecodeEditEncodeMuxAudioVideo() throws Throwable {
-        if(!setSize(1280, 720)) return;
+        setSize(1280, 720);
         setSource(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
         setCopyAudio();
         setCopyVideo();
@@ -207,21 +203,14 @@
     }
 
     /**
-     * Sets the desired frame size and returns whether the given resolution is
-     * supported.
-     *
-     * <p>If decoding/encoding using AVC as the codec, checks that the resolution
-     * is supported. For other codecs, always return {@code true}.
+     * Sets the desired frame size.
      */
-    private boolean setSize(int width, int height) {
+    private void setSize(int width, int height) {
         if ((width % 16) != 0 || (height % 16) != 0) {
             Log.w(TAG, "WARNING: width or height not multiple of 16");
         }
         mWidth = width;
         mHeight = height;
-
-	// TODO: remove this logic in setSize as it is now handled when configuring codecs
-        return true;
     }
 
     /**
diff --git a/tests/tests/nativemedia/sl/Android.mk b/tests/tests/nativemedia/sl/Android.mk
index 28dfeff..48b816c 100644
--- a/tests/tests/nativemedia/sl/Android.mk
+++ b/tests/tests/nativemedia/sl/Android.mk
@@ -6,7 +6,6 @@
 list_executable := $(test_executable)_list
 
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_MODULE := $(test_executable)
 LOCAL_MODULE_TAGS := optional
@@ -16,8 +15,11 @@
 LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
 
 LOCAL_C_INCLUDES := \
+    bionic \
+    bionic/libstdc++/include \
     external/gtest/include \
     $(call include-path-for, wilhelm) \
+    external/stlport/stlport \
     $(call include-path-for, wilhelm-ut)
 
 LOCAL_SRC_FILES := \
@@ -27,6 +29,7 @@
     libutils \
     liblog \
     libOpenSLES \
+    libstlport
 
 LOCAL_STATIC_LIBRARIES := \
     libOpenSLESUT \
@@ -36,7 +39,6 @@
 include $(BUILD_CTS_EXECUTABLE)
 
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_MODULE := $(list_executable)
 LOCAL_MODULE_TAGS := optional
diff --git a/tests/tests/nativemedia/xa/Android.mk b/tests/tests/nativemedia/xa/Android.mk
index 52126c3..ace315a 100644
--- a/tests/tests/nativemedia/xa/Android.mk
+++ b/tests/tests/nativemedia/xa/Android.mk
@@ -6,7 +6,6 @@
 list_executable := $(test_executable)_list
 
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_MODULE:= $(test_executable)
 LOCAL_MODULE_TAGS := optional
@@ -16,8 +15,11 @@
 LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
 
 LOCAL_C_INCLUDES := \
+    bionic \
+    bionic/libstdc++/include \
     external/gtest/include \
     $(call include-path-for, wilhelm) \
+    external/stlport/stlport \
     $(call include-path-for, wilhelm-ut)
 
 LOCAL_SRC_FILES := \
@@ -27,15 +29,15 @@
   libutils \
   liblog \
   libOpenMAXAL \
+  libstlport
 
 LOCAL_STATIC_LIBRARIES := \
-  libgtest \
+    libgtest
 
 LOCAL_CTS_TEST_PACKAGE := android.nativemedia.xa
 include $(BUILD_CTS_EXECUTABLE)
 
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_MODULE := $(list_executable)
 LOCAL_MODULE_TAGS := optional
diff --git a/tests/tests/nativeopengl/libnativeopengltests/Android.mk b/tests/tests/nativeopengl/libnativeopengltests/Android.mk
index 62e28ec..5d7dd6e 100644
--- a/tests/tests/nativeopengl/libnativeopengltests/Android.mk
+++ b/tests/tests/nativeopengl/libnativeopengltests/Android.mk
@@ -16,11 +16,9 @@
 # This is the shared library included by the JNI test app.
 #
 
-LOCAL_PATH := $(call my-dir)/../standalone/jni/
-REAL_LOCAL_PATH := $(call my-dir)
+LOCAL_PATH:= $(call my-dir)/../standalone/jni/
 
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(REAL_LOCAL_PATH)/Android.mk
 
 LOCAL_MODULE := libnativeopengltests
 
@@ -28,7 +26,10 @@
 LOCAL_MODULE_TAGS := optional
 
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) \
+    bionic \
+    bionic/libstdc++/include \
     external/gtest/include \
+    external/stlport/stlport
 
 LOCAL_SRC_FILES := \
         register.cpp \
@@ -37,11 +38,11 @@
         tests/EGLCleanup_test.cpp \
         tests/EGLCreateContext_test.cpp
 
-LOCAL_CXX_STL := libc++
 LOCAL_SHARED_LIBRARIES := libEGL \
                           libGLESv2 \
+                          libstlport \
                           libandroid \
-                          liblog \
+                          liblog
 
 LOCAL_STATIC_LIBRARIES := libgtest
 
diff --git a/tests/tests/net/Android.mk b/tests/tests/net/Android.mk
index f6e5c90..46d4d81 100644
--- a/tests/tests/net/Android.mk
+++ b/tests/tests/net/Android.mk
@@ -26,15 +26,15 @@
 
 LOCAL_JAVA_LIBRARIES := voip-common conscrypt
 
-LOCAL_JNI_SHARED_LIBRARIES := libcts_jni libnativedns_jni
+LOCAL_JNI_SHARED_LIBRARIES := libnativedns_jni
 
 # include CtsTestServer as a temporary hack to free net.cts from cts.stub.
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsNetTestCases
 
-LOCAL_STATIC_JAVA_LIBRARIES := core-tests-support  ctsdeviceutil \
-                               ctstestrunner ctstestserver mockwebserver
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestserver ctsdeviceutil ctstestrunner \
+                               core-tests-support
 
 # uncomment when b/13249961 is fixed
 #LOCAL_SDK_VERSION := current
diff --git a/tests/tests/net/jni/NativeDnsJni.c b/tests/tests/net/jni/NativeDnsJni.c
index 4eb3c7a..b975594 100644
--- a/tests/tests/net/jni/NativeDnsJni.c
+++ b/tests/tests/net/jni/NativeDnsJni.c
@@ -18,7 +18,6 @@
 #include <jni.h>
 #include <netdb.h>
 #include <stdio.h>
-#include <string.h>
 #include <utils/Log.h>
 
 const char *GoogleDNSIpV4Address="8.8.8.8";
diff --git a/tests/tests/net/src/android/net/cts/LocalSocketTest.java b/tests/tests/net/src/android/net/cts/LocalSocketTest.java
index 865ec21..0a4bc0d 100644
--- a/tests/tests/net/src/android/net/cts/LocalSocketTest.java
+++ b/tests/tests/net/src/android/net/cts/LocalSocketTest.java
@@ -126,8 +126,8 @@
         socket.setReceiveBufferSize(1999);
         assertEquals(1999 << 1, socket.getReceiveBufferSize());
 
-        socket.setSendBufferSize(3998);
-        assertEquals(3998 << 1, socket.getSendBufferSize());
+        socket.setSendBufferSize(1998);
+        assertEquals(1998 << 1, socket.getSendBufferSize());
 
         // Timeout is not support at present, so set is ignored
         socket.setSoTimeout(1996);
diff --git a/tests/tests/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java b/tests/tests/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java
index 60ac226..6175923 100644
--- a/tests/tests/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java
+++ b/tests/tests/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java
@@ -26,7 +26,7 @@
 import android.net.SSLCertificateSocketFactory;
 import android.test.AndroidTestCase;
 
-import libcore.javax.net.ssl.SSLConfigurationAsserts;
+import libcore.javax.net.ssl.SSLDefaultConfigurationAsserts;
 
 public class SSLCertificateSocketFactoryTest extends AndroidTestCase {
     private SSLCertificateSocketFactory mFactory;
@@ -40,7 +40,7 @@
     }
 
     public void testDefaultConfiguration() throws Exception {
-        SSLConfigurationAsserts.assertSSLSocketFactoryDefaultConfiguration(mFactory);
+        SSLDefaultConfigurationAsserts.assertSSLSocketFactory(mFactory);
     }
 
     public void testAccessProperties() throws Exception {
diff --git a/tests/tests/net/src/android/net/http/cts/HttpResponseCacheTest.java b/tests/tests/net/src/android/net/http/cts/HttpResponseCacheTest.java
deleted file mode 100644
index 545541d..0000000
--- a/tests/tests/net/src/android/net/http/cts/HttpResponseCacheTest.java
+++ /dev/null
@@ -1,158 +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.net.http.cts;
-
-import com.google.mockwebserver.MockResponse;
-import com.google.mockwebserver.MockWebServer;
-
-import junit.framework.TestCase;
-
-import android.cts.util.FileUtils;
-import android.net.http.HttpResponseCache;
-
-import java.io.File;
-import java.io.InputStream;
-import java.net.CacheRequest;
-import java.net.CacheResponse;
-import java.net.ResponseCache;
-import java.net.URI;
-import java.net.URLConnection;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-public final class HttpResponseCacheTest extends TestCase {
-
-    private File cacheDir;
-    private MockWebServer server = new MockWebServer();
-
-    @Override public void setUp() throws Exception {
-        super.setUp();
-        String tmp = System.getProperty("java.io.tmpdir");
-        cacheDir = new File(tmp, "HttpCache-" + UUID.randomUUID());
-        cacheDir.mkdirs();
-        // Make the cache directory read / writable.
-        FileUtils.setPermissions(cacheDir.getPath(), 0777);
-    }
-
-    @Override protected void tearDown() throws Exception {
-        ResponseCache.setDefault(null);
-        server.shutdown();
-        super.tearDown();
-    }
-
-    public void testInstall() throws Exception {
-        HttpResponseCache installed = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
-        assertNotNull(installed);
-        assertSame(installed, ResponseCache.getDefault());
-        assertSame(installed, HttpResponseCache.getDefault());
-    }
-
-    public void testSecondEquivalentInstallDoesNothing() throws Exception {
-        HttpResponseCache first = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
-        HttpResponseCache another = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
-        assertSame(first, another);
-    }
-
-    public void testInstallClosesPreviouslyInstalled() throws Exception {
-        HttpResponseCache first = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
-        initializeCache(first);
-
-        HttpResponseCache another = HttpResponseCache.install(cacheDir, 8 * 1024 * 1024);
-        initializeCache(first);
-
-        assertNotSame(first, another);
-        try {
-            first.flush();
-            fail();
-        } catch (IllegalStateException expected) {
-        }
-    }
-
-    public void testGetInstalledWithWrongTypeInstalled() {
-        ResponseCache.setDefault(new ResponseCache() {
-            @Override public CacheResponse get(URI uri, String requestMethod,
-                    Map<String, List<String>> requestHeaders) {
-                return null;
-            }
-            @Override public CacheRequest put(URI uri, URLConnection connection) {
-                return null;
-            }
-        });
-        assertNull(HttpResponseCache.getInstalled());
-    }
-
-    public void testCloseCloses() throws Exception {
-        HttpResponseCache cache = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
-        initializeCache(cache);
-
-        cache.close();
-        try {
-            cache.flush();
-            fail();
-        } catch (IllegalStateException expected) {
-        }
-    }
-
-    public void testCloseUninstalls() throws Exception {
-        HttpResponseCache cache = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
-        cache.close();
-        assertNull(ResponseCache.getDefault());
-    }
-
-    public void testDeleteUninstalls() throws Exception {
-        HttpResponseCache cache = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
-        cache.delete();
-        assertNull(ResponseCache.getDefault());
-    }
-
-    /**
-     * Make sure that statistics tracking are wired all the way through the
-     * wrapper class. http://code.google.com/p/android/issues/detail?id=25418
-     */
-    public void testStatisticsTracking() throws Exception {
-        HttpResponseCache cache = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
-
-        server.enqueue(new MockResponse()
-                .addHeader("Cache-Control: max-age=60")
-                .setBody("A"));
-        server.play();
-
-        URLConnection c1 = server.getUrl("/").openConnection();
-        InputStream inputStream1 = c1.getInputStream();
-        assertEquals('A', inputStream1.read());
-        inputStream1.close();
-
-        assertEquals(1, cache.getRequestCount());
-        assertEquals(1, cache.getNetworkCount());
-        assertEquals(0, cache.getHitCount());
-
-        URLConnection c2 = server.getUrl("/").openConnection();
-        assertEquals('A', c2.getInputStream().read());
-
-        URLConnection c3 = server.getUrl("/").openConnection();
-        assertEquals('A', c3.getInputStream().read());
-        assertEquals(3, cache.getRequestCount());
-        assertEquals(1, cache.getNetworkCount());
-        assertEquals(2, cache.getHitCount());
-    }
-
-    private void initializeCache(HttpResponseCache cache) {
-        // Ensure the cache is initialized, otherwise various methods are no-ops.
-        cache.size();
-    }
-}
diff --git a/tests/tests/net/src/android/net/wifi/cts/NsdManagerTest.java b/tests/tests/net/src/android/net/wifi/cts/NsdManagerTest.java
index e132cce..d434728 100644
--- a/tests/tests/net/src/android/net/wifi/cts/NsdManagerTest.java
+++ b/tests/tests/net/src/android/net/wifi/cts/NsdManagerTest.java
@@ -372,6 +372,8 @@
         assertTrue(lastEvent != null);
         assertTrue(lastEvent.mInfo.getServiceName().equals(registeredName));
 
+        assertTrue(eventCacheSize() == 2);
+
         // Register service again to see if we discover it
         checkForAdditionalEvents();
         clearEventCache();
@@ -403,6 +405,7 @@
                 lastEvent.mInfo.getServiceName());
 
         assertTrue(lastEvent.mInfo.getServiceName().equals(registeredName));
+        assertTrue(checkCacheSize(2));
 
         checkForAdditionalEvents();
         clearEventCache();
diff --git a/tests/tests/os/jni/Android.mk b/tests/tests/os/jni/Android.mk
index dd3bb51..32a5a9c 100644
--- a/tests/tests/os/jni/Android.mk
+++ b/tests/tests/os/jni/Android.mk
@@ -25,13 +25,12 @@
 		CtsOsJniOnLoad.cpp \
 		android_os_cts_CpuInstructions.cpp.arm \
 		android_os_cts_TaggedPointer.cpp \
-		android_os_cts_HardwareName.cpp \
 		android_os_cts_OSFeatures.cpp \
 		android_os_cts_NoExecutePermissionTest.cpp
 
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
 
-LOCAL_SHARED_LIBRARIES := libnativehelper liblog libdl libcutils
+LOCAL_SHARED_LIBRARIES := libnativehelper liblog libdl
 
 LOCAL_SRC_FILES += android_os_cts_CpuFeatures.cpp
 LOCAL_C_INCLUDES += ndk/sources/cpufeatures
diff --git a/tests/tests/os/jni/CtsOsJniOnLoad.cpp b/tests/tests/os/jni/CtsOsJniOnLoad.cpp
index e4a0dc0..3920915 100644
--- a/tests/tests/os/jni/CtsOsJniOnLoad.cpp
+++ b/tests/tests/os/jni/CtsOsJniOnLoad.cpp
@@ -23,8 +23,6 @@
 
 extern int register_android_os_cts_TaggedPointer(JNIEnv*);
 
-extern int register_android_os_cts_HardwareName(JNIEnv*);
-
 extern int register_android_os_cts_OSFeatures(JNIEnv*);
 
 extern int register_android_os_cts_NoExecutePermissionTest(JNIEnv*);
@@ -48,10 +46,6 @@
         return JNI_ERR;
     }
 
-    if (register_android_os_cts_HardwareName(env)) {
-        return JNI_ERR;
-    }
-
     if (register_android_os_cts_OSFeatures(env)) {
         return JNI_ERR;
     }
diff --git a/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp b/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
index 15006f0..3eea71b 100644
--- a/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
+++ b/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
@@ -19,7 +19,6 @@
 #if defined(__arm__) || defined(__aarch64__)
 #include <setjmp.h>
 #include <signal.h>
-#include <string.h>
 
 static sigjmp_buf jmpenv;
 
diff --git a/tests/tests/os/jni/android_os_cts_HardwareName.cpp b/tests/tests/os/jni/android_os_cts_HardwareName.cpp
deleted file mode 100644
index 6752aa3..0000000
--- a/tests/tests/os/jni/android_os_cts_HardwareName.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 <jni.h>
-
-#include <cutils/properties.h>
-
-jstring android_os_cts_HardwareName_getName(JNIEnv* env, jobject thiz)
-{
-    char name[PROPERTY_VALUE_MAX];
-    int ret;
-
-    ret = property_get("ro.boot.hardware", name, NULL);
-    if (ret <= 0) {
-        return NULL;
-    }
-
-    return env->NewStringUTF(name);
-}
-
-static JNINativeMethod gMethods[] = {
-    {  "getName", "()Ljava/lang/String;",
-            (void *) android_os_cts_HardwareName_getName },
-};
-
-int register_android_os_cts_HardwareName(JNIEnv* env)
-{
-    jclass clazz = env->FindClass("android/os/cts/HardwareName");
-
-    return env->RegisterNatives(clazz, gMethods,
-            sizeof(gMethods) / sizeof(JNINativeMethod));
-}
diff --git a/tests/tests/os/jni/android_os_cts_NoExecutePermissionTest.cpp b/tests/tests/os/jni/android_os_cts_NoExecutePermissionTest.cpp
index 5425fde..e30599c 100644
--- a/tests/tests/os/jni/android_os_cts_NoExecutePermissionTest.cpp
+++ b/tests/tests/os/jni/android_os_cts_NoExecutePermissionTest.cpp
@@ -14,7 +14,6 @@
  * limitations under the License.
  *
  */
-#include <errno.h>
 #include <jni.h>
 #include <string.h>
 #include <stdio.h>
diff --git a/tests/tests/os/jni/android_os_cts_OSFeatures.cpp b/tests/tests/os/jni/android_os_cts_OSFeatures.cpp
index 2ee31b1..5f3ee4e 100644
--- a/tests/tests/os/jni/android_os_cts_OSFeatures.cpp
+++ b/tests/tests/os/jni/android_os_cts_OSFeatures.cpp
@@ -14,21 +14,18 @@
  * limitations under the License.
  *
  */
-
-#include "jni.h"
-
-#include <errno.h>
+#include <jni.h>
+#include <sys/prctl.h>
+#include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <unistd.h>
 
 #include <linux/filter.h>
 #include <linux/seccomp.h>
 
-#include <sys/prctl.h>
-#include <sys/types.h>
 #include <sys/utsname.h>
+#include <sys/types.h>
 #include <sys/wait.h>
 
 jint android_os_cts_OSFeatures_getNoNewPrivs(JNIEnv* env, jobject thiz)
diff --git a/tests/tests/os/jni/android_os_cts_TaggedPointer.cpp b/tests/tests/os/jni/android_os_cts_TaggedPointer.cpp
index f656f50..e8f83a3 100644
--- a/tests/tests/os/jni/android_os_cts_TaggedPointer.cpp
+++ b/tests/tests/os/jni/android_os_cts_TaggedPointer.cpp
@@ -20,7 +20,6 @@
 #include <signal.h>
 #include <stdbool.h>
 #include <stdlib.h>
-#include <string.h>
 
 //mask the top 8 bits
 #define TAG_MASK ((0xFFULL) << 56)
diff --git a/tests/tests/os/src/android/os/cts/HardwareName.java b/tests/tests/os/src/android/os/cts/HardwareName.java
deleted file mode 100644
index 7ee80e6..0000000
--- a/tests/tests/os/src/android/os/cts/HardwareName.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.os.cts;
-
-public class HardwareName {
-
-    static {
-        System.loadLibrary("ctsos_jni");
-    }
-
-    public static native String getName();
-}
diff --git a/tests/tests/os/src/android/os/cts/HardwareNameTest.java b/tests/tests/os/src/android/os/cts/HardwareNameTest.java
deleted file mode 100644
index 7a754d1..0000000
--- a/tests/tests/os/src/android/os/cts/HardwareNameTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.os.cts;
-
-import android.test.AndroidTestCase;
-import android.os.cts.HardwareName;
-
-public class HardwareNameTest extends AndroidTestCase {
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
-    public void testHardwareNameIsSet() {
-        String name = HardwareName.getName();
-        assertNotNull("androidboot.hardware must be passed on the kernel command line", name);
-    }
-}
diff --git a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
old mode 100644
new mode 100755
index f590f97..babc93f
--- a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
@@ -164,7 +164,6 @@
         assertFalse(f.canRead());
         assertFalse(f.canWrite());
         assertFalse(f.canExecute());
-        assertFalse(f.exists());
     }
 
     @MediumTest
@@ -173,7 +172,6 @@
         assertFalse(f.canRead());
         assertFalse(f.canWrite());
         assertFalse(f.canExecute());
-        assertFalse(f.exists());
     }
 
     @MediumTest
@@ -719,6 +717,21 @@
         assertTrue(mountPoint + " is not mounted read-only", pm.isMountReadOnly(mountPoint));
     }
 
+    /**
+     * Test that the /system directory, as mounted by init, is mounted read-only.
+     * Different processes can have different mount namespaces, so init
+     * may be in a different mount namespace than Zygote spawned processes.
+     *
+     * This test assumes that init's filesystem layout is roughly identical
+     * to Zygote's filesystem layout. If this assumption ever changes, we should
+     * delete this test.
+     */
+    public void testSystemMountedRO_init() throws IOException {
+        ParsedMounts pm = new ParsedMounts("/proc/1/mounts");
+        String mountPoint = pm.findMountPointContaining(new File("/system"));
+        assertTrue(mountPoint + " is not mounted read-only", pm.isMountReadOnly(mountPoint));
+    }
+
     public void testRootMountedRO() throws IOException {
         ParsedMounts pm = new ParsedMounts("/proc/self/mounts");
         String mountPoint = pm.findMountPointContaining(new File("/"));
@@ -726,6 +739,22 @@
                    pm.isMountReadOnly(mountPoint));
     }
 
+    /**
+     * Test that the root directory, as mounted by init, is mounted read-only.
+     * Different processes can have different mount namespaces, so init
+     * may be in a different mount namespace than Zygote spawned processes.
+     *
+     * This test assumes that init's filesystem layout is roughly identical
+     * to Zygote's filesystem layout. If this assumption ever changes, we should
+     * delete this test.
+     */
+    public void testRootMountedRO_init() throws IOException {
+        ParsedMounts pm = new ParsedMounts("/proc/1/mounts");
+        String mountPoint = pm.findMountPointContaining(new File("/"));
+        assertTrue("The root directory \"" + mountPoint + "\" is not mounted read-only",
+                   pm.isMountReadOnly(mountPoint));
+    }
+
     public void testAllBlockDevicesAreSecure() throws Exception {
         Set<File> insecure = getAllInsecureDevicesInDirAndSubdir(new File("/dev"), FileUtils.S_IFBLK);
         assertTrue("Found insecure block devices: " + insecure.toString(),
diff --git a/tests/tests/provider/src/android/provider/cts/BrowserTest.java b/tests/tests/provider/src/android/provider/cts/BrowserTest.java
index 9f96412..2f0432a 100644
--- a/tests/tests/provider/src/android/provider/cts/BrowserTest.java
+++ b/tests/tests/provider/src/android/provider/cts/BrowserTest.java
@@ -84,9 +84,7 @@
                     value.put(colNames[i], cursor.getFloat(i));
                     break;
                 case Cursor.FIELD_TYPE_INTEGER:
-                    if (!"_ID".equalsIgnoreCase(colNames[i])) {
-                        value.put(colNames[i], cursor.getLong(i));
-                    }
+                    value.put(colNames[i], cursor.getLong(i));
                     break;
                 case Cursor.FIELD_TYPE_STRING:
                     value.put(colNames[i], cursor.getString(i));
diff --git a/tests/tests/renderscript/libcoremathtestcpp/Android.mk b/tests/tests/renderscript/libcoremathtestcpp/Android.mk
index 3b693e0..7ec8671 100644
--- a/tests/tests/renderscript/libcoremathtestcpp/Android.mk
+++ b/tests/tests/renderscript/libcoremathtestcpp/Android.mk
@@ -17,17 +17,15 @@
 #
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 LOCAL_MODULE := libcoremathtestcpp_jni
 LOCAL_MODULE_TAGS := optional
 LOCAL_SRC_FILES := CoreMathTestJni.cpp
 
-LOCAL_CFLAGS := -std=c++11
-
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
 LOCAL_C_INCLUDES += frameworks/rs/cpp
 LOCAL_C_INCLUDES += frameworks/rs
+LOCAL_C_INCLUDES += external/stlport/stlport bionic/ bionic/libstdc++/include
 
-LOCAL_SHARED_LIBRARIES := libdl liblog libRScpp
+LOCAL_SHARED_LIBRARIES := libdl liblog libRScpp libstlport
 LOCAL_STATIC_LIBRARIES := libcutils
 include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java b/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
index 653329b..dfcf1f5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
@@ -290,14 +290,14 @@
     }
 
     static private Target.Floaty atan2(float y, float x, Target t) {
-        Target.Floaty numerator = t.new32(y);
-        Target.Floaty denominator = t.new32(x);
+        Target.Floaty inY = t.new32(y);
+        Target.Floaty inX = t.new32(x);
         return t.new32(
-            atan2(numerator.mid32(), denominator.mid32()),
-            atan2(numerator.min32(), denominator.min32()),
-            atan2(numerator.min32(), denominator.max32()),
-            atan2(numerator.max32(), denominator.min32()),
-            atan2(numerator.max32(), denominator.max32()));
+            atan2(inY.mid32(), inX.mid32()),
+            atan2(inY.min32(), inX.min32()),
+            atan2(inY.min32(), inX.max32()),
+            atan2(inY.max32(), inX.min32()),
+            atan2(inY.max32(), inX.max32()));
     }
 
     static private Target.Floaty atan2pi(float y, float x, Target t) {
@@ -462,14 +462,14 @@
     }
 
     static private Target.Floaty powr(float x, float y, Target t) {
-        Target.Floaty base = t.new32(x);
-        Target.Floaty exponent = t.new32(y);
+        Target.Floaty inX = t.new32(x);
+        Target.Floaty inY = t.new32(y);
         return t.new32(
-            pow(base.mid32(), exponent.mid32()),
-            pow(base.min32(), exponent.min32()),
-            pow(base.min32(), exponent.max32()),
-            pow(base.max32(), exponent.min32()),
-            pow(base.max32(), exponent.max32()));
+            pow(inX.mid32(), inY.mid32()),
+            pow(inX.min32(), inY.min32()),
+            pow(inX.min32(), inY.max32()),
+            pow(inX.max32(), inY.min32()),
+            pow(inX.max32(), inY.max32()));
     }
 
     static private Target.Floaty recip(float f, Target t) {
@@ -569,622 +569,622 @@
         }
     }
 
-    static public void computeAbs(GeneratedTestAbs.ArgumentsCharUchar args) {
-        args.out = (byte)Math.abs(args.inV);
+    static public void computeAbs(TestAbs.ArgumentsCharUchar args) {
+        args.out = (byte)Math.abs(args.inValue);
     }
 
-    static public void computeAbs(GeneratedTestAbs.ArgumentsShortUshort args) {
-        args.out = (short)Math.abs(args.inV);
+    static public void computeAbs(TestAbs.ArgumentsShortUshort args) {
+        args.out = (short)Math.abs(args.inValue);
     }
 
-    static public void computeAbs(GeneratedTestAbs.ArgumentsIntUint args) {
-        args.out = Math.abs(args.inV);
+    static public void computeAbs(TestAbs.ArgumentsIntUint args) {
+        args.out = Math.abs(args.inValue);
     }
 
-    static public void computeAcos(GeneratedTestAcos.ArgumentsFloatFloat args, Target t) {
+    static public void computeAcos(TestAcos.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(4, 128, false);
         args.out = acos(args.inV, t);
     }
 
-    static public void computeAcosh(GeneratedTestAcosh.ArgumentsFloatFloat args, Target t) {
+    static public void computeAcosh(TestAcosh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(4, 128, false);
-        args.out = acosh(args.inV, t);
+        args.out = acosh(args.in, t);
     }
 
-    static public void computeAcospi(GeneratedTestAcospi.ArgumentsFloatFloat args, Target t) {
+    static public void computeAcospi(TestAcospi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(5, 128, false);
         args.out = acospi(args.inV, t);
     }
 
-    static public void computeAsin(GeneratedTestAsin.ArgumentsFloatFloat args, Target t) {
+    static public void computeAsin(TestAsin.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(4, 128, false);
         args.out = asin(args.inV, t);
     }
 
-    static public void computeAsinh(GeneratedTestAsinh.ArgumentsFloatFloat args, Target t) {
+    static public void computeAsinh(TestAsinh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(4, 128, false);
-        args.out = asinh(args.inV, t);
+        args.out = asinh(args.in, t);
     }
 
-    static public void computeAsinpi(GeneratedTestAsinpi.ArgumentsFloatFloat args, Target t) {
+    static public void computeAsinpi(TestAsinpi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(5, 128, false);
         args.out = asinpi(args.inV, t);
     }
 
-    static public void computeAtan(GeneratedTestAtan.ArgumentsFloatFloat args, Target t) {
+    static public void computeAtan(TestAtan.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(5, 128, false);
         args.out = atan(args.inV, t);
     }
 
-    static public void computeAtanh(GeneratedTestAtanh.ArgumentsFloatFloat args, Target t) {
+    static public void computeAtanh(TestAtanh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(5, 128, false);
         args.out = atanh(args.inV, t);
     }
 
-    static public void computeAtanpi(GeneratedTestAtanpi.ArgumentsFloatFloat args, Target t) {
+    static public void computeAtanpi(TestAtanpi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(5, 128, false);
         args.out = atanpi(args.inV, t);
     }
 
-    static public void computeAtan2(GeneratedTestAtan2.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeAtan2(TestAtan2.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(6, 128, false);
-        args.out = atan2(args.inNumerator, args.inDenominator, t);
+        args.out = atan2(args.inY, args.inX, t);
     }
 
-    static public void computeAtan2pi(GeneratedTestAtan2pi.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeAtan2pi(TestAtan2pi.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(6, 128, false);
-        args.out = atan2pi(args.inNumerator, args.inDenominator, t);
+        args.out = atan2pi(args.inY, args.inX, t);
     }
 
-    static public void computeCbrt(GeneratedTestCbrt.ArgumentsFloatFloat args, Target t) {
+    static public void computeCbrt(TestCbrt.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(2, 128, false);
-        args.out = cbrt(args.inV, t);
+        args.out = cbrt(args.in, t);
     }
 
-    static public void computeCeil(GeneratedTestCeil.ArgumentsFloatFloat args, Target t) {
+    static public void computeCeil(TestCeil.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(0, 1, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.in);
         args.out = t.new32(
             ceil(in.mid32()),
             ceil(in.min32()),
             ceil(in.max32()));
     }
 
-    static public void computeClamp(GeneratedTestClamp.ArgumentsCharCharCharChar args) {
+    static public void computeClamp(TestClamp.ArgumentsCharCharCharChar args) {
         args.out = minI8(args.inMaxValue, maxI8(args.inValue, args.inMinValue));
     }
 
-    static public void computeClamp(GeneratedTestClamp.ArgumentsUcharUcharUcharUchar args) {
+    static public void computeClamp(TestClamp.ArgumentsUcharUcharUcharUchar args) {
         args.out = minU8(args.inMaxValue, maxU8(args.inValue, args.inMinValue));
     }
 
-    static public void computeClamp(GeneratedTestClamp.ArgumentsShortShortShortShort args) {
+    static public void computeClamp(TestClamp.ArgumentsShortShortShortShort args) {
         args.out = minI16(args.inMaxValue, maxI16(args.inValue, args.inMinValue));
     }
 
-    static public void computeClamp(GeneratedTestClamp.ArgumentsUshortUshortUshortUshort args) {
+    static public void computeClamp(TestClamp.ArgumentsUshortUshortUshortUshort args) {
         args.out = minU16(args.inMaxValue, maxU16(args.inValue, args.inMinValue));
     }
 
-    static public void computeClamp(GeneratedTestClamp.ArgumentsIntIntIntInt args) {
+    static public void computeClamp(TestClamp.ArgumentsIntIntIntInt args) {
         args.out = minI32(args.inMaxValue, maxI32(args.inValue, args.inMinValue));
     }
 
-    static public void computeClamp(GeneratedTestClamp.ArgumentsUintUintUintUint args) {
+    static public void computeClamp(TestClamp.ArgumentsUintUintUintUint args) {
         args.out = minU32(args.inMaxValue, maxU32(args.inValue, args.inMinValue));
     }
 
-    static public void computeClamp(GeneratedTestClamp.ArgumentsFloatFloatFloatFloat args, Target t) {
+    static public void computeClamp(TestClamp.ArgumentsFloatFloatFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new32(Math.min(args.inMaxValue,
                         Math.max(args.inValue, args.inMinValue)));
     }
 
-    static public void computeClamp(GeneratedTestClamp.ArgumentsLongLongLongLong args) {
+    static public void computeClamp(TestClamp.ArgumentsLongLongLongLong args) {
         args.out = minI64(args.inMaxValue, maxI64(args.inValue, args.inMinValue));
     }
 
-    static public void computeClamp(GeneratedTestClamp.ArgumentsUlongUlongUlongUlong args) {
+    static public void computeClamp(TestClamp.ArgumentsUlongUlongUlongUlong args) {
         args.out = minU64(args.inMaxValue, maxU64(args.inValue, args.inMinValue));
     }
 
-    static public void computeClz(GeneratedTestClz.ArgumentsCharChar args) {
+    static public void computeClz(TestClz.ArgumentsCharChar args) {
         int x = args.inValue;
         args.out = (byte) (Integer.numberOfLeadingZeros(x & 0xff) - 24);
     }
 
-    static public void computeClz(GeneratedTestClz.ArgumentsUcharUchar args) {
+    static public void computeClz(TestClz.ArgumentsUcharUchar args) {
         int x = args.inValue;
         args.out = (byte) (Integer.numberOfLeadingZeros(x & 0xff) - 24);
     }
 
-    static public void computeClz(GeneratedTestClz.ArgumentsShortShort args) {
+    static public void computeClz(TestClz.ArgumentsShortShort args) {
         args.out = (short) (Integer.numberOfLeadingZeros(args.inValue & 0xffff) - 16);
     }
 
-    static public void computeClz(GeneratedTestClz.ArgumentsUshortUshort args) {
+    static public void computeClz(TestClz.ArgumentsUshortUshort args) {
         args.out = (short) (Integer.numberOfLeadingZeros(args.inValue & 0xffff) - 16);
     }
 
-    static public void computeClz(GeneratedTestClz.ArgumentsIntInt args) {
+    static public void computeClz(TestClz.ArgumentsIntInt args) {
         args.out = (int) Integer.numberOfLeadingZeros(args.inValue);
     }
 
-    static public void computeClz(GeneratedTestClz.ArgumentsUintUint args) {
+    static public void computeClz(TestClz.ArgumentsUintUint args) {
         args.out = (int) Integer.numberOfLeadingZeros(args.inValue);
     }
 
 
-    static public void computeConvert(GeneratedTestConvert.ArgumentsCharChar args) {
+    static public void computeConvert(TestConvert.ArgumentsCharChar args) {
         args.out = convertCharToChar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsCharUchar args) {
+    static public void computeConvert(TestConvert.ArgumentsCharUchar args) {
         args.out = convertCharToUchar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsCharShort args) {
+    static public void computeConvert(TestConvert.ArgumentsCharShort args) {
         args.out = convertCharToShort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsCharUshort args) {
+    static public void computeConvert(TestConvert.ArgumentsCharUshort args) {
         args.out = convertCharToUshort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsCharInt args) {
+    static public void computeConvert(TestConvert.ArgumentsCharInt args) {
         args.out = convertCharToInt(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsCharUint args) {
+    static public void computeConvert(TestConvert.ArgumentsCharUint args) {
         args.out = convertCharToUint(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsCharLong args) {
+    static public void computeConvert(TestConvert.ArgumentsCharLong args) {
         args.out = convertCharToLong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsCharUlong args) {
+    static public void computeConvert(TestConvert.ArgumentsCharUlong args) {
         args.out = convertCharToUlong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsCharFloat args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsCharFloat args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new32(convertCharToFloat(args.inV));
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsCharDouble args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsCharDouble args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new64(convertCharToDouble(args.inV));
     }
 
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUcharChar args) {
+    static public void computeConvert(TestConvert.ArgumentsUcharChar args) {
         args.out = convertUcharToChar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUcharUchar args) {
+    static public void computeConvert(TestConvert.ArgumentsUcharUchar args) {
         args.out = convertUcharToUchar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUcharShort args) {
+    static public void computeConvert(TestConvert.ArgumentsUcharShort args) {
         args.out = convertUcharToShort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUcharUshort args) {
+    static public void computeConvert(TestConvert.ArgumentsUcharUshort args) {
         args.out = convertUcharToUshort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUcharInt args) {
+    static public void computeConvert(TestConvert.ArgumentsUcharInt args) {
         args.out = convertUcharToInt(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUcharUint args) {
+    static public void computeConvert(TestConvert.ArgumentsUcharUint args) {
         args.out = convertUcharToUint(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUcharLong args) {
+    static public void computeConvert(TestConvert.ArgumentsUcharLong args) {
         args.out = convertUcharToLong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUcharUlong args) {
+    static public void computeConvert(TestConvert.ArgumentsUcharUlong args) {
         args.out = convertUcharToUlong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUcharFloat args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsUcharFloat args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new32(convertUcharToFloat(args.inV));
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUcharDouble args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsUcharDouble args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new64(convertUcharToDouble(args.inV));
     }
 
-    static public void computeConvert(GeneratedTestConvert.ArgumentsShortChar args) {
+    static public void computeConvert(TestConvert.ArgumentsShortChar args) {
         args.out = convertShortToChar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsShortUchar args) {
+    static public void computeConvert(TestConvert.ArgumentsShortUchar args) {
         args.out = convertShortToUchar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsShortShort args) {
+    static public void computeConvert(TestConvert.ArgumentsShortShort args) {
         args.out = convertShortToShort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsShortUshort args) {
+    static public void computeConvert(TestConvert.ArgumentsShortUshort args) {
         args.out = convertShortToUshort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsShortInt args) {
+    static public void computeConvert(TestConvert.ArgumentsShortInt args) {
         args.out = convertShortToInt(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsShortUint args) {
+    static public void computeConvert(TestConvert.ArgumentsShortUint args) {
         args.out = convertShortToUint(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsShortLong args) {
+    static public void computeConvert(TestConvert.ArgumentsShortLong args) {
         args.out = convertShortToLong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsShortUlong args) {
+    static public void computeConvert(TestConvert.ArgumentsShortUlong args) {
         args.out = convertShortToUlong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsShortFloat args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsShortFloat args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new32(convertShortToFloat(args.inV));
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsShortDouble args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsShortDouble args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new64(convertShortToDouble(args.inV));
     }
 
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUshortChar args) {
+    static public void computeConvert(TestConvert.ArgumentsUshortChar args) {
         args.out = convertUshortToChar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUshortUchar args) {
+    static public void computeConvert(TestConvert.ArgumentsUshortUchar args) {
         args.out = convertUshortToUchar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUshortShort args) {
+    static public void computeConvert(TestConvert.ArgumentsUshortShort args) {
         args.out = convertUshortToShort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUshortUshort args) {
+    static public void computeConvert(TestConvert.ArgumentsUshortUshort args) {
         args.out = convertUshortToUshort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUshortInt args) {
+    static public void computeConvert(TestConvert.ArgumentsUshortInt args) {
         args.out = convertUshortToInt(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUshortUint args) {
+    static public void computeConvert(TestConvert.ArgumentsUshortUint args) {
         args.out = convertUshortToUint(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUshortLong args) {
+    static public void computeConvert(TestConvert.ArgumentsUshortLong args) {
         args.out = convertUshortToLong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUshortUlong args) {
+    static public void computeConvert(TestConvert.ArgumentsUshortUlong args) {
         args.out = convertUshortToUlong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUshortFloat args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsUshortFloat args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new32(convertUshortToFloat(args.inV));
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUshortDouble args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsUshortDouble args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new64(convertUshortToDouble(args.inV));
     }
 
-    static public void computeConvert(GeneratedTestConvert.ArgumentsIntChar args) {
+    static public void computeConvert(TestConvert.ArgumentsIntChar args) {
         args.out = convertIntToChar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsIntUchar args) {
+    static public void computeConvert(TestConvert.ArgumentsIntUchar args) {
         args.out = convertIntToUchar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsIntShort args) {
+    static public void computeConvert(TestConvert.ArgumentsIntShort args) {
         args.out = convertIntToShort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsIntUshort args) {
+    static public void computeConvert(TestConvert.ArgumentsIntUshort args) {
         args.out = convertIntToUshort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsIntInt args) {
+    static public void computeConvert(TestConvert.ArgumentsIntInt args) {
         args.out = convertIntToInt(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsIntUint args) {
+    static public void computeConvert(TestConvert.ArgumentsIntUint args) {
         args.out = convertIntToUint(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsIntLong args) {
+    static public void computeConvert(TestConvert.ArgumentsIntLong args) {
         args.out = convertIntToLong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsIntUlong args) {
+    static public void computeConvert(TestConvert.ArgumentsIntUlong args) {
         args.out = convertIntToUlong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsIntFloat args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsIntFloat args, Target t) {
         t.setPrecision(1, 1, false);
         args.out = t.new32(convertIntToFloat(args.inV));
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsIntDouble args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsIntDouble args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new64(convertIntToDouble(args.inV));
     }
 
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUintChar args) {
+    static public void computeConvert(TestConvert.ArgumentsUintChar args) {
         args.out = convertUintToChar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUintUchar args) {
+    static public void computeConvert(TestConvert.ArgumentsUintUchar args) {
         args.out = convertUintToUchar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUintShort args) {
+    static public void computeConvert(TestConvert.ArgumentsUintShort args) {
         args.out = convertUintToShort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUintUshort args) {
+    static public void computeConvert(TestConvert.ArgumentsUintUshort args) {
         args.out = convertUintToUshort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUintInt args) {
+    static public void computeConvert(TestConvert.ArgumentsUintInt args) {
         args.out = convertUintToInt(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUintUint args) {
+    static public void computeConvert(TestConvert.ArgumentsUintUint args) {
         args.out = convertUintToUint(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUintLong args) {
+    static public void computeConvert(TestConvert.ArgumentsUintLong args) {
         args.out = convertUintToLong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUintUlong args) {
+    static public void computeConvert(TestConvert.ArgumentsUintUlong args) {
         args.out = convertUintToUlong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUintFloat args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsUintFloat args, Target t) {
         t.setPrecision(1, 1, false);
         args.out = t.new32(convertUintToFloat(args.inV));
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUintDouble args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsUintDouble args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new64(convertUintToDouble(args.inV));
     }
 
-    static public void computeConvert(GeneratedTestConvert.ArgumentsLongChar args) {
+    static public void computeConvert(TestConvert.ArgumentsLongChar args) {
         args.out = convertLongToChar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsLongUchar args) {
+    static public void computeConvert(TestConvert.ArgumentsLongUchar args) {
         args.out = convertLongToUchar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsLongShort args) {
+    static public void computeConvert(TestConvert.ArgumentsLongShort args) {
         args.out = convertLongToShort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsLongUshort args) {
+    static public void computeConvert(TestConvert.ArgumentsLongUshort args) {
         args.out = convertLongToUshort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsLongInt args) {
+    static public void computeConvert(TestConvert.ArgumentsLongInt args) {
         args.out = convertLongToInt(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsLongUint args) {
+    static public void computeConvert(TestConvert.ArgumentsLongUint args) {
         args.out = convertLongToUint(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsLongLong args) {
+    static public void computeConvert(TestConvert.ArgumentsLongLong args) {
         args.out = convertLongToLong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsLongUlong args) {
+    static public void computeConvert(TestConvert.ArgumentsLongUlong args) {
         args.out = convertLongToUlong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsLongFloat args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsLongFloat args, Target t) {
         t.setPrecision(1, 1, false);
         args.out = t.new32(convertLongToFloat(args.inV));
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsLongDouble args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsLongDouble args, Target t) {
         t.setPrecision(1, 1, false);
         args.out = t.new64(convertLongToDouble(args.inV));
     }
 
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUlongChar args) {
+    static public void computeConvert(TestConvert.ArgumentsUlongChar args) {
         args.out = convertUlongToChar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUlongUchar args) {
+    static public void computeConvert(TestConvert.ArgumentsUlongUchar args) {
         args.out = convertUlongToUchar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUlongShort args) {
+    static public void computeConvert(TestConvert.ArgumentsUlongShort args) {
         args.out = convertUlongToShort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUlongUshort args) {
+    static public void computeConvert(TestConvert.ArgumentsUlongUshort args) {
         args.out = convertUlongToUshort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUlongInt args) {
+    static public void computeConvert(TestConvert.ArgumentsUlongInt args) {
         args.out = convertUlongToInt(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUlongUint args) {
+    static public void computeConvert(TestConvert.ArgumentsUlongUint args) {
         args.out = convertUlongToUint(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUlongLong args) {
+    static public void computeConvert(TestConvert.ArgumentsUlongLong args) {
         args.out = convertUlongToLong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUlongUlong args) {
+    static public void computeConvert(TestConvert.ArgumentsUlongUlong args) {
         args.out = convertUlongToUlong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUlongFloat args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsUlongFloat args, Target t) {
         t.setPrecision(1, 1, false);
         args.out = t.new32(convertUlongToFloat(args.inV));
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsUlongDouble args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsUlongDouble args, Target t) {
         t.setPrecision(1, 1, false);
         args.out = t.new64(convertUlongToDouble(args.inV));
     }
 
-    static public void computeConvert(GeneratedTestConvert.ArgumentsFloatChar args) {
+    static public void computeConvert(TestConvert.ArgumentsFloatChar args) {
         args.out = convertFloatToChar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsFloatUchar args) {
+    static public void computeConvert(TestConvert.ArgumentsFloatUchar args) {
         args.out = convertFloatToUchar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsFloatShort args) {
+    static public void computeConvert(TestConvert.ArgumentsFloatShort args) {
         args.out = convertFloatToShort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsFloatUshort args) {
+    static public void computeConvert(TestConvert.ArgumentsFloatUshort args) {
         args.out = convertFloatToUshort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsFloatInt args) {
+    static public void computeConvert(TestConvert.ArgumentsFloatInt args) {
         args.out = convertFloatToInt(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsFloatUint args) {
+    static public void computeConvert(TestConvert.ArgumentsFloatUint args) {
         args.out = convertFloatToUint(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsFloatLong args) {
+    static public void computeConvert(TestConvert.ArgumentsFloatLong args) {
         args.out = convertFloatToLong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsFloatUlong args) {
+    static public void computeConvert(TestConvert.ArgumentsFloatUlong args) {
         args.out = convertFloatToUlong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsFloatFloat args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new32(convertFloatToFloat(args.inV));
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsFloatDouble args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsFloatDouble args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new64(convertFloatToDouble(args.inV));
     }
 
-    static public void computeConvert(GeneratedTestConvert.ArgumentsDoubleChar args) {
+    static public void computeConvert(TestConvert.ArgumentsDoubleChar args) {
         args.out = convertDoubleToChar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsDoubleUchar args) {
+    static public void computeConvert(TestConvert.ArgumentsDoubleUchar args) {
         args.out = convertDoubleToUchar(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsDoubleShort args) {
+    static public void computeConvert(TestConvert.ArgumentsDoubleShort args) {
         args.out = convertDoubleToShort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsDoubleUshort args) {
+    static public void computeConvert(TestConvert.ArgumentsDoubleUshort args) {
         args.out = convertDoubleToUshort(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsDoubleInt args) {
+    static public void computeConvert(TestConvert.ArgumentsDoubleInt args) {
         args.out = convertDoubleToInt(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsDoubleUint args) {
+    static public void computeConvert(TestConvert.ArgumentsDoubleUint args) {
         args.out = convertDoubleToUint(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsDoubleLong args) {
+    static public void computeConvert(TestConvert.ArgumentsDoubleLong args) {
         args.out = convertDoubleToLong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsDoubleUlong args) {
+    static public void computeConvert(TestConvert.ArgumentsDoubleUlong args) {
         args.out = convertDoubleToUlong(args.inV);
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsDoubleFloat args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsDoubleFloat args, Target t) {
         t.setPrecision(1, 1, false);
         args.out = t.new32(convertDoubleToFloat(args.inV));
     }
-    static public void computeConvert(GeneratedTestConvert.ArgumentsDoubleDouble args, Target t) {
+    static public void computeConvert(TestConvert.ArgumentsDoubleDouble args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new64(convertDoubleToDouble(args.inV));
     }
 
-    static public void computeCopysign(GeneratedTestCopysign.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeCopysign(TestCopysign.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        args.out = t.new32(Math.copySign(args.inMagnitudeValue, args.inSignValue));
+        args.out = t.new32(Math.copySign(args.inX, args.inY));
     }
 
-    static public void computeCos(GeneratedTestCos.ArgumentsFloatFloat args, Target t) {
+    static public void computeCos(TestCos.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(4, 128, false);
-        args.out = cos(args.inV, t);
+        args.out = cos(args.in, t);
     }
 
-    static public void computeCosh(GeneratedTestCosh.ArgumentsFloatFloat args, Target t) {
+    static public void computeCosh(TestCosh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(4, 128, false);
-        args.out = cosh(args.inV, t);
+        args.out = cosh(args.in, t);
     }
 
-    static public void computeCospi(GeneratedTestCospi.ArgumentsFloatFloat args, Target t) {
+    static public void computeCospi(TestCospi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(4, 128, false);
-        args.out = cospi(args.inV, t);
+        args.out = cospi(args.in, t);
     }
 
-    static public void computeCross(GeneratedTestCross.ArgumentsFloatNFloatNFloatN args, Target t) {
+    static public void computeCross(TestCross.ArgumentsFloatNFloatNFloatN args, Target t) {
         t.setPrecision(1, 4, false);
-        cross(args.inLeftVector, args.inRightVector, args.out, t);
+        cross(args.inLhs, args.inRhs, args.out, t);
     }
 
-    static public void computeDegrees(GeneratedTestDegrees.ArgumentsFloatFloat args, Target t) {
+    static public void computeDegrees(TestDegrees.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(3, 3, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.inValue);
         Target.Floaty k = t.new32((float)(180.0 / Math.PI));
         args.out = t.multiply(in, k);
     }
 
-    static public void computeDistance(GeneratedTestDistance.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeDistance(TestDistance.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(1, 1, false);
-        args.out = distance(new float[] {args.inLeftVector}, new float[] {args.inRightVector}, t);
+        args.out = distance(new float[] {args.inLhs}, new float[] {args.inRhs}, t);
     }
 
-    static public void computeDistance(GeneratedTestDistance.ArgumentsFloatNFloatNFloat args, Target t) {
+    static public void computeDistance(TestDistance.ArgumentsFloatNFloatNFloat args, Target t) {
         t.setPrecision(1, 1, false);
-        args.out = distance(args.inLeftVector, args.inRightVector, t);
+        args.out = distance(args.inLhs, args.inRhs, t);
     }
 
-    static public void computeDot(GeneratedTestDot.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeDot(TestDot.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(1, 4, false);
-        Target.Floaty a = t.new32(args.inLeftVector);
-        Target.Floaty b = t.new32(args.inRightVector);
+        Target.Floaty a = t.new32(args.inLhs);
+        Target.Floaty b = t.new32(args.inRhs);
         args.out = t.multiply(a, b);
     }
 
-    static public void computeDot(GeneratedTestDot.ArgumentsFloatNFloatNFloat args, Target t) {
+    static public void computeDot(TestDot.ArgumentsFloatNFloatNFloat args, Target t) {
         t.setPrecision(1, 4, false);
         Target.Floaty sum = t.new32(0.f);
-        for (int i = 0; i < args.inLeftVector.length; i++) {
-            Target.Floaty a = t.new32(args.inLeftVector[i]);
-            Target.Floaty b = t.new32(args.inRightVector[i]);
+        for (int i = 0; i < args.inLhs.length; i++) {
+            Target.Floaty a = t.new32(args.inLhs[i]);
+            Target.Floaty b = t.new32(args.inRhs[i]);
             sum = t.add(sum, t.multiply(a, b));
         }
         args.out = sum;
     }
 
-    static public void computeErf(GeneratedTestErf.ArgumentsFloatFloat args, Target t) {
+    static public void computeErf(TestErf.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(16, 128, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.in);
         args.out = t.new32(
-            erf(args.inV),
+            erf(args.in),
             erf(in.min32()),
             erf(in.max32()));
     }
 
-    static public void computeErfc(GeneratedTestErfc.ArgumentsFloatFloat args, Target t) {
+    static public void computeErfc(TestErfc.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(16, 128, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.in);
         args.out = t.new32(
-            erfc(args.inV),
+            erfc(args.in),
             erfc(in.min32()),
             erfc(in.max32()));
     }
 
-    static public void computeExp(GeneratedTestExp.ArgumentsFloatFloat args, Target t) {
+    static public void computeExp(TestExp.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(3, 16, false);
-        args.out = exp(args.inV, t);
+        args.out = exp(args.in, t);
     }
 
-    static public void computeExp10(GeneratedTestExp10.ArgumentsFloatFloat args, Target t) {
+    static public void computeExp10(TestExp10.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(3, 32, false);
-        args.out = exp10(args.inV, t);
+        args.out = exp10(args.in, t);
     }
 
-    static public void computeExp2(GeneratedTestExp2.ArgumentsFloatFloat args, Target t) {
+    static public void computeExp2(TestExp2.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(3, 16, false);
-        args.out = exp2(args.inV, t);
+        args.out = exp2(args.in, t);
     }
 
-    static public void computeExpm1(GeneratedTestExpm1.ArgumentsFloatFloat args, Target t) {
+    static public void computeExpm1(TestExpm1.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(3, 16, false);
-        args.out = expm1(args.inV, t);
+        args.out = expm1(args.in, t);
     }
 
-    static public void computeFabs(GeneratedTestFabs.ArgumentsFloatFloat args, Target t) {
+    static public void computeFabs(TestFabs.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.in);
         args.out = t.new32(
-            Math.abs(args.inV),
+            Math.abs(args.in),
             Math.abs(in.min32()),
             Math.abs(in.max32()));
     }
 
-    static public void computeFastDistance(GeneratedTestFastDistance.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeFastDistance(TestFastDistance.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
-        args.out = distance(new float[] {args.inLeftVector}, new float[] {args.inRightVector}, t);
+        args.out = distance(new float[] {args.inLhs}, new float[] {args.inRhs}, t);
     }
 
-    static public void computeFastDistance(GeneratedTestFastDistance.ArgumentsFloatNFloatNFloat args, Target t) {
+    static public void computeFastDistance(TestFastDistance.ArgumentsFloatNFloatNFloat args, Target t) {
         t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
-        args.out = distance(args.inLeftVector, args.inRightVector, t);
+        args.out = distance(args.inLhs, args.inRhs, t);
     }
 
-    static public void computeFastLength(GeneratedTestFastLength.ArgumentsFloatFloat args, Target t) {
+    static public void computeFastLength(TestFastLength.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
         args.out = length(new float[] {args.inV}, t);
     }
 
-    static public void computeFastLength(GeneratedTestFastLength.ArgumentsFloatNFloat args, Target t) {
+    static public void computeFastLength(TestFastLength.ArgumentsFloatNFloat args, Target t) {
         t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
         args.out = length(args.inV, t);
     }
 
-    static public void computeFastNormalize(GeneratedTestFastNormalize.ArgumentsFloatFloat args, Target t) {
+    static public void computeFastNormalize(TestFastNormalize.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
         Target.Floaty[] out = new Target.Floaty[1];
         normalize(new float[] {args.inV}, out, t);
         args.out = out[0];
     }
 
-    static public void computeFastNormalize(GeneratedTestFastNormalize.ArgumentsFloatNFloatN args, Target t) {
+    static public void computeFastNormalize(TestFastNormalize.ArgumentsFloatNFloatN args, Target t) {
         t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
         normalize(args.inV, args.out, t);
     }
 
-    static public void computeFdim(GeneratedTestFdim.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeFdim(TestFdim.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(1, 1, false);
         Target.Floaty inA = t.new32(args.inA);
         Target.Floaty inB = t.new32(args.inB);
@@ -1195,58 +1195,58 @@
             Math.max(0.f, r.max32()));
     }
 
-    static public void computeFloor(GeneratedTestFloor.ArgumentsFloatFloat args, Target t) {
+    static public void computeFloor(TestFloor.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.in);
         args.out = t.new32(
-            floor(args.inV),
+            floor(args.in),
             floor(in.min32()),
             floor(in.max32()));
     }
 
-    static public void computeFma(GeneratedTestFma.ArgumentsFloatFloatFloatFloat args, Target t) {
+    static public void computeFma(TestFma.ArgumentsFloatFloatFloatFloat args, Target t) {
         t.setPrecision(1, 1, false);
-        Target.Floaty ab = t.multiply(t.new32(args.inMultiplicand1), t.new32(args.inMultiplicand2));
-        args.out = t.add(ab, t.new32(args.inOffset));
+        Target.Floaty ab = t.multiply(t.new32(args.inA), t.new32(args.inB));
+        args.out = t.add(ab, t.new32(args.inC));
     }
 
-    static public void computeFmax(GeneratedTestFmax.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeFmax(TestFmax.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        Target.Floaty a = t.new32(args.inA);
-        Target.Floaty b = t.new32(args.inB);
+        Target.Floaty inX = t.new32(args.inX);
+        Target.Floaty inY = t.new32(args.inY);
         args.out = t.new32(
-            Math.max(args.inA, args.inB),
-            Math.max(a.min32(), b.min32()),
-            Math.max(a.min32(), b.max32()),
-            Math.max(a.max32(), b.min32()),
-            Math.max(a.max32(), b.max32()));
+            Math.max(args.inX, args.inY),
+            Math.max(inX.min32(), inY.min32()),
+            Math.max(inX.min32(), inY.max32()),
+            Math.max(inX.max32(), inY.min32()),
+            Math.max(inX.max32(), inY.max32()));
     }
 
-    static public void computeFmin(GeneratedTestFmin.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeFmin(TestFmin.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        Target.Floaty a = t.new32(args.inA);
-        Target.Floaty b = t.new32(args.inB);
+        Target.Floaty inX = t.new32(args.inX);
+        Target.Floaty inY = t.new32(args.inY);
         args.out = t.new32(
-            Math.min(args.inA, args.inB),
-            Math.min(a.min32(), b.min32()),
-            Math.min(a.min32(), b.max32()),
-            Math.min(a.max32(), b.min32()),
-            Math.min(a.max32(), b.max32()));
+            Math.min(args.inX, args.inY),
+            Math.min(inX.min32(), inY.min32()),
+            Math.min(inX.min32(), inY.max32()),
+            Math.min(inX.max32(), inY.min32()),
+            Math.min(inX.max32(), inY.max32()));
     }
 
-    static public void computeFmod(GeneratedTestFmod.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeFmod(TestFmod.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(1, 1, false);
-        Target.Floaty numerator = t.new32(args.inNumerator);
-        Target.Floaty denominator = t.new32(args.inDenominator);
+        Target.Floaty inX = t.new32(args.inX);
+        Target.Floaty inY = t.new32(args.inY);
         args.out = t.new32(
-            args.inNumerator % args.inDenominator,
-            numerator.min32() % denominator.min32(),
-            numerator.min32() % denominator.max32(),
-            numerator.max32() % denominator.min32(),
-            numerator.max32() % denominator.max32());
+            args.inX % args.inY,
+            inX.min32() % inY.min32(),
+            inX.min32() % inY.max32(),
+            inX.max32() % inY.min32(),
+            inX.max32() % inY.max32());
     }
 
-    static public void computeFract(GeneratedTestFract.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeFract(TestFract.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(1, 1, false);
         float floor = floor(args.inV);
         args.outFloor = t.new32(floor);
@@ -1254,49 +1254,49 @@
         args.out = t.new32(Math.min(args.inV - floor, 0x1.fffffep-1f));
     }
 
-    static public void computeFract(GeneratedTestFract.ArgumentsFloatFloat args, Target t) {
+    static public void computeFract(TestFract.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(1, 1, false);
         float floor = floor(args.inV);
         // 0x1.fffffep-1f is 0.999999...
         args.out = t.new32(Math.min(args.inV - floor, 0x1.fffffep-1f));
     }
 
-    static public void computeFrexp(GeneratedTestFrexp.ArgumentsFloatIntFloat args, Target t) {
+    static public void computeFrexp(TestFrexp.ArgumentsFloatIntFloat args, Target t) {
         t.setPrecision(0, 0, false);
         FrexpResult result = frexp(args.inV);
         args.out = t.new32(result.significand);
-        args.outExponent = result.exponent;
+        args.outIptr = result.exponent;
     }
 
-    static public void computeHalfRecip(GeneratedTestHalfRecip.ArgumentsFloatFloat args, Target t) {
+    static public void computeHalfRecip(TestHalfRecip.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(HALF_PRECISION, HALF_PRECISION, false);
         args.out = recip(args.inV, t);
     }
 
-    static public void computeHalfRsqrt(GeneratedTestHalfRsqrt.ArgumentsFloatFloat args, Target t) {
+    static public void computeHalfRsqrt(TestHalfRsqrt.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(HALF_PRECISION, HALF_PRECISION, false);
         args.out = rsqrt(args.inV, t);
     }
 
-    static public void computeHalfSqrt(GeneratedTestHalfSqrt.ArgumentsFloatFloat args, Target t) {
+    static public void computeHalfSqrt(TestHalfSqrt.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(HALF_PRECISION, HALF_PRECISION, false);
         args.out = sqrt(args.inV, t);
     }
 
-    static public void computeHypot(GeneratedTestHypot.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeHypot(TestHypot.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(4, 4, false);
-        args.out = hypot(args.inA, args.inB, t);
+        args.out = hypot(args.inX, args.inY, t);
     }
 
-    static public String verifyIlogb(GeneratedTestIlogb.ArgumentsFloatInt args) {
+    static public String verifyIlogb(TestIlogb.ArgumentsFloatInt args) {
         // Special case when the input is 0.  We accept two different answers.
-        if (args.inV == 0.f) {
+        if (args.in == 0.f) {
             if (args.out != -Integer.MAX_VALUE && args.out != Integer.MIN_VALUE) {
                 return "Expected " + Integer.toString(-Integer.MAX_VALUE) + " or " +
                     Integer.toString(Integer.MIN_VALUE);
             }
         } else {
-            int result = ilogb(args.inV);
+            int result = ilogb(args.in);
             if (args.out != result) {
                 return "Expected " + Integer.toString(result);
             }
@@ -1304,28 +1304,28 @@
         return null;
     }
 
-    static public void computeLdexp(GeneratedTestLdexp.ArgumentsFloatIntFloat args, Target t) {
+    static public void computeLdexp(TestLdexp.ArgumentsFloatIntFloat args, Target t) {
         t.setPrecision(1, 1, false);
-        Target.Floaty inMantissa = t.new32(args.inMantissa);
+        Target.Floaty inX = t.new32(args.inX);
         args.out = t.new32(
-            ldexp(inMantissa.mid32(), args.inExponent),
-            ldexp(inMantissa.min32(), args.inExponent),
-            ldexp(inMantissa.max32(), args.inExponent));
+            ldexp(inX.mid32(), args.inY),
+            ldexp(inX.min32(), args.inY),
+            ldexp(inX.max32(), args.inY));
     }
 
-    static public void computeLength(GeneratedTestLength.ArgumentsFloatFloat args, Target t) {
+    static public void computeLength(TestLength.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(1, 1, false);
         args.out = length(new float[]{args.inV}, t);
     }
 
-    static public void computeLength(GeneratedTestLength.ArgumentsFloatNFloat args, Target t) {
+    static public void computeLength(TestLength.ArgumentsFloatNFloat args, Target t) {
         t.setPrecision(1, 1, false);
         args.out = length(args.inV, t);
     }
 
-    static public void computeLgamma(GeneratedTestLgamma.ArgumentsFloatFloat args, Target t) {
+    static public void computeLgamma(TestLgamma.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(16, 128, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.in);
         args.out = t.new32(
             lgamma(in.mid32()),
             lgamma(in.min32()),
@@ -1335,9 +1335,9 @@
     /* TODO Until -0 handling is corrected in bionic & associated drivers, we temporarily
      * disable the verification of -0.  We do this with a custom verifier.  Once bionic
      * is fixed, we can restore computeLgamma and remove verifyLgamma.
-    static public void computeLgamma(GeneratedTestLgamma.ArgumentsFloatIntFloat args, Target t) {
+    static public void computeLgamma(TestLgamma.ArgumentsFloatIntFloat args, Target t) {
         t.setPrecision(16, 128, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.inX);
         LgammaResult result = lgamma2(in.mid32());
         LgammaResult resultMin = lgamma2(in.min32());
         LgammaResult resultMax = lgamma2(in.max32());
@@ -1345,27 +1345,27 @@
         args.outY = result.gammaSign;
     }
     */
-    static public String verifyLgamma(GeneratedTestLgamma.ArgumentsFloatIntFloat args, Target t) {
+    static public String verifyLgamma(TestLgamma.ArgumentsFloatIntFloat args, Target t) {
         t.setPrecision(16, 128, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.inX);
         LgammaResult result = lgamma2(in.mid32());
         LgammaResult resultMin = lgamma2(in.min32());
         LgammaResult resultMax = lgamma2(in.max32());
         Target.Floaty expectedOut = t.new32(result.lgamma, resultMin.lgamma, resultMax.lgamma);
-        boolean isNegativeZero = args.inV == 0.f && 1.f / args.inV < 0.f;
+        boolean isNegativeZero = args.inX == 0.f && 1.f / args.inX < 0.f;
         /* TODO The current implementation of bionic does not handle the -0.f case correctly.
          * It should set the sign to -1 but sets it to 1.
          */
         if (!expectedOut.couldBe(args.out) ||
-            (args.outSignOfGamma != result.gammaSign && !isNegativeZero)) {
+            (args.outY != result.gammaSign && !isNegativeZero)) {
             StringBuilder message = new StringBuilder();
-            message.append(String.format("Input in %14.8g {%8x}:\n", args.inV, Float.floatToRawIntBits(args.inV)));
+            message.append(String.format("Input in %14.8g {%8x}:\n", args.inX, Float.floatToRawIntBits(args.inX)));
             message.append("Expected out: ");
             message.append(expectedOut.toString());
             message.append("\n");
             message.append(String.format("Actual   out: %14.8g {%8x}", args.out, Float.floatToRawIntBits(args.out)));
-            message.append(String.format("Expected outSign: %d\n", result.gammaSign));
-            message.append(String.format("Actual   outSign: %d\n", args.outSignOfGamma));
+            message.append(String.format("Expected outY: %d\n", result.gammaSign));
+            message.append(String.format("Actual   outY: %d\n", args.outY));
             return message.toString();
         }
 
@@ -1374,270 +1374,269 @@
 
     // TODO The relaxed ulf for the various log are taken from the old tests.
     // They are not consistent.
-    static public void computeLog(GeneratedTestLog.ArgumentsFloatFloat args, Target t) {
+    static public void computeLog(TestLog.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(3, 16, false);
-        args.out = log(args.inV, t);
+        args.out = log(args.in, t);
     }
 
-    static public void computeLog10(GeneratedTestLog10.ArgumentsFloatFloat args, Target t) {
+    static public void computeLog10(TestLog10.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(3, 16, false);
-        args.out = log10(args.inV, t);
+        args.out = log10(args.in, t);
     }
 
-    static public void computeLog1p(GeneratedTestLog1p.ArgumentsFloatFloat args, Target t) {
+    static public void computeLog1p(TestLog1p.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(2, 16, false);
-        args.out = log1p(args.inV, t);
+        args.out = log1p(args.in, t);
     }
 
-    static public void computeLog2(GeneratedTestLog2.ArgumentsFloatFloat args, Target t) {
+    static public void computeLog2(TestLog2.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(3, 128, false);
-        args.out = log2(args.inV, t);
+        args.out = log2(args.in, t);
     }
 
-    static public void computeLogb(GeneratedTestLogb.ArgumentsFloatFloat args, Target t) {
+    static public void computeLogb(TestLogb.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.in);
         args.out = t.new32(
             logb(in.mid32()),
             logb(in.min32()),
             logb(in.max32()));
     }
 
-    static public void computeMad(GeneratedTestMad.ArgumentsFloatFloatFloatFloat args, Target t) {
+    static public void computeMad(TestMad.ArgumentsFloatFloatFloatFloat args, Target t) {
         t.setPrecision(1, 4, false);
-        Target.Floaty ab = t.multiply(t.new32(args.inMultiplicand1), t.new32(args.inMultiplicand2));
-        args.out = t.add(ab, t.new32(args.inOffset));
+        Target.Floaty ab = t.multiply(t.new32(args.inA), t.new32(args.inB));
+        args.out = t.add(ab, t.new32(args.inC));
     }
 
-    static public void computeMax(GeneratedTestMax.ArgumentsCharCharChar args) {
-        args.out = maxI8(args.inA, args.inB);
+    static public void computeMax(TestMax.ArgumentsCharCharChar args) {
+        args.out = maxI8(args.inV1, args.inV2);
     }
 
-    static public void computeMax(GeneratedTestMax.ArgumentsUcharUcharUchar args) {
-        args.out = maxU8(args.inA, args.inB);
+    static public void computeMax(TestMax.ArgumentsUcharUcharUchar args) {
+        args.out = maxU8(args.inV1, args.inV2);
     }
 
-    static public void computeMax(GeneratedTestMax.ArgumentsShortShortShort args) {
-        args.out = maxI16(args.inA, args.inB);
+    static public void computeMax(TestMax.ArgumentsShortShortShort args) {
+        args.out = maxI16(args.inV1, args.inV2);
     }
 
-    static public void computeMax(GeneratedTestMax.ArgumentsUshortUshortUshort args) {
-        args.out = maxU16(args.inA, args.inB);
+    static public void computeMax(TestMax.ArgumentsUshortUshortUshort args) {
+        args.out = maxU16(args.inV1, args.inV2);
     }
 
-    static public void computeMax(GeneratedTestMax.ArgumentsIntIntInt args) {
-        args.out = maxI32(args.inA, args.inB);
+    static public void computeMax(TestMax.ArgumentsIntIntInt args) {
+        args.out = maxI32(args.inV1, args.inV2);
     }
 
-    static public void computeMax(GeneratedTestMax.ArgumentsUintUintUint args) {
-        args.out = maxU32(args.inA, args.inB);
+    static public void computeMax(TestMax.ArgumentsUintUintUint args) {
+        args.out = maxU32(args.inV1, args.inV2);
     }
 
-    static public void computeMax(GeneratedTestMax.ArgumentsLongLongLong args) {
-        args.out = maxI64(args.inA, args.inB);
+    static public void computeMax(TestMax.ArgumentsLongLongLong args) {
+        args.out = maxI64(args.inV1, args.inV2);
     }
 
-    static public void computeMax(GeneratedTestMax.ArgumentsUlongUlongUlong args) {
-        args.out = maxU64(args.inA, args.inB);
+    static public void computeMax(TestMax.ArgumentsUlongUlongUlong args) {
+        args.out = maxU64(args.inV1, args.inV2);
     }
 
-    static public void computeMax(GeneratedTestMax.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeMax(TestMax.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        Target.Floaty a = t.new32(args.inA);
-        Target.Floaty b = t.new32(args.inB);
+        Target.Floaty in = t.new32(args.in);
+        Target.Floaty in1 = t.new32(args.in1);
         args.out = t.new32(
-            Math.max(a.mid32(), b.mid32()),
-            Math.max(a.min32(), b.min32()),
-            Math.max(a.min32(), b.max32()),
-            Math.max(a.max32(), b.min32()),
-            Math.max(a.max32(), b.max32()));
+            Math.max(in.mid32(), in1.mid32()),
+            Math.max(in.min32(), in1.min32()),
+            Math.max(in.min32(), in1.max32()),
+            Math.max(in.max32(), in1.min32()),
+            Math.max(in.max32(), in1.max32()));
     }
 
-    static public void computeMin(GeneratedTestMin.ArgumentsCharCharChar args) {
-        args.out = minI8(args.inA, args.inB);
+    static public void computeMin(TestMin.ArgumentsCharCharChar args) {
+        args.out = minI8(args.inV1, args.inV2);
     }
 
-    static public void computeMin(GeneratedTestMin.ArgumentsUcharUcharUchar args) {
-        args.out = minU8(args.inA, args.inB);
+    static public void computeMin(TestMin.ArgumentsUcharUcharUchar args) {
+        args.out = minU8(args.inV1, args.inV2);
     }
 
-    static public void computeMin(GeneratedTestMin.ArgumentsShortShortShort args) {
-        args.out = minI16(args.inA, args.inB);
+    static public void computeMin(TestMin.ArgumentsShortShortShort args) {
+        args.out = minI16(args.inV1, args.inV2);
     }
 
-    static public void computeMin(GeneratedTestMin.ArgumentsUshortUshortUshort args) {
-        args.out = minU16(args.inA, args.inB);
+    static public void computeMin(TestMin.ArgumentsUshortUshortUshort args) {
+        args.out = minU16(args.inV1, args.inV2);
     }
 
-    static public void computeMin(GeneratedTestMin.ArgumentsIntIntInt args) {
-        args.out = minI32(args.inA, args.inB);
+    static public void computeMin(TestMin.ArgumentsIntIntInt args) {
+        args.out = minI32(args.inV1, args.inV2);
     }
 
-    static public void computeMin(GeneratedTestMin.ArgumentsUintUintUint args) {
-        args.out = minU32(args.inA, args.inB);
+    static public void computeMin(TestMin.ArgumentsUintUintUint args) {
+        args.out = minU32(args.inV1, args.inV2);
     }
 
-    static public void computeMin(GeneratedTestMin.ArgumentsLongLongLong args) {
-        args.out = minI64(args.inA, args.inB);
+    static public void computeMin(TestMin.ArgumentsLongLongLong args) {
+        args.out = minI64(args.inV1, args.inV2);
     }
 
-    static public void computeMin(GeneratedTestMin.ArgumentsUlongUlongUlong args) {
-        args.out = minU64(args.inA, args.inB);
+    static public void computeMin(TestMin.ArgumentsUlongUlongUlong args) {
+        args.out = minU64(args.inV1, args.inV2);
     }
 
-    static public void computeMin(GeneratedTestMin.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeMin(TestMin.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        args.out = t.new32(Math.min(args.inA, args.inB));
+        args.out = t.new32(Math.min(args.in, args.in1));
     }
 
-    static public void computeMix(GeneratedTestMix.ArgumentsFloatFloatFloatFloat args, Target t) {
+    static public void computeMix(TestMix.ArgumentsFloatFloatFloatFloat args, Target t) {
         t.setPrecision(1, 4, false);
         Target.Floaty start = t.new32(args.inStart);
         Target.Floaty stop = t.new32(args.inStop);
         Target.Floaty diff = t.subtract(stop, start);
-        args.out = t.add(start, t.multiply(diff, t.new32(args.inFraction)));
+        args.out = t.add(start, t.multiply(diff, t.new32(args.inAmount)));
     }
 
-    static public void computeModf(GeneratedTestModf.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeModf(TestModf.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        float ret = (float)(int)args.inV;
-        args.outIntegralPart = t.new32(ret);
-        args.out = t.new32(args.inV - ret);
+        float ret = (float)(int)args.inX;
+        args.outIret = t.new32(ret);
+        args.out = t.new32(args.inX - ret);
     }
 
-    static public void computeNan(GeneratedTestNan.ArgumentsUintFloat args, Target t) {
+    static public void computeNan(TestNan.ArgumentsUintFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        // TODO(jeanluc) We're not using the input argument
         args.out = t.new32(Float.NaN);
     }
 
-    static public void computeNativeAcos(GeneratedTestNativeAcos.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeAcos(TestNativeAcos.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         args.out = acos(args.inV, t);
     }
 
-    static public void computeNativeAcosh(GeneratedTestNativeAcosh.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeAcosh(TestNativeAcosh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = acosh(args.inV, t);
+        args.out = acosh(args.in, t);
     }
 
-    static public void computeNativeAcospi(GeneratedTestNativeAcospi.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeAcospi(TestNativeAcospi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         args.out = acospi(args.inV, t);
     }
 
-    static public void computeNativeAsin(GeneratedTestNativeAsin.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeAsin(TestNativeAsin.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         args.out = asin(args.inV, t);
     }
 
-    static public void computeNativeAsinh(GeneratedTestNativeAsinh.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeAsinh(TestNativeAsinh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = asinh(args.inV, t);
+        args.out = asinh(args.in, t);
     }
 
-    static public void computeNativeAsinpi(GeneratedTestNativeAsinpi.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeAsinpi(TestNativeAsinpi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         args.out = asinpi(args.inV, t);
     }
 
-    static public void computeNativeAtan(GeneratedTestNativeAtan.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeAtan(TestNativeAtan.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         args.out = atan(args.inV, t);
     }
 
-    static public void computeNativeAtanh(GeneratedTestNativeAtanh.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeAtanh(TestNativeAtanh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = atanh(args.inV, t);
+        args.out = atanh(args.inIn, t);
     }
 
-    static public void computeNativeAtanpi(GeneratedTestNativeAtanpi.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeAtanpi(TestNativeAtanpi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         args.out = atanpi(args.inV, t);
     }
 
-    static public void computeNativeAtan2(GeneratedTestNativeAtan2.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeNativeAtan2(TestNativeAtan2.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = atan2(args.inNumerator, args.inDenominator, t);
+        args.out = atan2(args.inY, args.inX, t);
     }
 
-    static public void computeNativeAtan2pi(GeneratedTestNativeAtan2pi.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeNativeAtan2pi(TestNativeAtan2pi.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = atan2pi(args.inNumerator, args.inDenominator, t);
+        args.out = atan2pi(args.inY, args.inX, t);
     }
 
-    static public void computeNativeCbrt(GeneratedTestNativeCbrt.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeCbrt(TestNativeCbrt.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = cbrt(args.inV, t);
+        args.out = cbrt(args.in, t);
     }
 
-    static public void computeNativeCos(GeneratedTestNativeCos.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeCos(TestNativeCos.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = cos(args.inV, t);
+        args.out = cos(args.in, t);
     }
 
-    static public void computeNativeCosh(GeneratedTestNativeCosh.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeCosh(TestNativeCosh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = cosh(args.inV, t);
+        args.out = cosh(args.in, t);
     }
 
-    static public void computeNativeCospi(GeneratedTestNativeCospi.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeCospi(TestNativeCospi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = cospi(args.inV, t);
+        args.out = cospi(args.in, t);
     }
 
-    static public void computeNativeDistance(GeneratedTestNativeDistance.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeNativeDistance(TestNativeDistance.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = distance(new float[]{args.inLeftVector}, new float[]{args.inRightVector}, t);
+        args.out = distance(new float[]{args.inLhs}, new float[]{args.inRhs}, t);
     }
 
-    static public void computeNativeDistance(GeneratedTestNativeDistance.ArgumentsFloatNFloatNFloat args, Target t) {
+    static public void computeNativeDistance(TestNativeDistance.ArgumentsFloatNFloatNFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = distance(args.inLeftVector, args.inRightVector, t);
+        args.out = distance(args.inLhs, args.inRhs, t);
     }
 
-    static public void computeNativeDivide(GeneratedTestNativeDivide.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeNativeDivide(TestNativeDivide.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = t.divide(t.new32(args.inLeftVector), t.new32(args.inRightVector));
+        args.out = t.divide(t.new32(args.inLhs), t.new32(args.inRhs));
     }
 
-    static public void computeNativeExp(GeneratedTestNativeExp.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeExp(TestNativeExp.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         args.out = exp(args.inV, t);
     }
 
-    static public void computeNativeExp10(GeneratedTestNativeExp10.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeExp10(TestNativeExp10.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         args.out = exp10(args.inV, t);
     }
 
-    static public void computeNativeExp2(GeneratedTestNativeExp2.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeExp2(TestNativeExp2.ArgumentsFloatFloat args, Target t) {
         // TODO we would like to use NATIVE_PRECISION, NATIVE_PRECISION
         t.setPrecision(13000, 13000, true);
         args.out = exp2(args.inV, t);
     }
 
-    static public void computeNativeExpm1(GeneratedTestNativeExpm1.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeExpm1(TestNativeExpm1.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = expm1(args.inV, t);
+        args.out = expm1(args.in, t);
     }
 
-    static public void computeNativeHypot(GeneratedTestNativeHypot.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeNativeHypot(TestNativeHypot.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = hypot(args.inA, args.inB, t);
+        args.out = hypot(args.inX, args.inY, t);
     }
 
-    static public void computeNativeLength(GeneratedTestNativeLength.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeLength(TestNativeLength.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         args.out = length(new float[] {args.inV}, t);
     }
 
-    static public void computeNativeLength(GeneratedTestNativeLength.ArgumentsFloatNFloat args, Target t) {
+    static public void computeNativeLength(TestNativeLength.ArgumentsFloatNFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         args.out = length(args.inV, t);
     }
 
-    static public void computeNativeLog(GeneratedTestNativeLog.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeLog(TestNativeLog.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         // For very small values, allow anything.
         if (Math.abs(args.inV) < 1.e-20) {
@@ -1647,7 +1646,7 @@
         }
     }
 
-    static public void computeNativeLog10(GeneratedTestNativeLog10.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeLog10(TestNativeLog10.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         // For very small values, allow anything.
         if (Math.abs(args.inV) < 1.e-20) {
@@ -1657,12 +1656,12 @@
         }
     }
 
-    static public void computeNativeLog1p(GeneratedTestNativeLog1p.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeLog1p(TestNativeLog1p.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = log1p(args.inV, t);
+        args.out = log1p(args.in, t);
     }
 
-    static public void computeNativeLog2(GeneratedTestNativeLog2.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeLog2(TestNativeLog2.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         // For very small values, allow anything.
         if (Math.abs(args.inV) < 1.e-20) {
@@ -1672,35 +1671,35 @@
         }
     }
 
-    static public void computeNativeNormalize(GeneratedTestNativeNormalize.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeNormalize(TestNativeNormalize.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         Target.Floaty[] out = new Target.Floaty[1];
         normalize(new float[] {args.inV}, out, t);
         args.out = out[0];
     }
 
-    static public void computeNativeNormalize(GeneratedTestNativeNormalize.ArgumentsFloatNFloatN args, Target t) {
+    static public void computeNativeNormalize(TestNativeNormalize.ArgumentsFloatNFloatN args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         normalize(args.inV, args.out, t);
     }
 
-    static public void computeNativePowr(GeneratedTestNativePowr.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeNativePowr(TestNativePowr.ArgumentsFloatFloatFloat args, Target t) {
         // TODO we would like to use NATIVE_PRECISION, NATIVE_PRECISION
         t.setPrecision(32000, 32000, true);
         // For very small values, allow anything.
-        if (Math.abs(args.inBase) < 1.e-20) {
+        if (Math.abs(args.inV) < 1.e-20) {
             args.out = any32(t);
         } else {
-            args.out = powr(args.inBase, args.inExponent, t);
+            args.out = powr(args.inV, args.inY, t);
         }
     }
 
-    static public void computeNativeRecip(GeneratedTestNativeRecip.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeRecip(TestNativeRecip.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         args.out = recip(args.inV, t);
     }
 
-    static public void computeNativeRootn(GeneratedTestNativeRootn.ArgumentsFloatIntFloat args, Target t) {
+    static public void computeNativeRootn(TestNativeRootn.ArgumentsFloatIntFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
         // Allow anything for zero.
         if (args.inN == 0) {
@@ -1710,115 +1709,115 @@
         }
     }
 
-    static public void computeNativeRsqrt(GeneratedTestNativeRsqrt.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeRsqrt(TestNativeRsqrt.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = rsqrt(args.inV, t);
+        args.out = rsqrt(args.in, t);
     }
 
-    static public void computeNativeSin(GeneratedTestNativeSin.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeSin(TestNativeSin.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+        args.out = sin(args.in, t);
+    }
+
+    static public void computeNativeSincos(TestNativeSincos.ArgumentsFloatFloatFloat args, Target t) {
+        t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+        args.outCosptr = cos(args.inV, t);
         args.out = sin(args.inV, t);
     }
 
-    static public void computeNativeSincos(GeneratedTestNativeSincos.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeNativeSinh(TestNativeSinh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.outCos = cos(args.inV, t);
-        args.out = sin(args.inV, t);
+        args.out = sinh(args.in, t);
     }
 
-    static public void computeNativeSinh(GeneratedTestNativeSinh.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeSinpi(TestNativeSinpi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = sinh(args.inV, t);
+        args.out = sinpi(args.in, t);
     }
 
-    static public void computeNativeSinpi(GeneratedTestNativeSinpi.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeSqrt(TestNativeSqrt.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = sinpi(args.inV, t);
+        args.out = sqrt(args.in, t);
     }
 
-    static public void computeNativeSqrt(GeneratedTestNativeSqrt.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeTan(TestNativeTan.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = sqrt(args.inV, t);
+        args.out = tan(args.in, t);
     }
 
-    static public void computeNativeTan(GeneratedTestNativeTan.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeTanh(TestNativeTanh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = tan(args.inV, t);
+        args.out = tanh(args.in, t);
     }
 
-    static public void computeNativeTanh(GeneratedTestNativeTanh.ArgumentsFloatFloat args, Target t) {
+    static public void computeNativeTanpi(TestNativeTanpi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = tanh(args.inV, t);
+        args.out = tanpi(args.in, t);
     }
 
-    static public void computeNativeTanpi(GeneratedTestNativeTanpi.ArgumentsFloatFloat args, Target t) {
-        t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
-        args.out = tanpi(args.inV, t);
-    }
-
-    static public void computeNextafter(GeneratedTestNextafter.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeNextafter(TestNextafter.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        args.out = t.new32(Math.nextAfter(args.inV, args.inTarget));
+        args.out = t.new32(Math.nextAfter(args.inX, args.inY));
     }
 
-    static public void computeNormalize(GeneratedTestNormalize.ArgumentsFloatFloat args, Target t) {
+    static public void computeNormalize(TestNormalize.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(1, 1, false);
         Target.Floaty[] out = new Target.Floaty[1];
         normalize(new float[] {args.inV}, out, t);
         args.out = out[0];
     }
 
-    static public void computeNormalize(GeneratedTestNormalize.ArgumentsFloatNFloatN args, Target t) {
+    static public void computeNormalize(TestNormalize.ArgumentsFloatNFloatN args, Target t) {
         t.setPrecision(1, 1, false);
         normalize(args.inV, args.out, t);
     }
 
-    static public void computePow(GeneratedTestPow.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computePow(TestPow.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(16, 128, false);
-        Target.Floaty base = t.new32(args.inBase);
-        Target.Floaty exponent = t.new32(args.inExponent);
+        Target.Floaty inX = t.new32(args.inX);
+        Target.Floaty inY = t.new32(args.inY);
         args.out = t.new32(
-            pow(base.mid32(), exponent.mid32()),
-            pow(base.min32(), exponent.min32()),
-            pow(base.min32(), exponent.max32()),
-            pow(base.max32(), exponent.min32()),
-            pow(base.max32(), exponent.max32()));
+            pow(inX.mid32(), inY.mid32()),
+            pow(inX.min32(), inY.min32()),
+            pow(inX.min32(), inY.max32()),
+            pow(inX.max32(), inY.min32()),
+            pow(inX.max32(), inY.max32()));
     }
 
-    static public void computePown(GeneratedTestPown.ArgumentsFloatIntFloat args, Target t) {
+    static public void computePown(TestPown.ArgumentsFloatIntFloat args, Target t) {
         t.setPrecision(16, 128, false);
-        Target.Floaty in = t.new32(args.inBase);
+        Target.Floaty in = t.new32(args.inX);
         // We use double for the calculations because floats does not have enough
         // mantissa bits.  Knowing if an int is odd or even will matter for negative
         // numbers.  Using a float loses the lowest bit.
-        final double y = (double) args.inExponent;
+        final double y = (double) args.inY;
         args.out = t.new32(
             (float) Math.pow(in.mid32(), y),
             (float) Math.pow(in.min32(), y),
             (float) Math.pow(in.max32(), y));
     }
 
-    static public void computePowr(GeneratedTestPowr.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computePowr(TestPowr.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(16, 128, false);
-        args.out = powr(args.inBase, args.inExponent, t);
+        args.out = powr(args.inX, args.inY, t);
     }
 
-    static public void computeRadians(GeneratedTestRadians.ArgumentsFloatFloat args, Target t) {
+    static public void computeRadians(TestRadians.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(3, 3, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.inValue);
         Target.Floaty k = t.new32((float)(Math.PI / 180.0));
         args.out = t.multiply(in, k);
     }
 
-    static public void computeRemainder(GeneratedTestRemainder.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeRemainder(TestRemainder.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        RemquoResult result = remquo(args.inNumerator, args.inDenominator);
+        RemquoResult result = remquo(args.inX, args.inY);
         args.out = t.new32(result.remainder);
     }
 
-    static public String verifyRemquo(GeneratedTestRemquo.ArgumentsFloatFloatIntFloat args, Target t) {
+    static public String verifyRemquo(TestRemquo.ArgumentsFloatFloatIntFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        RemquoResult expected = remquo(args.inNumerator, args.inDenominator);
+        RemquoResult expected = remquo(args.inB, args.inC);
         // If the expected remainder is NaN, we don't validate the quotient.  It's because of
         // a division by zero.
         if (expected.remainder != expected.remainder) {
@@ -1828,8 +1827,8 @@
             }
         } else {
             // The quotient should have the same lowest three bits.
-            if ((args.outQuotient & 0x07) != (expected.quotient & 0x07)) {
-                return "Quotient returned " +  Integer.toString(args.outQuotient) +
+            if ((args.outD & 0x07) != (expected.quotient & 0x07)) {
+                return "Quotient returned " +  Integer.toString(args.outD) +
                     " does not have the same lower three bits as the expected " +
                     Integer.toString(expected.quotient);
             }
@@ -1843,97 +1842,97 @@
         return null;
     }
 
-    static public void computeRint(GeneratedTestRint.ArgumentsFloatFloat args, Target t) {
+    static public void computeRint(TestRint.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.in);
         args.out = t.new32(
             rint(in.mid32()),
             rint(in.min32()),
             rint(in.max32()));
     }
 
-    static public void computeRootn(GeneratedTestRootn.ArgumentsFloatIntFloat args, Target t) {
+    static public void computeRootn(TestRootn.ArgumentsFloatIntFloat args, Target t) {
         t.setPrecision(16, 16, false);
         args.out = rootn(args.inV, args.inN, t);
     }
 
-    static public void computeRound(GeneratedTestRound.ArgumentsFloatFloat args, Target t) {
+    static public void computeRound(TestRound.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.in);
         args.out = t.new32(
             round(in.mid32()),
             round(in.min32()),
             round(in.max32()));
     }
 
-    static public void computeRsqrt(GeneratedTestRsqrt.ArgumentsFloatFloat args, Target t) {
+    static public void computeRsqrt(TestRsqrt.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(2, 2, false);
-        args.out = rsqrt(args.inV, t);
+        args.out = rsqrt(args.in, t);
     }
 
-    static public void computeSign(GeneratedTestSign.ArgumentsFloatFloat args, Target t) {
+    static public void computeSign(TestSign.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new32(Math.signum(args.inV));
     }
 
-    static public void computeSin(GeneratedTestSin.ArgumentsFloatFloat args, Target t) {
+    static public void computeSin(TestSin.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(4, 128, false);
+        args.out = sin(args.in, t);
+    }
+
+    static public void computeSincos(TestSincos.ArgumentsFloatFloatFloat args, Target t) {
+        t.setPrecision(4, 128, false);
+        args.outCosptr = cos(args.inV,t );
         args.out = sin(args.inV, t);
     }
 
-    static public void computeSincos(GeneratedTestSincos.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeSinh(TestSinh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(4, 128, false);
-        args.outCos = cos(args.inV,t );
-        args.out = sin(args.inV, t);
+        args.out = sinh(args.in, t);
     }
 
-    static public void computeSinh(GeneratedTestSinh.ArgumentsFloatFloat args, Target t) {
+    static public void computeSinpi(TestSinpi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(4, 128, false);
-        args.out = sinh(args.inV, t);
+        args.out = sinpi(args.in, t);
     }
 
-    static public void computeSinpi(GeneratedTestSinpi.ArgumentsFloatFloat args, Target t) {
-        t.setPrecision(4, 128, false);
-        args.out = sinpi(args.inV, t);
-    }
-
-    static public void computeSqrt(GeneratedTestSqrt.ArgumentsFloatFloat args, Target t) {
+    static public void computeSqrt(TestSqrt.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(3, 3, false);
-        args.out = sqrt(args.inV, t);
+        args.out = sqrt(args.in, t);
     }
 
-    static public void computeStep(GeneratedTestStep.ArgumentsFloatFloatFloat args, Target t) {
+    static public void computeStep(TestStep.ArgumentsFloatFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
         args.out = t.new32(args.inV < args.inEdge ? 0.f : 1.f);
     }
 
-    static public void computeTan(GeneratedTestTan.ArgumentsFloatFloat args, Target t) {
+    static public void computeTan(TestTan.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(5, 128, false);
-        args.out = tan(args.inV, t);
+        args.out = tan(args.in, t);
     }
 
-    static public void computeTanh(GeneratedTestTanh.ArgumentsFloatFloat args, Target t) {
+    static public void computeTanh(TestTanh.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(5, 128, false);
-        args.out = tanh(args.inV, t);
+        args.out = tanh(args.in, t);
     }
 
-    static public void computeTanpi(GeneratedTestTanpi.ArgumentsFloatFloat args, Target t) {
+    static public void computeTanpi(TestTanpi.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(4, 128, false);
-        args.out = tanpi(args.inV, t);
+        args.out = tanpi(args.in, t);
     }
 
-    static public void computeTgamma(GeneratedTestTgamma.ArgumentsFloatFloat args, Target t) {
+    static public void computeTgamma(TestTgamma.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(16, 128, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.in);
         args.out = t.new32(
             tgamma(in.mid32()),
             tgamma(in.min32()),
             tgamma(in.max32()));
     }
 
-    static public void computeTrunc(GeneratedTestTrunc.ArgumentsFloatFloat args, Target t) {
+    static public void computeTrunc(TestTrunc.ArgumentsFloatFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        Target.Floaty in = t.new32(args.inV);
+        Target.Floaty in = t.new32(args.in);
         args.out = t.new32(
             trunc(in.mid32()),
             trunc(in.min32()),
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java b/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java
index f82feb1..cf0f76d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java
@@ -65,11 +65,6 @@
             Soob.invoke_write_i(9, 0);
             mRS.finish();
         }
-
-        // Flush messages through the pipeline.
-        Soob.invoke_send_msg();
-        waitForMessage();
-
         Soob.destroy();
         assertTrue(mRanErrorHandler);
         checkForErrors();
@@ -86,11 +81,6 @@
             Soob.invoke_write_i(9, 0);
             mRS.finish();
         }
-
-        // Flush messages through the pipeline.
-        Soob.invoke_send_msg();
-        waitForMessage();
-
         Soob.destroy();
         assertTrue(mRanErrorHandler);
         checkForErrors();
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
index 131b3fd..ead4528 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
@@ -448,7 +448,7 @@
         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(30, DataType.values().length);
+        assertEquals(29, DataType.values().length);
 
         for (DataType dt : DataType.values()) {
             switch (dt) {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAbs.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAbs.rs
deleted file mode 100644
index 1a7fb31..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAbs.rs
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-uchar __attribute__((kernel)) testAbsCharUchar(char inV) {
-    return abs(inV);
-}
-
-uchar2 __attribute__((kernel)) testAbsChar2Uchar2(char2 inV) {
-    return abs(inV);
-}
-
-uchar3 __attribute__((kernel)) testAbsChar3Uchar3(char3 inV) {
-    return abs(inV);
-}
-
-uchar4 __attribute__((kernel)) testAbsChar4Uchar4(char4 inV) {
-    return abs(inV);
-}
-
-ushort __attribute__((kernel)) testAbsShortUshort(short inV) {
-    return abs(inV);
-}
-
-ushort2 __attribute__((kernel)) testAbsShort2Ushort2(short2 inV) {
-    return abs(inV);
-}
-
-ushort3 __attribute__((kernel)) testAbsShort3Ushort3(short3 inV) {
-    return abs(inV);
-}
-
-ushort4 __attribute__((kernel)) testAbsShort4Ushort4(short4 inV) {
-    return abs(inV);
-}
-
-uint __attribute__((kernel)) testAbsIntUint(int inV) {
-    return abs(inV);
-}
-
-uint2 __attribute__((kernel)) testAbsInt2Uint2(int2 inV) {
-    return abs(inV);
-}
-
-uint3 __attribute__((kernel)) testAbsInt3Uint3(int3 inV) {
-    return abs(inV);
-}
-
-uint4 __attribute__((kernel)) testAbsInt4Uint4(int4 inV) {
-    return abs(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAbsRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAbsRelaxed.rs
deleted file mode 100644
index 4016723..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAbsRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAbs.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcosRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcosRelaxed.rs
deleted file mode 100644
index 9413bea..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcosRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAcos.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcosh.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcosh.rs
deleted file mode 100644
index 35c4c73..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcosh.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testAcoshFloatFloat(float inV) {
-    return acosh(inV);
-}
-
-float2 __attribute__((kernel)) testAcoshFloat2Float2(float2 inV) {
-    return acosh(inV);
-}
-
-float3 __attribute__((kernel)) testAcoshFloat3Float3(float3 inV) {
-    return acosh(inV);
-}
-
-float4 __attribute__((kernel)) testAcoshFloat4Float4(float4 inV) {
-    return acosh(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcoshRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcoshRelaxed.rs
deleted file mode 100644
index bf34014..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcoshRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAcosh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcospiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcospiRelaxed.rs
deleted file mode 100644
index f894336..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcospiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAcospi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinRelaxed.rs
deleted file mode 100644
index 99362a8..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAsin.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinh.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinh.rs
deleted file mode 100644
index b7567db..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinh.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testAsinhFloatFloat(float inV) {
-    return asinh(inV);
-}
-
-float2 __attribute__((kernel)) testAsinhFloat2Float2(float2 inV) {
-    return asinh(inV);
-}
-
-float3 __attribute__((kernel)) testAsinhFloat3Float3(float3 inV) {
-    return asinh(inV);
-}
-
-float4 __attribute__((kernel)) testAsinhFloat4Float4(float4 inV) {
-    return asinh(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinhRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinhRelaxed.rs
deleted file mode 100644
index 487e710..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinhRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAsinh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinpiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinpiRelaxed.rs
deleted file mode 100644
index 591d9cd..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinpiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAsinpi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2.rs
deleted file mode 100644
index e75ec89..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInDenominator;
-
-float __attribute__((kernel)) testAtan2FloatFloatFloat(float inNumerator, unsigned int x) {
-    float inDenominator = rsGetElementAt_float(gAllocInDenominator, x);
-    return atan2(inNumerator, inDenominator);
-}
-
-float2 __attribute__((kernel)) testAtan2Float2Float2Float2(float2 inNumerator, unsigned int x) {
-    float2 inDenominator = rsGetElementAt_float2(gAllocInDenominator, x);
-    return atan2(inNumerator, inDenominator);
-}
-
-float3 __attribute__((kernel)) testAtan2Float3Float3Float3(float3 inNumerator, unsigned int x) {
-    float3 inDenominator = rsGetElementAt_float3(gAllocInDenominator, x);
-    return atan2(inNumerator, inDenominator);
-}
-
-float4 __attribute__((kernel)) testAtan2Float4Float4Float4(float4 inNumerator, unsigned int x) {
-    float4 inDenominator = rsGetElementAt_float4(gAllocInDenominator, x);
-    return atan2(inNumerator, inDenominator);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2Relaxed.rs
deleted file mode 100644
index a5fe0ce..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAtan2.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2piRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2piRelaxed.rs
deleted file mode 100644
index 7c83f66..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2piRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAtan2pi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanRelaxed.rs
deleted file mode 100644
index 68821a4..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAtan.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanhRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanhRelaxed.rs
deleted file mode 100644
index 2548366..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanhRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAtanh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanpiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanpiRelaxed.rs
deleted file mode 100644
index 07fcdca..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanpiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestAtanpi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCbrt.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCbrt.rs
deleted file mode 100644
index 1544c27..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCbrt.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testCbrtFloatFloat(float inV) {
-    return cbrt(inV);
-}
-
-float2 __attribute__((kernel)) testCbrtFloat2Float2(float2 inV) {
-    return cbrt(inV);
-}
-
-float3 __attribute__((kernel)) testCbrtFloat3Float3(float3 inV) {
-    return cbrt(inV);
-}
-
-float4 __attribute__((kernel)) testCbrtFloat4Float4(float4 inV) {
-    return cbrt(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCbrtRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCbrtRelaxed.rs
deleted file mode 100644
index b0ffe69..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCbrtRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestCbrt.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCeil.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCeil.rs
deleted file mode 100644
index 1bfba39..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCeil.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testCeilFloatFloat(float inV) {
-    return ceil(inV);
-}
-
-float2 __attribute__((kernel)) testCeilFloat2Float2(float2 inV) {
-    return ceil(inV);
-}
-
-float3 __attribute__((kernel)) testCeilFloat3Float3(float3 inV) {
-    return ceil(inV);
-}
-
-float4 __attribute__((kernel)) testCeilFloat4Float4(float4 inV) {
-    return ceil(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCeilRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCeilRelaxed.rs
deleted file mode 100644
index 960c17b..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCeilRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestCeil.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClampRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClampRelaxed.rs
deleted file mode 100644
index ff33381..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClampRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestClamp.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClzRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClzRelaxed.rs
deleted file mode 100644
index 73df33a..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClzRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestClz.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestConvertRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestConvertRelaxed.rs
deleted file mode 100644
index fa063c7..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestConvertRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestConvert.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCopysignRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCopysignRelaxed.rs
deleted file mode 100644
index cc6b1ac..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCopysignRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestCopysign.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCos.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCos.rs
deleted file mode 100644
index 005b568..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCos.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testCosFloatFloat(float inV) {
-    return cos(inV);
-}
-
-float2 __attribute__((kernel)) testCosFloat2Float2(float2 inV) {
-    return cos(inV);
-}
-
-float3 __attribute__((kernel)) testCosFloat3Float3(float3 inV) {
-    return cos(inV);
-}
-
-float4 __attribute__((kernel)) testCosFloat4Float4(float4 inV) {
-    return cos(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCosRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCosRelaxed.rs
deleted file mode 100644
index 8eb98bf..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCosRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestCos.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCosh.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCosh.rs
deleted file mode 100644
index 3064edb..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCosh.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testCoshFloatFloat(float inV) {
-    return cosh(inV);
-}
-
-float2 __attribute__((kernel)) testCoshFloat2Float2(float2 inV) {
-    return cosh(inV);
-}
-
-float3 __attribute__((kernel)) testCoshFloat3Float3(float3 inV) {
-    return cosh(inV);
-}
-
-float4 __attribute__((kernel)) testCoshFloat4Float4(float4 inV) {
-    return cosh(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCoshRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCoshRelaxed.rs
deleted file mode 100644
index 122308e..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCoshRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestCosh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCospi.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCospi.rs
deleted file mode 100644
index 25f9e8e..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCospi.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testCospiFloatFloat(float inV) {
-    return cospi(inV);
-}
-
-float2 __attribute__((kernel)) testCospiFloat2Float2(float2 inV) {
-    return cospi(inV);
-}
-
-float3 __attribute__((kernel)) testCospiFloat3Float3(float3 inV) {
-    return cospi(inV);
-}
-
-float4 __attribute__((kernel)) testCospiFloat4Float4(float4 inV) {
-    return cospi(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCospiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCospiRelaxed.rs
deleted file mode 100644
index ba1cf13..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCospiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestCospi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCrossRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCrossRelaxed.rs
deleted file mode 100644
index e5f4e63..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCrossRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestCross.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDegreesRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDegreesRelaxed.rs
deleted file mode 100644
index 3ac3eab..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDegreesRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestDegrees.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDistanceRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDistanceRelaxed.rs
deleted file mode 100644
index d3717d4..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDistanceRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestDistance.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDot.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDot.rs
deleted file mode 100644
index cd531b4..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDot.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInRightVector;
-
-float __attribute__((kernel)) testDotFloatFloatFloat(float inLeftVector, unsigned int x) {
-    float inRightVector = rsGetElementAt_float(gAllocInRightVector, x);
-    return dot(inLeftVector, inRightVector);
-}
-
-float __attribute__((kernel)) testDotFloat2Float2Float(float2 inLeftVector, unsigned int x) {
-    float2 inRightVector = rsGetElementAt_float2(gAllocInRightVector, x);
-    return dot(inLeftVector, inRightVector);
-}
-
-float __attribute__((kernel)) testDotFloat3Float3Float(float3 inLeftVector, unsigned int x) {
-    float3 inRightVector = rsGetElementAt_float3(gAllocInRightVector, x);
-    return dot(inLeftVector, inRightVector);
-}
-
-float __attribute__((kernel)) testDotFloat4Float4Float(float4 inLeftVector, unsigned int x) {
-    float4 inRightVector = rsGetElementAt_float4(gAllocInRightVector, x);
-    return dot(inLeftVector, inRightVector);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDotRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDotRelaxed.rs
deleted file mode 100644
index d9dd162..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDotRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestDot.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErf.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErf.rs
deleted file mode 100644
index 15b4d0b..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErf.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testErfFloatFloat(float inV) {
-    return erf(inV);
-}
-
-float2 __attribute__((kernel)) testErfFloat2Float2(float2 inV) {
-    return erf(inV);
-}
-
-float3 __attribute__((kernel)) testErfFloat3Float3(float3 inV) {
-    return erf(inV);
-}
-
-float4 __attribute__((kernel)) testErfFloat4Float4(float4 inV) {
-    return erf(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfRelaxed.rs
deleted file mode 100644
index 680cdb9..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestErf.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfc.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfc.rs
deleted file mode 100644
index 154e7d8..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfc.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testErfcFloatFloat(float inV) {
-    return erfc(inV);
-}
-
-float2 __attribute__((kernel)) testErfcFloat2Float2(float2 inV) {
-    return erfc(inV);
-}
-
-float3 __attribute__((kernel)) testErfcFloat3Float3(float3 inV) {
-    return erfc(inV);
-}
-
-float4 __attribute__((kernel)) testErfcFloat4Float4(float4 inV) {
-    return erfc(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfcRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfcRelaxed.rs
deleted file mode 100644
index 5e54893..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfcRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestErfc.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp10.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp10.rs
deleted file mode 100644
index 95e5548..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp10.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testExp10FloatFloat(float inV) {
-    return exp10(inV);
-}
-
-float2 __attribute__((kernel)) testExp10Float2Float2(float2 inV) {
-    return exp10(inV);
-}
-
-float3 __attribute__((kernel)) testExp10Float3Float3(float3 inV) {
-    return exp10(inV);
-}
-
-float4 __attribute__((kernel)) testExp10Float4Float4(float4 inV) {
-    return exp10(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp10Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp10Relaxed.rs
deleted file mode 100644
index e49cce5..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp10Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestExp10.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp2.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp2.rs
deleted file mode 100644
index d85f60a..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp2.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testExp2FloatFloat(float inV) {
-    return exp2(inV);
-}
-
-float2 __attribute__((kernel)) testExp2Float2Float2(float2 inV) {
-    return exp2(inV);
-}
-
-float3 __attribute__((kernel)) testExp2Float3Float3(float3 inV) {
-    return exp2(inV);
-}
-
-float4 __attribute__((kernel)) testExp2Float4Float4(float4 inV) {
-    return exp2(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp2Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp2Relaxed.rs
deleted file mode 100644
index db56a96..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp2Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestExp2.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpRelaxed.rs
deleted file mode 100644
index 1e8fd5f..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestExp.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpm1.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpm1.rs
deleted file mode 100644
index 45faabd..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpm1.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testExpm1FloatFloat(float inV) {
-    return expm1(inV);
-}
-
-float2 __attribute__((kernel)) testExpm1Float2Float2(float2 inV) {
-    return expm1(inV);
-}
-
-float3 __attribute__((kernel)) testExpm1Float3Float3(float3 inV) {
-    return expm1(inV);
-}
-
-float4 __attribute__((kernel)) testExpm1Float4Float4(float4 inV) {
-    return expm1(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpm1Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpm1Relaxed.rs
deleted file mode 100644
index f0edb36..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpm1Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestExpm1.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFabs.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFabs.rs
deleted file mode 100644
index 61ba16f..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFabs.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testFabsFloatFloat(float inV) {
-    return fabs(inV);
-}
-
-float2 __attribute__((kernel)) testFabsFloat2Float2(float2 inV) {
-    return fabs(inV);
-}
-
-float3 __attribute__((kernel)) testFabsFloat3Float3(float3 inV) {
-    return fabs(inV);
-}
-
-float4 __attribute__((kernel)) testFabsFloat4Float4(float4 inV) {
-    return fabs(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFabsRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFabsRelaxed.rs
deleted file mode 100644
index 50a30ca..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFabsRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestFabs.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastDistanceRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastDistanceRelaxed.rs
deleted file mode 100644
index 1242cbf..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastDistanceRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestFastDistance.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastLengthRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastLengthRelaxed.rs
deleted file mode 100644
index 47dd33e..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastLengthRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestFastLength.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastNormalizeRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastNormalizeRelaxed.rs
deleted file mode 100644
index 79cd071..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastNormalizeRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestFastNormalize.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFdimRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFdimRelaxed.rs
deleted file mode 100644
index 7fa0a36..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFdimRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestFdim.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFloor.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFloor.rs
deleted file mode 100644
index abb50e3..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFloor.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testFloorFloatFloat(float inV) {
-    return floor(inV);
-}
-
-float2 __attribute__((kernel)) testFloorFloat2Float2(float2 inV) {
-    return floor(inV);
-}
-
-float3 __attribute__((kernel)) testFloorFloat3Float3(float3 inV) {
-    return floor(inV);
-}
-
-float4 __attribute__((kernel)) testFloorFloat4Float4(float4 inV) {
-    return floor(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFloorRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFloorRelaxed.rs
deleted file mode 100644
index 755218d..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFloorRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestFloor.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFma.java b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFma.java
deleted file mode 100644
index c8b0c0f..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFma.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-package android.renderscript.cts;
-
-import android.renderscript.Allocation;
-import android.renderscript.RSRuntimeException;
-import android.renderscript.Element;
-
-public class GeneratedTestFma extends RSBaseCompute {
-
-    private ScriptC_GeneratedTestFma script;
-    private ScriptC_GeneratedTestFmaRelaxed scriptRelaxed;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        script = new ScriptC_GeneratedTestFma(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFmaRelaxed(mRS);
-    }
-
-    public class ArgumentsFloatFloatFloatFloat {
-        public float inMultiplicand1;
-        public float inMultiplicand2;
-        public float inOffset;
-        public Target.Floaty out;
-    }
-
-    private void checkFmaFloatFloatFloatFloat() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x716293a685c419bel, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x716293a685c419bfl, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4a235a109d441b0el, false);
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInMultiplicand2(inMultiplicand2);
-            script.set_gAllocInOffset(inOffset);
-            script.forEach_testFmaFloatFloatFloatFloat(inMultiplicand1, out);
-            verifyResultsFmaFloatFloatFloatFloat(inMultiplicand1, inMultiplicand2, inOffset, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloatFloatFloatFloat: " + e.toString());
-        }
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInMultiplicand2(inMultiplicand2);
-            scriptRelaxed.set_gAllocInOffset(inOffset);
-            scriptRelaxed.forEach_testFmaFloatFloatFloatFloat(inMultiplicand1, out);
-            verifyResultsFmaFloatFloatFloatFloat(inMultiplicand1, inMultiplicand2, inOffset, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloatFloatFloatFloat: " + e.toString());
-        }
-    }
-
-    private void verifyResultsFmaFloatFloatFloatFloat(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
-        float[] arrayInMultiplicand1 = new float[INPUTSIZE * 1];
-        inMultiplicand1.copyTo(arrayInMultiplicand1);
-        float[] arrayInMultiplicand2 = new float[INPUTSIZE * 1];
-        inMultiplicand2.copyTo(arrayInMultiplicand2);
-        float[] arrayInOffset = new float[INPUTSIZE * 1];
-        inOffset.copyTo(arrayInOffset);
-        float[] arrayOut = new float[INPUTSIZE * 1];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 1 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
-                args.inMultiplicand1 = arrayInMultiplicand1[i];
-                args.inMultiplicand2 = arrayInMultiplicand2[i];
-                args.inOffset = arrayInOffset[i];
-                // Figure out what the outputs should have been.
-                Target target = new Target(relaxed);
-                CoreMathVerifier.computeFma(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                    valid = false;
-                }
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand1, Float.floatToRawIntBits(args.inMultiplicand1), args.inMultiplicand1));
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand2, Float.floatToRawIntBits(args.inMultiplicand2), args.inMultiplicand2));
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inOffset, Float.floatToRawIntBits(args.inOffset), args.inOffset));
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaFloatFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    private void checkFmaFloat2Float2Float2Float2() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1bb42af9dda15056l, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1bb42af9dda15057l, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x667fbd778aeda396l, false);
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInMultiplicand2(inMultiplicand2);
-            script.set_gAllocInOffset(inOffset);
-            script.forEach_testFmaFloat2Float2Float2Float2(inMultiplicand1, out);
-            verifyResultsFmaFloat2Float2Float2Float2(inMultiplicand1, inMultiplicand2, inOffset, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat2Float2Float2Float2: " + e.toString());
-        }
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInMultiplicand2(inMultiplicand2);
-            scriptRelaxed.set_gAllocInOffset(inOffset);
-            scriptRelaxed.forEach_testFmaFloat2Float2Float2Float2(inMultiplicand1, out);
-            verifyResultsFmaFloat2Float2Float2Float2(inMultiplicand1, inMultiplicand2, inOffset, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat2Float2Float2Float2: " + e.toString());
-        }
-    }
-
-    private void verifyResultsFmaFloat2Float2Float2Float2(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
-        float[] arrayInMultiplicand1 = new float[INPUTSIZE * 2];
-        inMultiplicand1.copyTo(arrayInMultiplicand1);
-        float[] arrayInMultiplicand2 = new float[INPUTSIZE * 2];
-        inMultiplicand2.copyTo(arrayInMultiplicand2);
-        float[] arrayInOffset = new float[INPUTSIZE * 2];
-        inOffset.copyTo(arrayInOffset);
-        float[] arrayOut = new float[INPUTSIZE * 2];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 2 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
-                args.inMultiplicand1 = arrayInMultiplicand1[i * 2 + j];
-                args.inMultiplicand2 = arrayInMultiplicand2[i * 2 + j];
-                args.inOffset = arrayInOffset[i * 2 + j];
-                // Figure out what the outputs should have been.
-                Target target = new Target(relaxed);
-                CoreMathVerifier.computeFma(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                    valid = false;
-                }
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand1, Float.floatToRawIntBits(args.inMultiplicand1), args.inMultiplicand1));
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand2, Float.floatToRawIntBits(args.inMultiplicand2), args.inMultiplicand2));
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inOffset, Float.floatToRawIntBits(args.inOffset), args.inOffset));
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaFloat2Float2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    private void checkFmaFloat3Float3Float3Float3() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x19169f2d349697b2l, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x19169f2d349697b3l, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3a56bf5454d5ec8al, false);
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInMultiplicand2(inMultiplicand2);
-            script.set_gAllocInOffset(inOffset);
-            script.forEach_testFmaFloat3Float3Float3Float3(inMultiplicand1, out);
-            verifyResultsFmaFloat3Float3Float3Float3(inMultiplicand1, inMultiplicand2, inOffset, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat3Float3Float3Float3: " + e.toString());
-        }
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInMultiplicand2(inMultiplicand2);
-            scriptRelaxed.set_gAllocInOffset(inOffset);
-            scriptRelaxed.forEach_testFmaFloat3Float3Float3Float3(inMultiplicand1, out);
-            verifyResultsFmaFloat3Float3Float3Float3(inMultiplicand1, inMultiplicand2, inOffset, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat3Float3Float3Float3: " + e.toString());
-        }
-    }
-
-    private void verifyResultsFmaFloat3Float3Float3Float3(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
-        float[] arrayInMultiplicand1 = new float[INPUTSIZE * 4];
-        inMultiplicand1.copyTo(arrayInMultiplicand1);
-        float[] arrayInMultiplicand2 = new float[INPUTSIZE * 4];
-        inMultiplicand2.copyTo(arrayInMultiplicand2);
-        float[] arrayInOffset = new float[INPUTSIZE * 4];
-        inOffset.copyTo(arrayInOffset);
-        float[] arrayOut = new float[INPUTSIZE * 4];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 3 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
-                args.inMultiplicand1 = arrayInMultiplicand1[i * 4 + j];
-                args.inMultiplicand2 = arrayInMultiplicand2[i * 4 + j];
-                args.inOffset = arrayInOffset[i * 4 + j];
-                // Figure out what the outputs should have been.
-                Target target = new Target(relaxed);
-                CoreMathVerifier.computeFma(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                    valid = false;
-                }
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand1, Float.floatToRawIntBits(args.inMultiplicand1), args.inMultiplicand1));
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand2, Float.floatToRawIntBits(args.inMultiplicand2), args.inMultiplicand2));
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inOffset, Float.floatToRawIntBits(args.inOffset), args.inOffset));
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaFloat3Float3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    private void checkFmaFloat4Float4Float4Float4() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x167913608b8bdf0el, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x167913608b8bdf0fl, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe2dc1311ebe357el, false);
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInMultiplicand2(inMultiplicand2);
-            script.set_gAllocInOffset(inOffset);
-            script.forEach_testFmaFloat4Float4Float4Float4(inMultiplicand1, out);
-            verifyResultsFmaFloat4Float4Float4Float4(inMultiplicand1, inMultiplicand2, inOffset, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat4Float4Float4Float4: " + e.toString());
-        }
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInMultiplicand2(inMultiplicand2);
-            scriptRelaxed.set_gAllocInOffset(inOffset);
-            scriptRelaxed.forEach_testFmaFloat4Float4Float4Float4(inMultiplicand1, out);
-            verifyResultsFmaFloat4Float4Float4Float4(inMultiplicand1, inMultiplicand2, inOffset, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat4Float4Float4Float4: " + e.toString());
-        }
-    }
-
-    private void verifyResultsFmaFloat4Float4Float4Float4(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
-        float[] arrayInMultiplicand1 = new float[INPUTSIZE * 4];
-        inMultiplicand1.copyTo(arrayInMultiplicand1);
-        float[] arrayInMultiplicand2 = new float[INPUTSIZE * 4];
-        inMultiplicand2.copyTo(arrayInMultiplicand2);
-        float[] arrayInOffset = new float[INPUTSIZE * 4];
-        inOffset.copyTo(arrayInOffset);
-        float[] arrayOut = new float[INPUTSIZE * 4];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 4 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
-                args.inMultiplicand1 = arrayInMultiplicand1[i * 4 + j];
-                args.inMultiplicand2 = arrayInMultiplicand2[i * 4 + j];
-                args.inOffset = arrayInOffset[i * 4 + j];
-                // Figure out what the outputs should have been.
-                Target target = new Target(relaxed);
-                CoreMathVerifier.computeFma(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                    valid = false;
-                }
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand1, Float.floatToRawIntBits(args.inMultiplicand1), args.inMultiplicand1));
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand2, Float.floatToRawIntBits(args.inMultiplicand2), args.inMultiplicand2));
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inOffset, Float.floatToRawIntBits(args.inOffset), args.inOffset));
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaFloat4Float4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    public void testFma() {
-        checkFmaFloatFloatFloatFloat();
-        checkFmaFloat2Float2Float2Float2();
-        checkFmaFloat3Float3Float3Float3();
-        checkFmaFloat4Float4Float4Float4();
-    }
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFma.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFma.rs
deleted file mode 100644
index cc67007..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFma.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInMultiplicand2;
-rs_allocation gAllocInOffset;
-
-float __attribute__((kernel)) testFmaFloatFloatFloatFloat(float inMultiplicand1, unsigned int x) {
-    float inMultiplicand2 = rsGetElementAt_float(gAllocInMultiplicand2, x);
-    float inOffset = rsGetElementAt_float(gAllocInOffset, x);
-    return fma(inMultiplicand1, inMultiplicand2, inOffset);
-}
-
-float2 __attribute__((kernel)) testFmaFloat2Float2Float2Float2(float2 inMultiplicand1, unsigned int x) {
-    float2 inMultiplicand2 = rsGetElementAt_float2(gAllocInMultiplicand2, x);
-    float2 inOffset = rsGetElementAt_float2(gAllocInOffset, x);
-    return fma(inMultiplicand1, inMultiplicand2, inOffset);
-}
-
-float3 __attribute__((kernel)) testFmaFloat3Float3Float3Float3(float3 inMultiplicand1, unsigned int x) {
-    float3 inMultiplicand2 = rsGetElementAt_float3(gAllocInMultiplicand2, x);
-    float3 inOffset = rsGetElementAt_float3(gAllocInOffset, x);
-    return fma(inMultiplicand1, inMultiplicand2, inOffset);
-}
-
-float4 __attribute__((kernel)) testFmaFloat4Float4Float4Float4(float4 inMultiplicand1, unsigned int x) {
-    float4 inMultiplicand2 = rsGetElementAt_float4(gAllocInMultiplicand2, x);
-    float4 inOffset = rsGetElementAt_float4(gAllocInOffset, x);
-    return fma(inMultiplicand1, inMultiplicand2, inOffset);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmaRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmaRelaxed.rs
deleted file mode 100644
index f1598a4..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmaRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestFma.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmaxRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmaxRelaxed.rs
deleted file mode 100644
index 05b4ce9..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmaxRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestFmax.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFminRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFminRelaxed.rs
deleted file mode 100644
index d498d0c..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFminRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestFmin.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmod.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmod.rs
deleted file mode 100644
index d8238aa..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmod.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInDenominator;
-
-float __attribute__((kernel)) testFmodFloatFloatFloat(float inNumerator, unsigned int x) {
-    float inDenominator = rsGetElementAt_float(gAllocInDenominator, x);
-    return fmod(inNumerator, inDenominator);
-}
-
-float2 __attribute__((kernel)) testFmodFloat2Float2Float2(float2 inNumerator, unsigned int x) {
-    float2 inDenominator = rsGetElementAt_float2(gAllocInDenominator, x);
-    return fmod(inNumerator, inDenominator);
-}
-
-float3 __attribute__((kernel)) testFmodFloat3Float3Float3(float3 inNumerator, unsigned int x) {
-    float3 inDenominator = rsGetElementAt_float3(gAllocInDenominator, x);
-    return fmod(inNumerator, inDenominator);
-}
-
-float4 __attribute__((kernel)) testFmodFloat4Float4Float4(float4 inNumerator, unsigned int x) {
-    float4 inDenominator = rsGetElementAt_float4(gAllocInDenominator, x);
-    return fmod(inNumerator, inDenominator);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmodRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmodRelaxed.rs
deleted file mode 100644
index b4e197b..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmodRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestFmod.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFrexpRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFrexpRelaxed.rs
deleted file mode 100644
index 0655077..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFrexpRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestFrexp.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRecipRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRecipRelaxed.rs
deleted file mode 100644
index 3278236..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRecipRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestHalfRecip.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRsqrtRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRsqrtRelaxed.rs
deleted file mode 100644
index d2fd430..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRsqrtRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestHalfRsqrt.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfSqrtRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfSqrtRelaxed.rs
deleted file mode 100644
index b3dd234..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfSqrtRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestHalfSqrt.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypotRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypotRelaxed.rs
deleted file mode 100644
index c026536..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypotRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestHypot.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestIlogb.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestIlogb.rs
deleted file mode 100644
index fbc070d..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestIlogb.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-int __attribute__((kernel)) testIlogbFloatInt(float inV) {
-    return ilogb(inV);
-}
-
-int2 __attribute__((kernel)) testIlogbFloat2Int2(float2 inV) {
-    return ilogb(inV);
-}
-
-int3 __attribute__((kernel)) testIlogbFloat3Int3(float3 inV) {
-    return ilogb(inV);
-}
-
-int4 __attribute__((kernel)) testIlogbFloat4Int4(float4 inV) {
-    return ilogb(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestIlogbRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestIlogbRelaxed.rs
deleted file mode 100644
index 4b1ea2d..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestIlogbRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestIlogb.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLdexp.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLdexp.rs
deleted file mode 100644
index b08dee7..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLdexp.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInExponent;
-
-float __attribute__((kernel)) testLdexpFloatIntFloat(float inMantissa, unsigned int x) {
-    int inExponent = rsGetElementAt_int(gAllocInExponent, x);
-    return ldexp(inMantissa, inExponent);
-}
-
-float2 __attribute__((kernel)) testLdexpFloat2Int2Float2(float2 inMantissa, unsigned int x) {
-    int2 inExponent = rsGetElementAt_int2(gAllocInExponent, x);
-    return ldexp(inMantissa, inExponent);
-}
-
-float3 __attribute__((kernel)) testLdexpFloat3Int3Float3(float3 inMantissa, unsigned int x) {
-    int3 inExponent = rsGetElementAt_int3(gAllocInExponent, x);
-    return ldexp(inMantissa, inExponent);
-}
-
-float4 __attribute__((kernel)) testLdexpFloat4Int4Float4(float4 inMantissa, unsigned int x) {
-    int4 inExponent = rsGetElementAt_int4(gAllocInExponent, x);
-    return ldexp(inMantissa, inExponent);
-}
-
-float2 __attribute__((kernel)) testLdexpFloat2IntFloat2(float2 inMantissa, unsigned int x) {
-    int inExponent = rsGetElementAt_int(gAllocInExponent, x);
-    return ldexp(inMantissa, inExponent);
-}
-
-float3 __attribute__((kernel)) testLdexpFloat3IntFloat3(float3 inMantissa, unsigned int x) {
-    int inExponent = rsGetElementAt_int(gAllocInExponent, x);
-    return ldexp(inMantissa, inExponent);
-}
-
-float4 __attribute__((kernel)) testLdexpFloat4IntFloat4(float4 inMantissa, unsigned int x) {
-    int inExponent = rsGetElementAt_int(gAllocInExponent, x);
-    return ldexp(inMantissa, inExponent);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLdexpRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLdexpRelaxed.rs
deleted file mode 100644
index 86d0ee0..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLdexpRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestLdexp.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLengthRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLengthRelaxed.rs
deleted file mode 100644
index 7036a69..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLengthRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestLength.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLgamma.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLgamma.rs
deleted file mode 100644
index c07df46..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLgamma.rs
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testLgammaFloatFloat(float inV) {
-    return lgamma(inV);
-}
-
-float2 __attribute__((kernel)) testLgammaFloat2Float2(float2 inV) {
-    return lgamma(inV);
-}
-
-float3 __attribute__((kernel)) testLgammaFloat3Float3(float3 inV) {
-    return lgamma(inV);
-}
-
-float4 __attribute__((kernel)) testLgammaFloat4Float4(float4 inV) {
-    return lgamma(inV);
-}
-rs_allocation gAllocOutSignOfGamma;
-
-float __attribute__((kernel)) testLgammaFloatIntFloat(float inV, unsigned int x) {
-    int outSignOfGamma = 0;
-    float out = lgamma(inV, &outSignOfGamma);
-    rsSetElementAt_int(gAllocOutSignOfGamma, outSignOfGamma, x);
-    return out;
-}
-
-float2 __attribute__((kernel)) testLgammaFloat2Int2Float2(float2 inV, unsigned int x) {
-    int2 outSignOfGamma = 0;
-    float2 out = lgamma(inV, &outSignOfGamma);
-    rsSetElementAt_int2(gAllocOutSignOfGamma, outSignOfGamma, x);
-    return out;
-}
-
-float3 __attribute__((kernel)) testLgammaFloat3Int3Float3(float3 inV, unsigned int x) {
-    int3 outSignOfGamma = 0;
-    float3 out = lgamma(inV, &outSignOfGamma);
-    rsSetElementAt_int3(gAllocOutSignOfGamma, outSignOfGamma, x);
-    return out;
-}
-
-float4 __attribute__((kernel)) testLgammaFloat4Int4Float4(float4 inV, unsigned int x) {
-    int4 outSignOfGamma = 0;
-    float4 out = lgamma(inV, &outSignOfGamma);
-    rsSetElementAt_int4(gAllocOutSignOfGamma, outSignOfGamma, x);
-    return out;
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLgammaRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLgammaRelaxed.rs
deleted file mode 100644
index 362c072..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLgammaRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestLgamma.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog.rs
deleted file mode 100644
index b228e97..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testLogFloatFloat(float inV) {
-    return log(inV);
-}
-
-float2 __attribute__((kernel)) testLogFloat2Float2(float2 inV) {
-    return log(inV);
-}
-
-float3 __attribute__((kernel)) testLogFloat3Float3(float3 inV) {
-    return log(inV);
-}
-
-float4 __attribute__((kernel)) testLogFloat4Float4(float4 inV) {
-    return log(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog10.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog10.rs
deleted file mode 100644
index 601c02b..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog10.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testLog10FloatFloat(float inV) {
-    return log10(inV);
-}
-
-float2 __attribute__((kernel)) testLog10Float2Float2(float2 inV) {
-    return log10(inV);
-}
-
-float3 __attribute__((kernel)) testLog10Float3Float3(float3 inV) {
-    return log10(inV);
-}
-
-float4 __attribute__((kernel)) testLog10Float4Float4(float4 inV) {
-    return log10(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog10Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog10Relaxed.rs
deleted file mode 100644
index 7529f68..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog10Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestLog10.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog1p.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog1p.rs
deleted file mode 100644
index 27ea4af..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog1p.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testLog1pFloatFloat(float inV) {
-    return log1p(inV);
-}
-
-float2 __attribute__((kernel)) testLog1pFloat2Float2(float2 inV) {
-    return log1p(inV);
-}
-
-float3 __attribute__((kernel)) testLog1pFloat3Float3(float3 inV) {
-    return log1p(inV);
-}
-
-float4 __attribute__((kernel)) testLog1pFloat4Float4(float4 inV) {
-    return log1p(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog1pRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog1pRelaxed.rs
deleted file mode 100644
index 6afe105..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog1pRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestLog1p.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog2.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog2.rs
deleted file mode 100644
index a9d6a06..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog2.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testLog2FloatFloat(float inV) {
-    return log2(inV);
-}
-
-float2 __attribute__((kernel)) testLog2Float2Float2(float2 inV) {
-    return log2(inV);
-}
-
-float3 __attribute__((kernel)) testLog2Float3Float3(float3 inV) {
-    return log2(inV);
-}
-
-float4 __attribute__((kernel)) testLog2Float4Float4(float4 inV) {
-    return log2(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog2Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog2Relaxed.rs
deleted file mode 100644
index 6caa3a0..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog2Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestLog2.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogRelaxed.rs
deleted file mode 100644
index f749edf..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestLog.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogb.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogb.rs
deleted file mode 100644
index e0ca286..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogb.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testLogbFloatFloat(float inV) {
-    return logb(inV);
-}
-
-float2 __attribute__((kernel)) testLogbFloat2Float2(float2 inV) {
-    return logb(inV);
-}
-
-float3 __attribute__((kernel)) testLogbFloat3Float3(float3 inV) {
-    return logb(inV);
-}
-
-float4 __attribute__((kernel)) testLogbFloat4Float4(float4 inV) {
-    return logb(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogbRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogbRelaxed.rs
deleted file mode 100644
index 6acab70..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogbRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestLogb.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMad.java b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMad.java
deleted file mode 100644
index 418bd9d..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMad.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-package android.renderscript.cts;
-
-import android.renderscript.Allocation;
-import android.renderscript.RSRuntimeException;
-import android.renderscript.Element;
-
-public class GeneratedTestMad extends RSBaseCompute {
-
-    private ScriptC_GeneratedTestMad script;
-    private ScriptC_GeneratedTestMadRelaxed scriptRelaxed;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        script = new ScriptC_GeneratedTestMad(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestMadRelaxed(mRS);
-    }
-
-    public class ArgumentsFloatFloatFloatFloat {
-        public float inMultiplicand1;
-        public float inMultiplicand2;
-        public float inOffset;
-        public Target.Floaty out;
-    }
-
-    private void checkMadFloatFloatFloatFloat() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2a4461e340b4de48l, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2a4461e340b4de49l, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xcea3b86dc50ce0fcl, false);
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInMultiplicand2(inMultiplicand2);
-            script.set_gAllocInOffset(inOffset);
-            script.forEach_testMadFloatFloatFloatFloat(inMultiplicand1, out);
-            verifyResultsMadFloatFloatFloatFloat(inMultiplicand1, inMultiplicand2, inOffset, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloatFloatFloatFloat: " + e.toString());
-        }
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInMultiplicand2(inMultiplicand2);
-            scriptRelaxed.set_gAllocInOffset(inOffset);
-            scriptRelaxed.forEach_testMadFloatFloatFloatFloat(inMultiplicand1, out);
-            verifyResultsMadFloatFloatFloatFloat(inMultiplicand1, inMultiplicand2, inOffset, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloatFloatFloatFloat: " + e.toString());
-        }
-    }
-
-    private void verifyResultsMadFloatFloatFloatFloat(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
-        float[] arrayInMultiplicand1 = new float[INPUTSIZE * 1];
-        inMultiplicand1.copyTo(arrayInMultiplicand1);
-        float[] arrayInMultiplicand2 = new float[INPUTSIZE * 1];
-        inMultiplicand2.copyTo(arrayInMultiplicand2);
-        float[] arrayInOffset = new float[INPUTSIZE * 1];
-        inOffset.copyTo(arrayInOffset);
-        float[] arrayOut = new float[INPUTSIZE * 1];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 1 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
-                args.inMultiplicand1 = arrayInMultiplicand1[i];
-                args.inMultiplicand2 = arrayInMultiplicand2[i];
-                args.inOffset = arrayInOffset[i];
-                // Figure out what the outputs should have been.
-                Target target = new Target(relaxed);
-                CoreMathVerifier.computeMad(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                    valid = false;
-                }
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand1, Float.floatToRawIntBits(args.inMultiplicand1), args.inMultiplicand1));
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand2, Float.floatToRawIntBits(args.inMultiplicand2), args.inMultiplicand2));
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inOffset, Float.floatToRawIntBits(args.inOffset), args.inOffset));
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMadFloatFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    private void checkMadFloat2Float2Float2Float2() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdfffb28a8a5fd7c0l, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdfffb28a8a5fd7c1l, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3da8592f318f8924l, false);
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInMultiplicand2(inMultiplicand2);
-            script.set_gAllocInOffset(inOffset);
-            script.forEach_testMadFloat2Float2Float2Float2(inMultiplicand1, out);
-            verifyResultsMadFloat2Float2Float2Float2(inMultiplicand1, inMultiplicand2, inOffset, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat2Float2Float2Float2: " + e.toString());
-        }
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInMultiplicand2(inMultiplicand2);
-            scriptRelaxed.set_gAllocInOffset(inOffset);
-            scriptRelaxed.forEach_testMadFloat2Float2Float2Float2(inMultiplicand1, out);
-            verifyResultsMadFloat2Float2Float2Float2(inMultiplicand1, inMultiplicand2, inOffset, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat2Float2Float2Float2: " + e.toString());
-        }
-    }
-
-    private void verifyResultsMadFloat2Float2Float2Float2(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
-        float[] arrayInMultiplicand1 = new float[INPUTSIZE * 2];
-        inMultiplicand1.copyTo(arrayInMultiplicand1);
-        float[] arrayInMultiplicand2 = new float[INPUTSIZE * 2];
-        inMultiplicand2.copyTo(arrayInMultiplicand2);
-        float[] arrayInOffset = new float[INPUTSIZE * 2];
-        inOffset.copyTo(arrayInOffset);
-        float[] arrayOut = new float[INPUTSIZE * 2];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 2 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
-                args.inMultiplicand1 = arrayInMultiplicand1[i * 2 + j];
-                args.inMultiplicand2 = arrayInMultiplicand2[i * 2 + j];
-                args.inOffset = arrayInOffset[i * 2 + j];
-                // Figure out what the outputs should have been.
-                Target target = new Target(relaxed);
-                CoreMathVerifier.computeMad(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                    valid = false;
-                }
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand1, Float.floatToRawIntBits(args.inMultiplicand1), args.inMultiplicand1));
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand2, Float.floatToRawIntBits(args.inMultiplicand2), args.inMultiplicand2));
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inOffset, Float.floatToRawIntBits(args.inOffset), args.inOffset));
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMadFloat2Float2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    private void checkMadFloat3Float3Float3Float3() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdd6226bde1551f1cl, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdd6226bde1551f1dl, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x117f5b0bfb77d218l, false);
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInMultiplicand2(inMultiplicand2);
-            script.set_gAllocInOffset(inOffset);
-            script.forEach_testMadFloat3Float3Float3Float3(inMultiplicand1, out);
-            verifyResultsMadFloat3Float3Float3Float3(inMultiplicand1, inMultiplicand2, inOffset, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat3Float3Float3Float3: " + e.toString());
-        }
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInMultiplicand2(inMultiplicand2);
-            scriptRelaxed.set_gAllocInOffset(inOffset);
-            scriptRelaxed.forEach_testMadFloat3Float3Float3Float3(inMultiplicand1, out);
-            verifyResultsMadFloat3Float3Float3Float3(inMultiplicand1, inMultiplicand2, inOffset, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat3Float3Float3Float3: " + e.toString());
-        }
-    }
-
-    private void verifyResultsMadFloat3Float3Float3Float3(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
-        float[] arrayInMultiplicand1 = new float[INPUTSIZE * 4];
-        inMultiplicand1.copyTo(arrayInMultiplicand1);
-        float[] arrayInMultiplicand2 = new float[INPUTSIZE * 4];
-        inMultiplicand2.copyTo(arrayInMultiplicand2);
-        float[] arrayInOffset = new float[INPUTSIZE * 4];
-        inOffset.copyTo(arrayInOffset);
-        float[] arrayOut = new float[INPUTSIZE * 4];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 3 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
-                args.inMultiplicand1 = arrayInMultiplicand1[i * 4 + j];
-                args.inMultiplicand2 = arrayInMultiplicand2[i * 4 + j];
-                args.inOffset = arrayInOffset[i * 4 + j];
-                // Figure out what the outputs should have been.
-                Target target = new Target(relaxed);
-                CoreMathVerifier.computeMad(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                    valid = false;
-                }
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand1, Float.floatToRawIntBits(args.inMultiplicand1), args.inMultiplicand1));
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand2, Float.floatToRawIntBits(args.inMultiplicand2), args.inMultiplicand2));
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inOffset, Float.floatToRawIntBits(args.inOffset), args.inOffset));
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMadFloat3Float3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    private void checkMadFloat4Float4Float4Float4() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdac49af1384a6678l, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdac49af1384a6679l, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe5565ce8c5601b0cl, false);
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInMultiplicand2(inMultiplicand2);
-            script.set_gAllocInOffset(inOffset);
-            script.forEach_testMadFloat4Float4Float4Float4(inMultiplicand1, out);
-            verifyResultsMadFloat4Float4Float4Float4(inMultiplicand1, inMultiplicand2, inOffset, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat4Float4Float4Float4: " + e.toString());
-        }
-        try {
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInMultiplicand2(inMultiplicand2);
-            scriptRelaxed.set_gAllocInOffset(inOffset);
-            scriptRelaxed.forEach_testMadFloat4Float4Float4Float4(inMultiplicand1, out);
-            verifyResultsMadFloat4Float4Float4Float4(inMultiplicand1, inMultiplicand2, inOffset, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat4Float4Float4Float4: " + e.toString());
-        }
-    }
-
-    private void verifyResultsMadFloat4Float4Float4Float4(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
-        float[] arrayInMultiplicand1 = new float[INPUTSIZE * 4];
-        inMultiplicand1.copyTo(arrayInMultiplicand1);
-        float[] arrayInMultiplicand2 = new float[INPUTSIZE * 4];
-        inMultiplicand2.copyTo(arrayInMultiplicand2);
-        float[] arrayInOffset = new float[INPUTSIZE * 4];
-        inOffset.copyTo(arrayInOffset);
-        float[] arrayOut = new float[INPUTSIZE * 4];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 4 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
-                args.inMultiplicand1 = arrayInMultiplicand1[i * 4 + j];
-                args.inMultiplicand2 = arrayInMultiplicand2[i * 4 + j];
-                args.inOffset = arrayInOffset[i * 4 + j];
-                // Figure out what the outputs should have been.
-                Target target = new Target(relaxed);
-                CoreMathVerifier.computeMad(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                    valid = false;
-                }
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand1, Float.floatToRawIntBits(args.inMultiplicand1), args.inMultiplicand1));
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMultiplicand2, Float.floatToRawIntBits(args.inMultiplicand2), args.inMultiplicand2));
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inOffset, Float.floatToRawIntBits(args.inOffset), args.inOffset));
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMadFloat4Float4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    public void testMad() {
-        checkMadFloatFloatFloatFloat();
-        checkMadFloat2Float2Float2Float2();
-        checkMadFloat3Float3Float3Float3();
-        checkMadFloat4Float4Float4Float4();
-    }
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMad.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMad.rs
deleted file mode 100644
index 3808b26..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMad.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInMultiplicand2;
-rs_allocation gAllocInOffset;
-
-float __attribute__((kernel)) testMadFloatFloatFloatFloat(float inMultiplicand1, unsigned int x) {
-    float inMultiplicand2 = rsGetElementAt_float(gAllocInMultiplicand2, x);
-    float inOffset = rsGetElementAt_float(gAllocInOffset, x);
-    return mad(inMultiplicand1, inMultiplicand2, inOffset);
-}
-
-float2 __attribute__((kernel)) testMadFloat2Float2Float2Float2(float2 inMultiplicand1, unsigned int x) {
-    float2 inMultiplicand2 = rsGetElementAt_float2(gAllocInMultiplicand2, x);
-    float2 inOffset = rsGetElementAt_float2(gAllocInOffset, x);
-    return mad(inMultiplicand1, inMultiplicand2, inOffset);
-}
-
-float3 __attribute__((kernel)) testMadFloat3Float3Float3Float3(float3 inMultiplicand1, unsigned int x) {
-    float3 inMultiplicand2 = rsGetElementAt_float3(gAllocInMultiplicand2, x);
-    float3 inOffset = rsGetElementAt_float3(gAllocInOffset, x);
-    return mad(inMultiplicand1, inMultiplicand2, inOffset);
-}
-
-float4 __attribute__((kernel)) testMadFloat4Float4Float4Float4(float4 inMultiplicand1, unsigned int x) {
-    float4 inMultiplicand2 = rsGetElementAt_float4(gAllocInMultiplicand2, x);
-    float4 inOffset = rsGetElementAt_float4(gAllocInOffset, x);
-    return mad(inMultiplicand1, inMultiplicand2, inOffset);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMadRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMadRelaxed.rs
deleted file mode 100644
index 17bd9ea..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMadRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestMad.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMax.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMax.rs
deleted file mode 100644
index ae8dd6a..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMax.rs
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInB;
-
-float __attribute__((kernel)) testMaxFloatFloatFloat(float inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return max(inA, inB);
-}
-
-float2 __attribute__((kernel)) testMaxFloat2Float2Float2(float2 inA, unsigned int x) {
-    float2 inB = rsGetElementAt_float2(gAllocInB, x);
-    return max(inA, inB);
-}
-
-float3 __attribute__((kernel)) testMaxFloat3Float3Float3(float3 inA, unsigned int x) {
-    float3 inB = rsGetElementAt_float3(gAllocInB, x);
-    return max(inA, inB);
-}
-
-float4 __attribute__((kernel)) testMaxFloat4Float4Float4(float4 inA, unsigned int x) {
-    float4 inB = rsGetElementAt_float4(gAllocInB, x);
-    return max(inA, inB);
-}
-
-char __attribute__((kernel)) testMaxCharCharChar(char inA, unsigned int x) {
-    char inB = rsGetElementAt_char(gAllocInB, x);
-    return max(inA, inB);
-}
-
-char2 __attribute__((kernel)) testMaxChar2Char2Char2(char2 inA, unsigned int x) {
-    char2 inB = rsGetElementAt_char2(gAllocInB, x);
-    return max(inA, inB);
-}
-
-char3 __attribute__((kernel)) testMaxChar3Char3Char3(char3 inA, unsigned int x) {
-    char3 inB = rsGetElementAt_char3(gAllocInB, x);
-    return max(inA, inB);
-}
-
-char4 __attribute__((kernel)) testMaxChar4Char4Char4(char4 inA, unsigned int x) {
-    char4 inB = rsGetElementAt_char4(gAllocInB, x);
-    return max(inA, inB);
-}
-
-uchar __attribute__((kernel)) testMaxUcharUcharUchar(uchar inA, unsigned int x) {
-    uchar inB = rsGetElementAt_uchar(gAllocInB, x);
-    return max(inA, inB);
-}
-
-uchar2 __attribute__((kernel)) testMaxUchar2Uchar2Uchar2(uchar2 inA, unsigned int x) {
-    uchar2 inB = rsGetElementAt_uchar2(gAllocInB, x);
-    return max(inA, inB);
-}
-
-uchar3 __attribute__((kernel)) testMaxUchar3Uchar3Uchar3(uchar3 inA, unsigned int x) {
-    uchar3 inB = rsGetElementAt_uchar3(gAllocInB, x);
-    return max(inA, inB);
-}
-
-uchar4 __attribute__((kernel)) testMaxUchar4Uchar4Uchar4(uchar4 inA, unsigned int x) {
-    uchar4 inB = rsGetElementAt_uchar4(gAllocInB, x);
-    return max(inA, inB);
-}
-
-short __attribute__((kernel)) testMaxShortShortShort(short inA, unsigned int x) {
-    short inB = rsGetElementAt_short(gAllocInB, x);
-    return max(inA, inB);
-}
-
-short2 __attribute__((kernel)) testMaxShort2Short2Short2(short2 inA, unsigned int x) {
-    short2 inB = rsGetElementAt_short2(gAllocInB, x);
-    return max(inA, inB);
-}
-
-short3 __attribute__((kernel)) testMaxShort3Short3Short3(short3 inA, unsigned int x) {
-    short3 inB = rsGetElementAt_short3(gAllocInB, x);
-    return max(inA, inB);
-}
-
-short4 __attribute__((kernel)) testMaxShort4Short4Short4(short4 inA, unsigned int x) {
-    short4 inB = rsGetElementAt_short4(gAllocInB, x);
-    return max(inA, inB);
-}
-
-ushort __attribute__((kernel)) testMaxUshortUshortUshort(ushort inA, unsigned int x) {
-    ushort inB = rsGetElementAt_ushort(gAllocInB, x);
-    return max(inA, inB);
-}
-
-ushort2 __attribute__((kernel)) testMaxUshort2Ushort2Ushort2(ushort2 inA, unsigned int x) {
-    ushort2 inB = rsGetElementAt_ushort2(gAllocInB, x);
-    return max(inA, inB);
-}
-
-ushort3 __attribute__((kernel)) testMaxUshort3Ushort3Ushort3(ushort3 inA, unsigned int x) {
-    ushort3 inB = rsGetElementAt_ushort3(gAllocInB, x);
-    return max(inA, inB);
-}
-
-ushort4 __attribute__((kernel)) testMaxUshort4Ushort4Ushort4(ushort4 inA, unsigned int x) {
-    ushort4 inB = rsGetElementAt_ushort4(gAllocInB, x);
-    return max(inA, inB);
-}
-
-int __attribute__((kernel)) testMaxIntIntInt(int inA, unsigned int x) {
-    int inB = rsGetElementAt_int(gAllocInB, x);
-    return max(inA, inB);
-}
-
-int2 __attribute__((kernel)) testMaxInt2Int2Int2(int2 inA, unsigned int x) {
-    int2 inB = rsGetElementAt_int2(gAllocInB, x);
-    return max(inA, inB);
-}
-
-int3 __attribute__((kernel)) testMaxInt3Int3Int3(int3 inA, unsigned int x) {
-    int3 inB = rsGetElementAt_int3(gAllocInB, x);
-    return max(inA, inB);
-}
-
-int4 __attribute__((kernel)) testMaxInt4Int4Int4(int4 inA, unsigned int x) {
-    int4 inB = rsGetElementAt_int4(gAllocInB, x);
-    return max(inA, inB);
-}
-
-uint __attribute__((kernel)) testMaxUintUintUint(uint inA, unsigned int x) {
-    uint inB = rsGetElementAt_uint(gAllocInB, x);
-    return max(inA, inB);
-}
-
-uint2 __attribute__((kernel)) testMaxUint2Uint2Uint2(uint2 inA, unsigned int x) {
-    uint2 inB = rsGetElementAt_uint2(gAllocInB, x);
-    return max(inA, inB);
-}
-
-uint3 __attribute__((kernel)) testMaxUint3Uint3Uint3(uint3 inA, unsigned int x) {
-    uint3 inB = rsGetElementAt_uint3(gAllocInB, x);
-    return max(inA, inB);
-}
-
-uint4 __attribute__((kernel)) testMaxUint4Uint4Uint4(uint4 inA, unsigned int x) {
-    uint4 inB = rsGetElementAt_uint4(gAllocInB, x);
-    return max(inA, inB);
-}
-
-long __attribute__((kernel)) testMaxLongLongLong(long inA, unsigned int x) {
-    long inB = rsGetElementAt_long(gAllocInB, x);
-    return max(inA, inB);
-}
-
-long2 __attribute__((kernel)) testMaxLong2Long2Long2(long2 inA, unsigned int x) {
-    long2 inB = rsGetElementAt_long2(gAllocInB, x);
-    return max(inA, inB);
-}
-
-long3 __attribute__((kernel)) testMaxLong3Long3Long3(long3 inA, unsigned int x) {
-    long3 inB = rsGetElementAt_long3(gAllocInB, x);
-    return max(inA, inB);
-}
-
-long4 __attribute__((kernel)) testMaxLong4Long4Long4(long4 inA, unsigned int x) {
-    long4 inB = rsGetElementAt_long4(gAllocInB, x);
-    return max(inA, inB);
-}
-
-ulong __attribute__((kernel)) testMaxUlongUlongUlong(ulong inA, unsigned int x) {
-    ulong inB = rsGetElementAt_ulong(gAllocInB, x);
-    return max(inA, inB);
-}
-
-ulong2 __attribute__((kernel)) testMaxUlong2Ulong2Ulong2(ulong2 inA, unsigned int x) {
-    ulong2 inB = rsGetElementAt_ulong2(gAllocInB, x);
-    return max(inA, inB);
-}
-
-ulong3 __attribute__((kernel)) testMaxUlong3Ulong3Ulong3(ulong3 inA, unsigned int x) {
-    ulong3 inB = rsGetElementAt_ulong3(gAllocInB, x);
-    return max(inA, inB);
-}
-
-ulong4 __attribute__((kernel)) testMaxUlong4Ulong4Ulong4(ulong4 inA, unsigned int x) {
-    ulong4 inB = rsGetElementAt_ulong4(gAllocInB, x);
-    return max(inA, inB);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMaxRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMaxRelaxed.rs
deleted file mode 100644
index 2f229a5..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMaxRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestMax.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMin.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMin.rs
deleted file mode 100644
index 4242cf2..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMin.rs
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInB;
-
-float __attribute__((kernel)) testMinFloatFloatFloat(float inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return min(inA, inB);
-}
-
-float2 __attribute__((kernel)) testMinFloat2Float2Float2(float2 inA, unsigned int x) {
-    float2 inB = rsGetElementAt_float2(gAllocInB, x);
-    return min(inA, inB);
-}
-
-float3 __attribute__((kernel)) testMinFloat3Float3Float3(float3 inA, unsigned int x) {
-    float3 inB = rsGetElementAt_float3(gAllocInB, x);
-    return min(inA, inB);
-}
-
-float4 __attribute__((kernel)) testMinFloat4Float4Float4(float4 inA, unsigned int x) {
-    float4 inB = rsGetElementAt_float4(gAllocInB, x);
-    return min(inA, inB);
-}
-
-char __attribute__((kernel)) testMinCharCharChar(char inA, unsigned int x) {
-    char inB = rsGetElementAt_char(gAllocInB, x);
-    return min(inA, inB);
-}
-
-char2 __attribute__((kernel)) testMinChar2Char2Char2(char2 inA, unsigned int x) {
-    char2 inB = rsGetElementAt_char2(gAllocInB, x);
-    return min(inA, inB);
-}
-
-char3 __attribute__((kernel)) testMinChar3Char3Char3(char3 inA, unsigned int x) {
-    char3 inB = rsGetElementAt_char3(gAllocInB, x);
-    return min(inA, inB);
-}
-
-char4 __attribute__((kernel)) testMinChar4Char4Char4(char4 inA, unsigned int x) {
-    char4 inB = rsGetElementAt_char4(gAllocInB, x);
-    return min(inA, inB);
-}
-
-uchar __attribute__((kernel)) testMinUcharUcharUchar(uchar inA, unsigned int x) {
-    uchar inB = rsGetElementAt_uchar(gAllocInB, x);
-    return min(inA, inB);
-}
-
-uchar2 __attribute__((kernel)) testMinUchar2Uchar2Uchar2(uchar2 inA, unsigned int x) {
-    uchar2 inB = rsGetElementAt_uchar2(gAllocInB, x);
-    return min(inA, inB);
-}
-
-uchar3 __attribute__((kernel)) testMinUchar3Uchar3Uchar3(uchar3 inA, unsigned int x) {
-    uchar3 inB = rsGetElementAt_uchar3(gAllocInB, x);
-    return min(inA, inB);
-}
-
-uchar4 __attribute__((kernel)) testMinUchar4Uchar4Uchar4(uchar4 inA, unsigned int x) {
-    uchar4 inB = rsGetElementAt_uchar4(gAllocInB, x);
-    return min(inA, inB);
-}
-
-short __attribute__((kernel)) testMinShortShortShort(short inA, unsigned int x) {
-    short inB = rsGetElementAt_short(gAllocInB, x);
-    return min(inA, inB);
-}
-
-short2 __attribute__((kernel)) testMinShort2Short2Short2(short2 inA, unsigned int x) {
-    short2 inB = rsGetElementAt_short2(gAllocInB, x);
-    return min(inA, inB);
-}
-
-short3 __attribute__((kernel)) testMinShort3Short3Short3(short3 inA, unsigned int x) {
-    short3 inB = rsGetElementAt_short3(gAllocInB, x);
-    return min(inA, inB);
-}
-
-short4 __attribute__((kernel)) testMinShort4Short4Short4(short4 inA, unsigned int x) {
-    short4 inB = rsGetElementAt_short4(gAllocInB, x);
-    return min(inA, inB);
-}
-
-ushort __attribute__((kernel)) testMinUshortUshortUshort(ushort inA, unsigned int x) {
-    ushort inB = rsGetElementAt_ushort(gAllocInB, x);
-    return min(inA, inB);
-}
-
-ushort2 __attribute__((kernel)) testMinUshort2Ushort2Ushort2(ushort2 inA, unsigned int x) {
-    ushort2 inB = rsGetElementAt_ushort2(gAllocInB, x);
-    return min(inA, inB);
-}
-
-ushort3 __attribute__((kernel)) testMinUshort3Ushort3Ushort3(ushort3 inA, unsigned int x) {
-    ushort3 inB = rsGetElementAt_ushort3(gAllocInB, x);
-    return min(inA, inB);
-}
-
-ushort4 __attribute__((kernel)) testMinUshort4Ushort4Ushort4(ushort4 inA, unsigned int x) {
-    ushort4 inB = rsGetElementAt_ushort4(gAllocInB, x);
-    return min(inA, inB);
-}
-
-int __attribute__((kernel)) testMinIntIntInt(int inA, unsigned int x) {
-    int inB = rsGetElementAt_int(gAllocInB, x);
-    return min(inA, inB);
-}
-
-int2 __attribute__((kernel)) testMinInt2Int2Int2(int2 inA, unsigned int x) {
-    int2 inB = rsGetElementAt_int2(gAllocInB, x);
-    return min(inA, inB);
-}
-
-int3 __attribute__((kernel)) testMinInt3Int3Int3(int3 inA, unsigned int x) {
-    int3 inB = rsGetElementAt_int3(gAllocInB, x);
-    return min(inA, inB);
-}
-
-int4 __attribute__((kernel)) testMinInt4Int4Int4(int4 inA, unsigned int x) {
-    int4 inB = rsGetElementAt_int4(gAllocInB, x);
-    return min(inA, inB);
-}
-
-uint __attribute__((kernel)) testMinUintUintUint(uint inA, unsigned int x) {
-    uint inB = rsGetElementAt_uint(gAllocInB, x);
-    return min(inA, inB);
-}
-
-uint2 __attribute__((kernel)) testMinUint2Uint2Uint2(uint2 inA, unsigned int x) {
-    uint2 inB = rsGetElementAt_uint2(gAllocInB, x);
-    return min(inA, inB);
-}
-
-uint3 __attribute__((kernel)) testMinUint3Uint3Uint3(uint3 inA, unsigned int x) {
-    uint3 inB = rsGetElementAt_uint3(gAllocInB, x);
-    return min(inA, inB);
-}
-
-uint4 __attribute__((kernel)) testMinUint4Uint4Uint4(uint4 inA, unsigned int x) {
-    uint4 inB = rsGetElementAt_uint4(gAllocInB, x);
-    return min(inA, inB);
-}
-
-long __attribute__((kernel)) testMinLongLongLong(long inA, unsigned int x) {
-    long inB = rsGetElementAt_long(gAllocInB, x);
-    return min(inA, inB);
-}
-
-long2 __attribute__((kernel)) testMinLong2Long2Long2(long2 inA, unsigned int x) {
-    long2 inB = rsGetElementAt_long2(gAllocInB, x);
-    return min(inA, inB);
-}
-
-long3 __attribute__((kernel)) testMinLong3Long3Long3(long3 inA, unsigned int x) {
-    long3 inB = rsGetElementAt_long3(gAllocInB, x);
-    return min(inA, inB);
-}
-
-long4 __attribute__((kernel)) testMinLong4Long4Long4(long4 inA, unsigned int x) {
-    long4 inB = rsGetElementAt_long4(gAllocInB, x);
-    return min(inA, inB);
-}
-
-ulong __attribute__((kernel)) testMinUlongUlongUlong(ulong inA, unsigned int x) {
-    ulong inB = rsGetElementAt_ulong(gAllocInB, x);
-    return min(inA, inB);
-}
-
-ulong2 __attribute__((kernel)) testMinUlong2Ulong2Ulong2(ulong2 inA, unsigned int x) {
-    ulong2 inB = rsGetElementAt_ulong2(gAllocInB, x);
-    return min(inA, inB);
-}
-
-ulong3 __attribute__((kernel)) testMinUlong3Ulong3Ulong3(ulong3 inA, unsigned int x) {
-    ulong3 inB = rsGetElementAt_ulong3(gAllocInB, x);
-    return min(inA, inB);
-}
-
-ulong4 __attribute__((kernel)) testMinUlong4Ulong4Ulong4(ulong4 inA, unsigned int x) {
-    ulong4 inB = rsGetElementAt_ulong4(gAllocInB, x);
-    return min(inA, inB);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMinRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMinRelaxed.rs
deleted file mode 100644
index 1481223..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMinRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestMin.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMixRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMixRelaxed.rs
deleted file mode 100644
index 5a49fa6..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMixRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestMix.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestModf.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestModf.rs
deleted file mode 100644
index 3e7aa15..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestModf.rs
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocOutIntegralPart;
-
-float __attribute__((kernel)) testModfFloatFloatFloat(float inV, unsigned int x) {
-    float outIntegralPart = 0;
-    float out = modf(inV, &outIntegralPart);
-    rsSetElementAt_float(gAllocOutIntegralPart, outIntegralPart, x);
-    return out;
-}
-
-float2 __attribute__((kernel)) testModfFloat2Float2Float2(float2 inV, unsigned int x) {
-    float2 outIntegralPart = 0;
-    float2 out = modf(inV, &outIntegralPart);
-    rsSetElementAt_float2(gAllocOutIntegralPart, outIntegralPart, x);
-    return out;
-}
-
-float3 __attribute__((kernel)) testModfFloat3Float3Float3(float3 inV, unsigned int x) {
-    float3 outIntegralPart = 0;
-    float3 out = modf(inV, &outIntegralPart);
-    rsSetElementAt_float3(gAllocOutIntegralPart, outIntegralPart, x);
-    return out;
-}
-
-float4 __attribute__((kernel)) testModfFloat4Float4Float4(float4 inV, unsigned int x) {
-    float4 outIntegralPart = 0;
-    float4 out = modf(inV, &outIntegralPart);
-    rsSetElementAt_float4(gAllocOutIntegralPart, outIntegralPart, x);
-    return out;
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestModfRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestModfRelaxed.rs
deleted file mode 100644
index 84fb128..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestModfRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestModf.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNanRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNanRelaxed.rs
deleted file mode 100644
index 1760b34..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNanRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNan.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcosRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcosRelaxed.rs
deleted file mode 100644
index 76ec4ce..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcosRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeAcos.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcoshRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcoshRelaxed.rs
deleted file mode 100644
index e31d1e1..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcoshRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeAcosh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcospiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcospiRelaxed.rs
deleted file mode 100644
index bfe1714..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcospiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeAcospi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinRelaxed.rs
deleted file mode 100644
index 9b2fb90..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeAsin.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinhRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinhRelaxed.rs
deleted file mode 100644
index 746f0ce..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinhRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeAsinh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinpiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinpiRelaxed.rs
deleted file mode 100644
index fdd04f9..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinpiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeAsinpi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2Relaxed.rs
deleted file mode 100644
index b70ad87..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeAtan2.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2pi.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2pi.rs
deleted file mode 100644
index 7637041..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2pi.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInDenominator;
-
-float __attribute__((kernel)) testNativeAtan2piFloatFloatFloat(float inNumerator, unsigned int x) {
-    float inDenominator = rsGetElementAt_float(gAllocInDenominator, x);
-    return native_atan2pi(inNumerator, inDenominator);
-}
-
-float2 __attribute__((kernel)) testNativeAtan2piFloat2Float2Float2(float2 inNumerator, unsigned int x) {
-    float2 inDenominator = rsGetElementAt_float2(gAllocInDenominator, x);
-    return native_atan2pi(inNumerator, inDenominator);
-}
-
-float3 __attribute__((kernel)) testNativeAtan2piFloat3Float3Float3(float3 inNumerator, unsigned int x) {
-    float3 inDenominator = rsGetElementAt_float3(gAllocInDenominator, x);
-    return native_atan2pi(inNumerator, inDenominator);
-}
-
-float4 __attribute__((kernel)) testNativeAtan2piFloat4Float4Float4(float4 inNumerator, unsigned int x) {
-    float4 inDenominator = rsGetElementAt_float4(gAllocInDenominator, x);
-    return native_atan2pi(inNumerator, inDenominator);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2piRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2piRelaxed.rs
deleted file mode 100644
index 4cd22fc..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2piRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeAtan2pi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanRelaxed.rs
deleted file mode 100644
index c77ea39..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeAtan.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanhRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanhRelaxed.rs
deleted file mode 100644
index e2c00fc..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanhRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeAtanh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanpiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanpiRelaxed.rs
deleted file mode 100644
index e32d10f..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanpiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeAtanpi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCbrtRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCbrtRelaxed.rs
deleted file mode 100644
index af4ede2..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCbrtRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeCbrt.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCosRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCosRelaxed.rs
deleted file mode 100644
index 7f74626..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCosRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeCos.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCoshRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCoshRelaxed.rs
deleted file mode 100644
index a12ce15..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCoshRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeCosh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCospiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCospiRelaxed.rs
deleted file mode 100644
index ff8b91e..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCospiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeCospi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDistance.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDistance.rs
deleted file mode 100644
index 872db3e..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDistance.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInRightVector;
-
-float __attribute__((kernel)) testNativeDistanceFloatFloatFloat(float inLeftVector, unsigned int x) {
-    float inRightVector = rsGetElementAt_float(gAllocInRightVector, x);
-    return native_distance(inLeftVector, inRightVector);
-}
-
-float __attribute__((kernel)) testNativeDistanceFloat2Float2Float(float2 inLeftVector, unsigned int x) {
-    float2 inRightVector = rsGetElementAt_float2(gAllocInRightVector, x);
-    return native_distance(inLeftVector, inRightVector);
-}
-
-float __attribute__((kernel)) testNativeDistanceFloat3Float3Float(float3 inLeftVector, unsigned int x) {
-    float3 inRightVector = rsGetElementAt_float3(gAllocInRightVector, x);
-    return native_distance(inLeftVector, inRightVector);
-}
-
-float __attribute__((kernel)) testNativeDistanceFloat4Float4Float(float4 inLeftVector, unsigned int x) {
-    float4 inRightVector = rsGetElementAt_float4(gAllocInRightVector, x);
-    return native_distance(inLeftVector, inRightVector);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDistanceRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDistanceRelaxed.rs
deleted file mode 100644
index 60c3aaf..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDistanceRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeDistance.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDivide.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDivide.rs
deleted file mode 100644
index db501c5..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDivide.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInRightVector;
-
-float __attribute__((kernel)) testNativeDivideFloatFloatFloat(float inLeftVector, unsigned int x) {
-    float inRightVector = rsGetElementAt_float(gAllocInRightVector, x);
-    return native_divide(inLeftVector, inRightVector);
-}
-
-float2 __attribute__((kernel)) testNativeDivideFloat2Float2Float2(float2 inLeftVector, unsigned int x) {
-    float2 inRightVector = rsGetElementAt_float2(gAllocInRightVector, x);
-    return native_divide(inLeftVector, inRightVector);
-}
-
-float3 __attribute__((kernel)) testNativeDivideFloat3Float3Float3(float3 inLeftVector, unsigned int x) {
-    float3 inRightVector = rsGetElementAt_float3(gAllocInRightVector, x);
-    return native_divide(inLeftVector, inRightVector);
-}
-
-float4 __attribute__((kernel)) testNativeDivideFloat4Float4Float4(float4 inLeftVector, unsigned int x) {
-    float4 inRightVector = rsGetElementAt_float4(gAllocInRightVector, x);
-    return native_divide(inLeftVector, inRightVector);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDivideRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDivideRelaxed.rs
deleted file mode 100644
index 6bb458d..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDivideRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeDivide.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp10Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp10Relaxed.rs
deleted file mode 100644
index fd63d34..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp10Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeExp10.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp2Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp2Relaxed.rs
deleted file mode 100644
index 7eb5b32..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp2Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeExp2.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpRelaxed.rs
deleted file mode 100644
index ab965b2..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeExp.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpm1Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpm1Relaxed.rs
deleted file mode 100644
index cad0784..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpm1Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeExpm1.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeHypotRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeHypotRelaxed.rs
deleted file mode 100644
index 5a97da6..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeHypotRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeHypot.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLengthRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLengthRelaxed.rs
deleted file mode 100644
index 5cdca08..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLengthRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeLength.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog10Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog10Relaxed.rs
deleted file mode 100644
index 42408f9..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog10Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeLog10.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog1pRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog1pRelaxed.rs
deleted file mode 100644
index 96ba4e0..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog1pRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeLog1p.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog2Relaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog2Relaxed.rs
deleted file mode 100644
index c51cf21..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog2Relaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeLog2.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLogRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLogRelaxed.rs
deleted file mode 100644
index 8e631be..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLogRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeLog.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeNormalizeRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeNormalizeRelaxed.rs
deleted file mode 100644
index 6036573..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeNormalizeRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeNormalize.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativePowrRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativePowrRelaxed.rs
deleted file mode 100644
index 216df7c..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativePowrRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativePowr.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRecipRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRecipRelaxed.rs
deleted file mode 100644
index 3dac525..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRecipRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeRecip.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRootnRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRootnRelaxed.rs
deleted file mode 100644
index 74c32dc..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRootnRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeRootn.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRsqrtRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRsqrtRelaxed.rs
deleted file mode 100644
index 9c61597..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRsqrtRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeRsqrt.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinRelaxed.rs
deleted file mode 100644
index 3db631d..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeSin.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSincosRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSincosRelaxed.rs
deleted file mode 100644
index 023df70..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSincosRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeSincos.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinhRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinhRelaxed.rs
deleted file mode 100644
index 2ae33f7..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinhRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeSinh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinpiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinpiRelaxed.rs
deleted file mode 100644
index dd92483..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinpiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeSinpi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSqrtRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSqrtRelaxed.rs
deleted file mode 100644
index 4797071..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSqrtRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeSqrt.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanRelaxed.rs
deleted file mode 100644
index a8533b4..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeTan.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanhRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanhRelaxed.rs
deleted file mode 100644
index cde0396..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanhRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeTanh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanpiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanpiRelaxed.rs
deleted file mode 100644
index 095f4b5..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanpiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNativeTanpi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNextafterRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNextafterRelaxed.rs
deleted file mode 100644
index 12f07f5..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNextafterRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNextafter.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNormalizeRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNormalizeRelaxed.rs
deleted file mode 100644
index 283fdb5..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNormalizeRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestNormalize.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowRelaxed.rs
deleted file mode 100644
index e95f00d..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestPow.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPownRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPownRelaxed.rs
deleted file mode 100644
index fd8255f..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPownRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestPown.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowrRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowrRelaxed.rs
deleted file mode 100644
index 8c2d3ac..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowrRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestPowr.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRadiansRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRadiansRelaxed.rs
deleted file mode 100644
index 8ed4122..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRadiansRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestRadians.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemainderRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemainderRelaxed.rs
deleted file mode 100644
index 33c5ca2..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemainderRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestRemainder.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemquo.java b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemquo.java
deleted file mode 100644
index 7298e5f..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemquo.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-package android.renderscript.cts;
-
-import android.renderscript.Allocation;
-import android.renderscript.RSRuntimeException;
-import android.renderscript.Element;
-
-public class GeneratedTestRemquo extends RSBaseCompute {
-
-    private ScriptC_GeneratedTestRemquo script;
-    private ScriptC_GeneratedTestRemquoRelaxed scriptRelaxed;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        script = new ScriptC_GeneratedTestRemquo(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestRemquoRelaxed(mRS);
-    }
-
-    public class ArgumentsFloatFloatIntFloat {
-        public float inNumerator;
-        public float inDenominator;
-        public int outQuotient;
-        public float out;
-    }
-
-    private void checkRemquoFloatFloatIntFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xcd5efc69edd4ff2al, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4ff0c9312eb19f93l, false);
-        try {
-            Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.set_gAllocOutQuotient(outQuotient);
-            script.forEach_testRemquoFloatFloatIntFloat(inNumerator, out);
-            verifyResultsRemquoFloatFloatIntFloat(inNumerator, inDenominator, outQuotient, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloatFloatIntFloat: " + e.toString());
-        }
-        try {
-            Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.set_gAllocOutQuotient(outQuotient);
-            scriptRelaxed.forEach_testRemquoFloatFloatIntFloat(inNumerator, out);
-            verifyResultsRemquoFloatFloatIntFloat(inNumerator, inDenominator, outQuotient, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloatFloatIntFloat: " + e.toString());
-        }
-    }
-
-    private void verifyResultsRemquoFloatFloatIntFloat(Allocation inNumerator, Allocation inDenominator, Allocation outQuotient, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 1];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 1];
-        inDenominator.copyTo(arrayInDenominator);
-        int[] arrayOutQuotient = new int[INPUTSIZE * 1];
-        outQuotient.copyTo(arrayOutQuotient);
-        float[] arrayOut = new float[INPUTSIZE * 1];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 1 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatIntFloat args = new ArgumentsFloatFloatIntFloat();
-                args.inNumerator = arrayInNumerator[i];
-                args.inDenominator = arrayInDenominator[i];
-                // Extract the outputs.
-                args.outQuotient = arrayOutQuotient[i * 1 + j];
-                args.out = arrayOut[i * 1 + j];
-                // Ask the CoreMathVerifier to validate.
-                Target target = new Target(relaxed);
-                String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
-                boolean valid = errorMessage == null;
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
-                    message.append("\n");
-                    message.append("Output outQuotient: ");
-                    message.append(String.format("%d", args.outQuotient));
-                    message.append("\n");
-                    message.append("Output out: ");
-                    message.append(Float.toString(args.out));
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkRemquoFloatFloatIntFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    private void checkRemquoFloat2Float2Int2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x28c14abc3a27171al, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x58f8799a6ba08403l, false);
-        try {
-            Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.set_gAllocOutQuotient(outQuotient);
-            script.forEach_testRemquoFloat2Float2Int2Float2(inNumerator, out);
-            verifyResultsRemquoFloat2Float2Int2Float2(inNumerator, inDenominator, outQuotient, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat2Float2Int2Float2: " + e.toString());
-        }
-        try {
-            Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.set_gAllocOutQuotient(outQuotient);
-            scriptRelaxed.forEach_testRemquoFloat2Float2Int2Float2(inNumerator, out);
-            verifyResultsRemquoFloat2Float2Int2Float2(inNumerator, inDenominator, outQuotient, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat2Float2Int2Float2: " + e.toString());
-        }
-    }
-
-    private void verifyResultsRemquoFloat2Float2Int2Float2(Allocation inNumerator, Allocation inDenominator, Allocation outQuotient, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 2];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 2];
-        inDenominator.copyTo(arrayInDenominator);
-        int[] arrayOutQuotient = new int[INPUTSIZE * 2];
-        outQuotient.copyTo(arrayOutQuotient);
-        float[] arrayOut = new float[INPUTSIZE * 2];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 2 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatIntFloat args = new ArgumentsFloatFloatIntFloat();
-                args.inNumerator = arrayInNumerator[i * 2 + j];
-                args.inDenominator = arrayInDenominator[i * 2 + j];
-                // Extract the outputs.
-                args.outQuotient = arrayOutQuotient[i * 2 + j];
-                args.out = arrayOut[i * 2 + j];
-                // Ask the CoreMathVerifier to validate.
-                Target target = new Target(relaxed);
-                String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
-                boolean valid = errorMessage == null;
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
-                    message.append("\n");
-                    message.append("Output outQuotient: ");
-                    message.append(String.format("%d", args.outQuotient));
-                    message.append("\n");
-                    message.append("Output out: ");
-                    message.append(Float.toString(args.out));
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkRemquoFloat2Float2Int2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    private void checkRemquoFloat3Float3Int3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf60211df96052526l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd1d6c7fcf273f8afl, false);
-        try {
-            Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.set_gAllocOutQuotient(outQuotient);
-            script.forEach_testRemquoFloat3Float3Int3Float3(inNumerator, out);
-            verifyResultsRemquoFloat3Float3Int3Float3(inNumerator, inDenominator, outQuotient, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat3Float3Int3Float3: " + e.toString());
-        }
-        try {
-            Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.set_gAllocOutQuotient(outQuotient);
-            scriptRelaxed.forEach_testRemquoFloat3Float3Int3Float3(inNumerator, out);
-            verifyResultsRemquoFloat3Float3Int3Float3(inNumerator, inDenominator, outQuotient, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat3Float3Int3Float3: " + e.toString());
-        }
-    }
-
-    private void verifyResultsRemquoFloat3Float3Int3Float3(Allocation inNumerator, Allocation inDenominator, Allocation outQuotient, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
-        int[] arrayOutQuotient = new int[INPUTSIZE * 4];
-        outQuotient.copyTo(arrayOutQuotient);
-        float[] arrayOut = new float[INPUTSIZE * 4];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 3 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatIntFloat args = new ArgumentsFloatFloatIntFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
-                // Extract the outputs.
-                args.outQuotient = arrayOutQuotient[i * 4 + j];
-                args.out = arrayOut[i * 4 + j];
-                // Ask the CoreMathVerifier to validate.
-                Target target = new Target(relaxed);
-                String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
-                boolean valid = errorMessage == null;
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
-                    message.append("\n");
-                    message.append("Output outQuotient: ");
-                    message.append(String.format("%d", args.outQuotient));
-                    message.append("\n");
-                    message.append("Output out: ");
-                    message.append(Float.toString(args.out));
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkRemquoFloat3Float3Int3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    private void checkRemquoFloat4Float4Int4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc342d902f1e33332l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4ab5165f79476d5bl, false);
-        try {
-            Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.set_gAllocOutQuotient(outQuotient);
-            script.forEach_testRemquoFloat4Float4Int4Float4(inNumerator, out);
-            verifyResultsRemquoFloat4Float4Int4Float4(inNumerator, inDenominator, outQuotient, out, false);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat4Float4Int4Float4: " + e.toString());
-        }
-        try {
-            Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
-            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.set_gAllocOutQuotient(outQuotient);
-            scriptRelaxed.forEach_testRemquoFloat4Float4Int4Float4(inNumerator, out);
-            verifyResultsRemquoFloat4Float4Int4Float4(inNumerator, inDenominator, outQuotient, out, true);
-        } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat4Float4Int4Float4: " + e.toString());
-        }
-    }
-
-    private void verifyResultsRemquoFloat4Float4Int4Float4(Allocation inNumerator, Allocation inDenominator, Allocation outQuotient, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
-        int[] arrayOutQuotient = new int[INPUTSIZE * 4];
-        outQuotient.copyTo(arrayOutQuotient);
-        float[] arrayOut = new float[INPUTSIZE * 4];
-        out.copyTo(arrayOut);
-        for (int i = 0; i < INPUTSIZE; i++) {
-            for (int j = 0; j < 4 ; j++) {
-                // Extract the inputs.
-                ArgumentsFloatFloatIntFloat args = new ArgumentsFloatFloatIntFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
-                // Extract the outputs.
-                args.outQuotient = arrayOutQuotient[i * 4 + j];
-                args.out = arrayOut[i * 4 + j];
-                // Ask the CoreMathVerifier to validate.
-                Target target = new Target(relaxed);
-                String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
-                boolean valid = errorMessage == null;
-                if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
-                    message.append("\n");
-                    message.append("Output outQuotient: ");
-                    message.append(String.format("%d", args.outQuotient));
-                    message.append("\n");
-                    message.append("Output out: ");
-                    message.append(Float.toString(args.out));
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkRemquoFloat4Float4Int4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
-                }
-            }
-        }
-    }
-
-    public void testRemquo() {
-        checkRemquoFloatFloatIntFloat();
-        checkRemquoFloat2Float2Int2Float2();
-        checkRemquoFloat3Float3Int3Float3();
-        checkRemquoFloat4Float4Int4Float4();
-    }
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemquo.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemquo.rs
deleted file mode 100644
index fada6c1..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemquo.rs
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-rs_allocation gAllocInDenominator;
-rs_allocation gAllocOutQuotient;
-
-float __attribute__((kernel)) testRemquoFloatFloatIntFloat(float inNumerator, unsigned int x) {
-    float inDenominator = rsGetElementAt_float(gAllocInDenominator, x);
-    int outQuotient = 0;
-    float out = remquo(inNumerator, inDenominator, &outQuotient);
-    rsSetElementAt_int(gAllocOutQuotient, outQuotient, x);
-    return out;
-}
-
-float2 __attribute__((kernel)) testRemquoFloat2Float2Int2Float2(float2 inNumerator, unsigned int x) {
-    float2 inDenominator = rsGetElementAt_float2(gAllocInDenominator, x);
-    int2 outQuotient = 0;
-    float2 out = remquo(inNumerator, inDenominator, &outQuotient);
-    rsSetElementAt_int2(gAllocOutQuotient, outQuotient, x);
-    return out;
-}
-
-float3 __attribute__((kernel)) testRemquoFloat3Float3Int3Float3(float3 inNumerator, unsigned int x) {
-    float3 inDenominator = rsGetElementAt_float3(gAllocInDenominator, x);
-    int3 outQuotient = 0;
-    float3 out = remquo(inNumerator, inDenominator, &outQuotient);
-    rsSetElementAt_int3(gAllocOutQuotient, outQuotient, x);
-    return out;
-}
-
-float4 __attribute__((kernel)) testRemquoFloat4Float4Int4Float4(float4 inNumerator, unsigned int x) {
-    float4 inDenominator = rsGetElementAt_float4(gAllocInDenominator, x);
-    int4 outQuotient = 0;
-    float4 out = remquo(inNumerator, inDenominator, &outQuotient);
-    rsSetElementAt_int4(gAllocOutQuotient, outQuotient, x);
-    return out;
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemquoRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemquoRelaxed.rs
deleted file mode 100644
index 85fc974..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemquoRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestRemquo.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRint.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRint.rs
deleted file mode 100644
index 937d1a4..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRint.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testRintFloatFloat(float inV) {
-    return rint(inV);
-}
-
-float2 __attribute__((kernel)) testRintFloat2Float2(float2 inV) {
-    return rint(inV);
-}
-
-float3 __attribute__((kernel)) testRintFloat3Float3(float3 inV) {
-    return rint(inV);
-}
-
-float4 __attribute__((kernel)) testRintFloat4Float4(float4 inV) {
-    return rint(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRintRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRintRelaxed.rs
deleted file mode 100644
index d9e2f89..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRintRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestRint.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRootnRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRootnRelaxed.rs
deleted file mode 100644
index 50c77e4..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRootnRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestRootn.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRound.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRound.rs
deleted file mode 100644
index df77461..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRound.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testRoundFloatFloat(float inV) {
-    return round(inV);
-}
-
-float2 __attribute__((kernel)) testRoundFloat2Float2(float2 inV) {
-    return round(inV);
-}
-
-float3 __attribute__((kernel)) testRoundFloat3Float3(float3 inV) {
-    return round(inV);
-}
-
-float4 __attribute__((kernel)) testRoundFloat4Float4(float4 inV) {
-    return round(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRoundRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRoundRelaxed.rs
deleted file mode 100644
index e15d81a..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRoundRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestRound.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRsqrt.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRsqrt.rs
deleted file mode 100644
index 72c65cc..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRsqrt.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testRsqrtFloatFloat(float inV) {
-    return rsqrt(inV);
-}
-
-float2 __attribute__((kernel)) testRsqrtFloat2Float2(float2 inV) {
-    return rsqrt(inV);
-}
-
-float3 __attribute__((kernel)) testRsqrtFloat3Float3(float3 inV) {
-    return rsqrt(inV);
-}
-
-float4 __attribute__((kernel)) testRsqrtFloat4Float4(float4 inV) {
-    return rsqrt(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRsqrtRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRsqrtRelaxed.rs
deleted file mode 100644
index a709839..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRsqrtRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestRsqrt.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSignRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSignRelaxed.rs
deleted file mode 100644
index 96293d2..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSignRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestSign.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSin.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSin.rs
deleted file mode 100644
index d68243a..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSin.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testSinFloatFloat(float inV) {
-    return sin(inV);
-}
-
-float2 __attribute__((kernel)) testSinFloat2Float2(float2 inV) {
-    return sin(inV);
-}
-
-float3 __attribute__((kernel)) testSinFloat3Float3(float3 inV) {
-    return sin(inV);
-}
-
-float4 __attribute__((kernel)) testSinFloat4Float4(float4 inV) {
-    return sin(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinRelaxed.rs
deleted file mode 100644
index ef09f8c..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestSin.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSincosRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSincosRelaxed.rs
deleted file mode 100644
index ab3359b..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSincosRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestSincos.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinh.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinh.rs
deleted file mode 100644
index 1624bd2..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinh.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testSinhFloatFloat(float inV) {
-    return sinh(inV);
-}
-
-float2 __attribute__((kernel)) testSinhFloat2Float2(float2 inV) {
-    return sinh(inV);
-}
-
-float3 __attribute__((kernel)) testSinhFloat3Float3(float3 inV) {
-    return sinh(inV);
-}
-
-float4 __attribute__((kernel)) testSinhFloat4Float4(float4 inV) {
-    return sinh(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinhRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinhRelaxed.rs
deleted file mode 100644
index 31ca12b..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinhRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestSinh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinpi.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinpi.rs
deleted file mode 100644
index 9ebbb05..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinpi.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testSinpiFloatFloat(float inV) {
-    return sinpi(inV);
-}
-
-float2 __attribute__((kernel)) testSinpiFloat2Float2(float2 inV) {
-    return sinpi(inV);
-}
-
-float3 __attribute__((kernel)) testSinpiFloat3Float3(float3 inV) {
-    return sinpi(inV);
-}
-
-float4 __attribute__((kernel)) testSinpiFloat4Float4(float4 inV) {
-    return sinpi(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinpiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinpiRelaxed.rs
deleted file mode 100644
index 9745638..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinpiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestSinpi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSqrt.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSqrt.rs
deleted file mode 100644
index dfae82a..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSqrt.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testSqrtFloatFloat(float inV) {
-    return sqrt(inV);
-}
-
-float2 __attribute__((kernel)) testSqrtFloat2Float2(float2 inV) {
-    return sqrt(inV);
-}
-
-float3 __attribute__((kernel)) testSqrtFloat3Float3(float3 inV) {
-    return sqrt(inV);
-}
-
-float4 __attribute__((kernel)) testSqrtFloat4Float4(float4 inV) {
-    return sqrt(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSqrtRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSqrtRelaxed.rs
deleted file mode 100644
index 9bb61e5..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSqrtRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestSqrt.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestStepRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestStepRelaxed.rs
deleted file mode 100644
index 20c4adb..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestStepRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestStep.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTan.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTan.rs
deleted file mode 100644
index 4190d54..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTan.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testTanFloatFloat(float inV) {
-    return tan(inV);
-}
-
-float2 __attribute__((kernel)) testTanFloat2Float2(float2 inV) {
-    return tan(inV);
-}
-
-float3 __attribute__((kernel)) testTanFloat3Float3(float3 inV) {
-    return tan(inV);
-}
-
-float4 __attribute__((kernel)) testTanFloat4Float4(float4 inV) {
-    return tan(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanRelaxed.rs
deleted file mode 100644
index 00374ce..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestTan.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanh.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanh.rs
deleted file mode 100644
index 5855222..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanh.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testTanhFloatFloat(float inV) {
-    return tanh(inV);
-}
-
-float2 __attribute__((kernel)) testTanhFloat2Float2(float2 inV) {
-    return tanh(inV);
-}
-
-float3 __attribute__((kernel)) testTanhFloat3Float3(float3 inV) {
-    return tanh(inV);
-}
-
-float4 __attribute__((kernel)) testTanhFloat4Float4(float4 inV) {
-    return tanh(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanhRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanhRelaxed.rs
deleted file mode 100644
index 37bd435..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanhRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestTanh.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanpi.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanpi.rs
deleted file mode 100644
index 2fa56e2..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanpi.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testTanpiFloatFloat(float inV) {
-    return tanpi(inV);
-}
-
-float2 __attribute__((kernel)) testTanpiFloat2Float2(float2 inV) {
-    return tanpi(inV);
-}
-
-float3 __attribute__((kernel)) testTanpiFloat3Float3(float3 inV) {
-    return tanpi(inV);
-}
-
-float4 __attribute__((kernel)) testTanpiFloat4Float4(float4 inV) {
-    return tanpi(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanpiRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanpiRelaxed.rs
deleted file mode 100644
index a7e3df5..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanpiRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestTanpi.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTgamma.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTgamma.rs
deleted file mode 100644
index b27b7d4..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTgamma.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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)
-
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
-
-float __attribute__((kernel)) testTgammaFloatFloat(float inV) {
-    return tgamma(inV);
-}
-
-float2 __attribute__((kernel)) testTgammaFloat2Float2(float2 inV) {
-    return tgamma(inV);
-}
-
-float3 __attribute__((kernel)) testTgammaFloat3Float3(float3 inV) {
-    return tgamma(inV);
-}
-
-float4 __attribute__((kernel)) testTgammaFloat4Float4(float4 inV) {
-    return tgamma(inV);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTgammaRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTgammaRelaxed.rs
deleted file mode 100644
index 8f5d63b..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTgammaRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestTgamma.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTruncRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTruncRelaxed.rs
deleted file mode 100644
index eb18613..0000000
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTruncRelaxed.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "GeneratedTestTrunc.rs"
-#pragma rs_fp_relaxed
-// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java
index 9028c37..d593bff 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java
@@ -67,24 +67,8 @@
                 sr.forEach_bicubic_U1(mAllocDst);
                 break;
             }
-        } else {
-            switch(vecSize) {
-            case 4:
-                sr.forEach_bicubic_F4(mAllocDst);
-                break;
-            case 3:
-                sr.forEach_bicubic_F3(mAllocDst);
-                break;
-            case 2:
-                sr.forEach_bicubic_F2(mAllocDst);
-                break;
-            case 1:
-                sr.forEach_bicubic_F1(mAllocDst);
-                break;
-            }
         }
 
-
         mVerify.invoke_verify(mAllocRef, mAllocDst, mAllocSrc);
         if (outW == w && outH == h) {
             //when scale = 1, check with the original.
@@ -264,176 +248,4 @@
         testReszie(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
         checkError();
     }
-
-
-    public void test_F32_4_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
-        checkError();
-    }
-    public void test_F32_3_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
-        checkError();
-    }
-    public void test_F32_2_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
-        checkError();
-    }
-    public void test_F32_1_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
-        checkError();
-    }
-
-    public void test_F32_4_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
-        checkError();
-    }
-    public void test_F32_3_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
-        checkError();
-    }
-    public void test_F32_2_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
-        checkError();
-    }
-    public void test_F32_1_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
-        checkError();
-    }
-
-    public void test_F32_4_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
-        checkError();
-    }
-    public void test_F32_3_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
-        checkError();
-    }
-    public void test_F32_2_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
-        checkError();
-    }
-    public void test_F32_1_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
-        checkError();
-    }
-
-    public void test_F32_4_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
-        checkError();
-    }
-    public void test_F32_3_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
-        checkError();
-    }
-    public void test_F32_2_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
-        checkError();
-    }
-    public void test_F32_1_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
-        checkError();
-    }
-
-    public void test_F32_4_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
-        checkError();
-    }
-    public void test_F32_3_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
-        checkError();
-    }
-    public void test_F32_2_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
-        checkError();
-    }
-    public void test_F32_1_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
-        checkError();
-    }
-
-    public void test_F32_4_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
-        checkError();
-    }
-    public void test_F32_3_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
-        checkError();
-    }
-    public void test_F32_2_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
-        checkError();
-    }
-    public void test_F32_1_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
-        checkError();
-    }
-
-    public void test_F32_4_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
-        checkError();
-    }
-    public void test_F32_3_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
-        checkError();
-    }
-    public void test_F32_2_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
-        checkError();
-    }
-    public void test_F32_1_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
-        checkError();
-    }
-
-    public void test_F32_4_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
-        checkError();
-    }
-    public void test_F32_3_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
-        checkError();
-    }
-    public void test_F32_2_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
-        checkError();
-    }
-    public void test_F32_1_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
-        checkError();
-    }
-
-    public void test_F32_4_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
-        checkError();
-    }
-    public void test_F32_3_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
-        checkError();
-    }
-    public void test_F32_2_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
-        checkError();
-    }
-    public void test_F32_1_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
-        checkError();
-    }
-
-    public void test_F32_4_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
-        checkError();
-    }
-    public void test_F32_3_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
-        checkError();
-    }
-    public void test_F32_2_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
-        checkError();
-    }
-    public void test_F32_1_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
-        checkError();
-    }
-
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/MatrixTest.rs b/tests/tests/renderscript/src/android/renderscript/cts/MatrixTest.rs
index a71deef..f1dbc64 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/MatrixTest.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/MatrixTest.rs
@@ -268,13 +268,11 @@
   const float2 f2r = rsMatrixMultiply(&m2, f2);
   const float3 f3r = rsMatrixMultiply(&m3, f3);
   const float4 f4r = rsMatrixMultiply(&m4, f4);
-  const float4 f3m4r = rsMatrixMultiply(&m4, f3);
 
   // rsMatrixMultiply returns (matrix * vector)
   const float2 f2rExpectedValues = { 14.f, 24.f };
   const float3 f3rExpectedValues = { 21.f, 31.f, 41.f };
   const float4 f4rExpectedValues = {168.f, 298.f, 428.f, 558.f};
-  const float4 f3m4rExpectedValues = {35.0, 55.0, 75.0, 95.0};
 
   for (int row = 0; row < 2; row++) {
     EXPECT(row, 0, f2r[row], f2rExpectedValues[row]);
@@ -288,10 +286,6 @@
     EXPECT(row, 0, f4r[row], f4rExpectedValues[row]);
   }
 
-  for (int row = 0; row < 4; row++) {
-    EXPECT(row, 0, f3m4r[row], f3m4rExpectedValues[row]);
-  }
-
   return failed;
 }
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAbs.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAbs.java
similarity index 74%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAbs.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAbs.java
index 05acb35..6b3914c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAbs.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAbs.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAbs extends RSBaseCompute {
+public class TestAbs extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAbs script;
-    private ScriptC_GeneratedTestAbsRelaxed scriptRelaxed;
+    private ScriptC_TestAbs script;
+    private ScriptC_TestAbsRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAbs(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAbsRelaxed(mRS);
+        script = new ScriptC_TestAbs(mRS);
+        scriptRelaxed = new ScriptC_TestAbsRelaxed(mRS);
     }
 
     public class ArgumentsCharUchar {
-        public byte inV;
+        public byte inValue;
         public byte out;
     }
 
     private void checkAbsCharUchar() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x79257810f7393ea6l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x4c0d03eb0d0c5a91l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 1), INPUTSIZE);
-            script.forEach_testAbsCharUchar(inV, out);
-            verifyResultsAbsCharUchar(inV, out, false);
+            script.forEach_testAbsCharUchar(inValue, out);
+            verifyResultsAbsCharUchar(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsCharUchar: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsCharUchar(inV, out);
-            verifyResultsAbsCharUchar(inV, out, true);
+            scriptRelaxed.forEach_testAbsCharUchar(inValue, out);
+            verifyResultsAbsCharUchar(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsCharUchar: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsCharUchar(Allocation inV, Allocation out, boolean relaxed) {
-        byte[] arrayInV = new byte[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsCharUchar(Allocation inValue, Allocation out, boolean relaxed) {
+        byte[] arrayInValue = new byte[INPUTSIZE * 1];
+        inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharUchar args = new ArgumentsCharUchar();
-                args.inV = arrayInV[i];
+                args.inValue = arrayInValue[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -76,8 +76,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -96,33 +96,33 @@
     }
 
     private void checkAbsChar2Uchar2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xff611dd40e5e407cl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x901d551e7f67bb87l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
-            script.forEach_testAbsChar2Uchar2(inV, out);
-            verifyResultsAbsChar2Uchar2(inV, out, false);
+            script.forEach_testAbsChar2Uchar2(inValue, out);
+            verifyResultsAbsChar2Uchar2(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsChar2Uchar2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsChar2Uchar2(inV, out);
-            verifyResultsAbsChar2Uchar2(inV, out, true);
+            scriptRelaxed.forEach_testAbsChar2Uchar2(inValue, out);
+            verifyResultsAbsChar2Uchar2(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsChar2Uchar2: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsChar2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
-        byte[] arrayInV = new byte[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsChar2Uchar2(Allocation inValue, Allocation out, boolean relaxed) {
+        byte[] arrayInValue = new byte[INPUTSIZE * 2];
+        inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharUchar args = new ArgumentsCharUchar();
-                args.inV = arrayInV[i * 2 + j];
+                args.inValue = arrayInValue[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -132,8 +132,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -152,33 +152,33 @@
     }
 
     private void checkAbsChar3Uchar3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xff62e6ef0479615al, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xb5d1caa5c8a5e105l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
-            script.forEach_testAbsChar3Uchar3(inV, out);
-            verifyResultsAbsChar3Uchar3(inV, out, false);
+            script.forEach_testAbsChar3Uchar3(inValue, out);
+            verifyResultsAbsChar3Uchar3(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsChar3Uchar3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsChar3Uchar3(inV, out);
-            verifyResultsAbsChar3Uchar3(inV, out, true);
+            scriptRelaxed.forEach_testAbsChar3Uchar3(inValue, out);
+            verifyResultsAbsChar3Uchar3(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsChar3Uchar3: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsChar3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
-        byte[] arrayInV = new byte[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsChar3Uchar3(Allocation inValue, Allocation out, boolean relaxed) {
+        byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharUchar args = new ArgumentsCharUchar();
-                args.inV = arrayInV[i * 4 + j];
+                args.inValue = arrayInValue[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -188,8 +188,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -208,33 +208,33 @@
     }
 
     private void checkAbsChar4Uchar4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xff64b009fa948238l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xdb86402d11e40683l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
-            script.forEach_testAbsChar4Uchar4(inV, out);
-            verifyResultsAbsChar4Uchar4(inV, out, false);
+            script.forEach_testAbsChar4Uchar4(inValue, out);
+            verifyResultsAbsChar4Uchar4(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsChar4Uchar4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsChar4Uchar4(inV, out);
-            verifyResultsAbsChar4Uchar4(inV, out, true);
+            scriptRelaxed.forEach_testAbsChar4Uchar4(inValue, out);
+            verifyResultsAbsChar4Uchar4(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsChar4Uchar4: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsChar4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
-        byte[] arrayInV = new byte[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsChar4Uchar4(Allocation inValue, Allocation out, boolean relaxed) {
+        byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharUchar args = new ArgumentsCharUchar();
-                args.inV = arrayInV[i * 4 + j];
+                args.inValue = arrayInValue[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -244,8 +244,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -264,38 +264,38 @@
     }
 
     public class ArgumentsShortUshort {
-        public short inV;
+        public short inValue;
         public short out;
     }
 
     private void checkAbsShortUshort() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xfab837da064819cl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xaead1a96b6ea02a7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 1), INPUTSIZE);
-            script.forEach_testAbsShortUshort(inV, out);
-            verifyResultsAbsShortUshort(inV, out, false);
+            script.forEach_testAbsShortUshort(inValue, out);
+            verifyResultsAbsShortUshort(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsShortUshort: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsShortUshort(inV, out);
-            verifyResultsAbsShortUshort(inV, out, true);
+            scriptRelaxed.forEach_testAbsShortUshort(inValue, out);
+            verifyResultsAbsShortUshort(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsShortUshort: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsShortUshort(Allocation inV, Allocation out, boolean relaxed) {
-        short[] arrayInV = new short[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsShortUshort(Allocation inValue, Allocation out, boolean relaxed) {
+        short[] arrayInValue = new short[INPUTSIZE * 1];
+        inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortUshort args = new ArgumentsShortUshort();
-                args.inV = arrayInV[i];
+                args.inValue = arrayInValue[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -305,8 +305,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -325,33 +325,33 @@
     }
 
     private void checkAbsShort2Ushort2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x231450e16856b93el, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x41a1894ff6b0da9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
-            script.forEach_testAbsShort2Ushort2(inV, out);
-            verifyResultsAbsShort2Ushort2(inV, out, false);
+            script.forEach_testAbsShort2Ushort2(inValue, out);
+            verifyResultsAbsShort2Ushort2(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsShort2Ushort2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsShort2Ushort2(inV, out);
-            verifyResultsAbsShort2Ushort2(inV, out, true);
+            scriptRelaxed.forEach_testAbsShort2Ushort2(inValue, out);
+            verifyResultsAbsShort2Ushort2(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsShort2Ushort2: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsShort2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
-        short[] arrayInV = new short[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsShort2Ushort2(Allocation inValue, Allocation out, boolean relaxed) {
+        short[] arrayInValue = new short[INPUTSIZE * 2];
+        inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortUshort args = new ArgumentsShortUshort();
-                args.inV = arrayInV[i * 2 + j];
+                args.inValue = arrayInValue[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -361,8 +361,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -381,33 +381,33 @@
     }
 
     private void checkAbsShort3Ushort3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x23611868beb24a6al, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x5969cbec377ba515l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
-            script.forEach_testAbsShort3Ushort3(inV, out);
-            verifyResultsAbsShort3Ushort3(inV, out, false);
+            script.forEach_testAbsShort3Ushort3(inValue, out);
+            verifyResultsAbsShort3Ushort3(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsShort3Ushort3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsShort3Ushort3(inV, out);
-            verifyResultsAbsShort3Ushort3(inV, out, true);
+            scriptRelaxed.forEach_testAbsShort3Ushort3(inValue, out);
+            verifyResultsAbsShort3Ushort3(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsShort3Ushort3: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsShort3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
-        short[] arrayInV = new short[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsShort3Ushort3(Allocation inValue, Allocation out, boolean relaxed) {
+        short[] arrayInValue = new short[INPUTSIZE * 4];
+        inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortUshort args = new ArgumentsShortUshort();
-                args.inV = arrayInV[i * 4 + j];
+                args.inValue = arrayInValue[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -417,8 +417,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -437,33 +437,33 @@
     }
 
     private void checkAbsShort4Ushort4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x23addff0150ddb96l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xaeb97f436f8c3c81l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
-            script.forEach_testAbsShort4Ushort4(inV, out);
-            verifyResultsAbsShort4Ushort4(inV, out, false);
+            script.forEach_testAbsShort4Ushort4(inValue, out);
+            verifyResultsAbsShort4Ushort4(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsShort4Ushort4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsShort4Ushort4(inV, out);
-            verifyResultsAbsShort4Ushort4(inV, out, true);
+            scriptRelaxed.forEach_testAbsShort4Ushort4(inValue, out);
+            verifyResultsAbsShort4Ushort4(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsShort4Ushort4: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsShort4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
-        short[] arrayInV = new short[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsShort4Ushort4(Allocation inValue, Allocation out, boolean relaxed) {
+        short[] arrayInValue = new short[INPUTSIZE * 4];
+        inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortUshort args = new ArgumentsShortUshort();
-                args.inV = arrayInV[i * 4 + j];
+                args.inValue = arrayInValue[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -473,8 +473,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -493,38 +493,38 @@
     }
 
     public class ArgumentsIntUint {
-        public int inV;
+        public int inValue;
         public int out;
     }
 
     private void checkAbsIntUint() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x6adb1880ac5b83e6l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xcda40fd4fa1abbd1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 1), INPUTSIZE);
-            script.forEach_testAbsIntUint(inV, out);
-            verifyResultsAbsIntUint(inV, out, false);
+            script.forEach_testAbsIntUint(inValue, out);
+            verifyResultsAbsIntUint(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsIntUint: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsIntUint(inV, out);
-            verifyResultsAbsIntUint(inV, out, true);
+            scriptRelaxed.forEach_testAbsIntUint(inValue, out);
+            verifyResultsAbsIntUint(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsIntUint: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsIntUint(Allocation inV, Allocation out, boolean relaxed) {
-        int[] arrayInV = new int[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsIntUint(Allocation inValue, Allocation out, boolean relaxed) {
+        int[] arrayInValue = new int[INPUTSIZE * 1];
+        inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntUint args = new ArgumentsIntUint();
-                args.inV = arrayInV[i];
+                args.inValue = arrayInValue[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -534,8 +534,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -554,33 +554,33 @@
     }
 
     private void checkAbsInt2Uint2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xc8728053938616fal, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x71326739aabbb4a5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
-            script.forEach_testAbsInt2Uint2(inV, out);
-            verifyResultsAbsInt2Uint2(inV, out, false);
+            script.forEach_testAbsInt2Uint2(inValue, out);
+            verifyResultsAbsInt2Uint2(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsInt2Uint2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsInt2Uint2(inV, out);
-            verifyResultsAbsInt2Uint2(inV, out, true);
+            scriptRelaxed.forEach_testAbsInt2Uint2(inValue, out);
+            verifyResultsAbsInt2Uint2(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsInt2Uint2: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsInt2Uint2(Allocation inV, Allocation out, boolean relaxed) {
-        int[] arrayInV = new int[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsInt2Uint2(Allocation inValue, Allocation out, boolean relaxed) {
+        int[] arrayInValue = new int[INPUTSIZE * 2];
+        inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntUint args = new ArgumentsIntUint();
-                args.inV = arrayInV[i * 2 + j];
+                args.inValue = arrayInValue[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -590,8 +590,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -610,33 +610,33 @@
     }
 
     private void checkAbsInt3Uint3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xc8728af4f28ddbeel, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x9bbf87f7a6fae959l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
-            script.forEach_testAbsInt3Uint3(inV, out);
-            verifyResultsAbsInt3Uint3(inV, out, false);
+            script.forEach_testAbsInt3Uint3(inValue, out);
+            verifyResultsAbsInt3Uint3(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsInt3Uint3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsInt3Uint3(inV, out);
-            verifyResultsAbsInt3Uint3(inV, out, true);
+            scriptRelaxed.forEach_testAbsInt3Uint3(inValue, out);
+            verifyResultsAbsInt3Uint3(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsInt3Uint3: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsInt3Uint3(Allocation inV, Allocation out, boolean relaxed) {
-        int[] arrayInV = new int[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsInt3Uint3(Allocation inValue, Allocation out, boolean relaxed) {
+        int[] arrayInValue = new int[INPUTSIZE * 4];
+        inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntUint args = new ArgumentsIntUint();
-                args.inV = arrayInV[i * 4 + j];
+                args.inValue = arrayInValue[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -646,8 +646,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -666,33 +666,33 @@
     }
 
     private void checkAbsInt4Uint4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xc87295965195a0e2l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xc64ca8b5a33a1e0dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
-            script.forEach_testAbsInt4Uint4(inV, out);
-            verifyResultsAbsInt4Uint4(inV, out, false);
+            script.forEach_testAbsInt4Uint4(inValue, out);
+            verifyResultsAbsInt4Uint4(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsInt4Uint4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testAbsInt4Uint4(inV, out);
-            verifyResultsAbsInt4Uint4(inV, out, true);
+            scriptRelaxed.forEach_testAbsInt4Uint4(inValue, out);
+            verifyResultsAbsInt4Uint4(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAbsInt4Uint4: " + e.toString());
         }
     }
 
-    private void verifyResultsAbsInt4Uint4(Allocation inV, Allocation out, boolean relaxed) {
-        int[] arrayInV = new int[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAbsInt4Uint4(Allocation inValue, Allocation out, boolean relaxed) {
+        int[] arrayInValue = new int[INPUTSIZE * 4];
+        inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntUint args = new ArgumentsIntUint();
-                args.inV = arrayInV[i * 4 + j];
+                args.inValue = arrayInValue[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeAbs(args);
                 // Validate the outputs.
@@ -702,8 +702,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("%d", args.inV));
+                    message.append("Input inValue: ");
+                    message.append(String.format("%d", args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestAbs.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAbs.rs
new file mode 100644
index 0000000..8f1747e
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAbs.rs
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+
+uchar __attribute__((kernel)) testAbsCharUchar(char inValue) {
+    return abs(inValue);
+}
+
+uchar2 __attribute__((kernel)) testAbsChar2Uchar2(char2 inValue) {
+    return abs(inValue);
+}
+
+uchar3 __attribute__((kernel)) testAbsChar3Uchar3(char3 inValue) {
+    return abs(inValue);
+}
+
+uchar4 __attribute__((kernel)) testAbsChar4Uchar4(char4 inValue) {
+    return abs(inValue);
+}
+
+ushort __attribute__((kernel)) testAbsShortUshort(short inValue) {
+    return abs(inValue);
+}
+
+ushort2 __attribute__((kernel)) testAbsShort2Ushort2(short2 inValue) {
+    return abs(inValue);
+}
+
+ushort3 __attribute__((kernel)) testAbsShort3Ushort3(short3 inValue) {
+    return abs(inValue);
+}
+
+ushort4 __attribute__((kernel)) testAbsShort4Ushort4(short4 inValue) {
+    return abs(inValue);
+}
+
+uint __attribute__((kernel)) testAbsIntUint(int inValue) {
+    return abs(inValue);
+}
+
+uint2 __attribute__((kernel)) testAbsInt2Uint2(int2 inValue) {
+    return abs(inValue);
+}
+
+uint3 __attribute__((kernel)) testAbsInt3Uint3(int3 inValue) {
+    return abs(inValue);
+}
+
+uint4 __attribute__((kernel)) testAbsInt4Uint4(int4 inValue) {
+    return abs(inValue);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAbsRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAbsRelaxed.rs
index 6660366..437a467 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAbsRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAbs.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcos.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAcos.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcos.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAcos.java
index 3b6a199..999fd1b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAcos.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAcos extends RSBaseCompute {
+public class TestAcos extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAcos script;
-    private ScriptC_GeneratedTestAcosRelaxed scriptRelaxed;
+    private ScriptC_TestAcos script;
+    private ScriptC_TestAcosRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAcos(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAcosRelaxed(mRS);
+        script = new ScriptC_TestAcos(mRS);
+        scriptRelaxed = new ScriptC_TestAcosRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcos.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAcos.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcos.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAcos.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAcosRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAcosRelaxed.rs
index 6660366..92fd9e8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAcosRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAcos.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcosh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAcosh.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcosh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAcosh.java
index 192d5c0..1412c2e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAcosh.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAcosh extends RSBaseCompute {
+public class TestAcosh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAcosh script;
-    private ScriptC_GeneratedTestAcoshRelaxed scriptRelaxed;
+    private ScriptC_TestAcosh script;
+    private ScriptC_TestAcoshRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAcosh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAcoshRelaxed(mRS);
+        script = new ScriptC_TestAcosh(mRS);
+        scriptRelaxed = new ScriptC_TestAcoshRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkAcoshFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x777ec00cf303663l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb2c74105f8e94ea7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testAcoshFloatFloat(inV, out);
-            verifyResultsAcoshFloatFloat(inV, out, false);
+            script.forEach_testAcoshFloatFloat(in, out);
+            verifyResultsAcoshFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAcoshFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testAcoshFloatFloat(inV, out);
-            verifyResultsAcoshFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testAcoshFloatFloat(in, out);
+            verifyResultsAcoshFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAcoshFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsAcoshFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAcoshFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAcosh(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkAcoshFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf102471f37b311efl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4123c61e7e518f4bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testAcoshFloat2Float2(inV, out);
-            verifyResultsAcoshFloat2Float2(inV, out, false);
+            script.forEach_testAcoshFloat2Float2(in, out);
+            verifyResultsAcoshFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAcoshFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testAcoshFloat2Float2(inV, out);
-            verifyResultsAcoshFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testAcoshFloat2Float2(in, out);
+            verifyResultsAcoshFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAcoshFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsAcoshFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAcoshFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAcosh(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkAcoshFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf104103a2dce32cdl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4123d0bfdd5824e5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testAcoshFloat3Float3(inV, out);
-            verifyResultsAcoshFloat3Float3(inV, out, false);
+            script.forEach_testAcoshFloat3Float3(in, out);
+            verifyResultsAcoshFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAcoshFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testAcoshFloat3Float3(inV, out);
-            verifyResultsAcoshFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testAcoshFloat3Float3(in, out);
+            verifyResultsAcoshFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAcoshFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsAcoshFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAcoshFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAcosh(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkAcoshFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf105d95523e953abl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4123db613c5eba7fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testAcoshFloat4Float4(inV, out);
-            verifyResultsAcoshFloat4Float4(inV, out, false);
+            script.forEach_testAcoshFloat4Float4(in, out);
+            verifyResultsAcoshFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAcoshFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testAcoshFloat4Float4(inV, out);
-            verifyResultsAcoshFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testAcoshFloat4Float4(in, out);
+            verifyResultsAcoshFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAcoshFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsAcoshFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAcoshFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAcosh(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAcosh.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAcosh.rs
index d7e22fa..9be2fa2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAcosh.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testAcoshFloatFloat(float in) {
+    return acosh(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testAcoshFloat2Float2(float2 in) {
+    return acosh(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testAcoshFloat3Float3(float3 in) {
+    return acosh(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testAcoshFloat4Float4(float4 in) {
+    return acosh(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAcoshRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAcoshRelaxed.rs
index 6660366..269cec5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAcoshRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAcosh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcospi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAcospi.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcospi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAcospi.java
index a06cce5..7669fea 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAcospi.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAcospi extends RSBaseCompute {
+public class TestAcospi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAcospi script;
-    private ScriptC_GeneratedTestAcospiRelaxed scriptRelaxed;
+    private ScriptC_TestAcospi script;
+    private ScriptC_TestAcospiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAcospi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAcospiRelaxed(mRS);
+        script = new ScriptC_TestAcospi(mRS);
+        scriptRelaxed = new ScriptC_TestAcospiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcospi.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAcospi.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAcospi.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAcospi.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAcospiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAcospiRelaxed.rs
index 6660366..203fe7e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAcospiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAcospi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsin.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAsin.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsin.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAsin.java
index e69f912..ce728e7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAsin.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAsin extends RSBaseCompute {
+public class TestAsin extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAsin script;
-    private ScriptC_GeneratedTestAsinRelaxed scriptRelaxed;
+    private ScriptC_TestAsin script;
+    private ScriptC_TestAsinRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAsin(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAsinRelaxed(mRS);
+        script = new ScriptC_TestAsin(mRS);
+        scriptRelaxed = new ScriptC_TestAsinRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsin.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAsin.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsin.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAsin.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAsinRelaxed.rs
index 6660366..f972148 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAsin.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinh.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAsinh.java
index def06e3..90c26a0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinh.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAsinh extends RSBaseCompute {
+public class TestAsinh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAsinh script;
-    private ScriptC_GeneratedTestAsinhRelaxed scriptRelaxed;
+    private ScriptC_TestAsinh script;
+    private ScriptC_TestAsinhRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAsinh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAsinhRelaxed(mRS);
+        script = new ScriptC_TestAsinh(mRS);
+        scriptRelaxed = new ScriptC_TestAsinhRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkAsinhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2cdf6bfa7c4a48f4l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3c94145f20a86cdal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testAsinhFloatFloat(inV, out);
-            verifyResultsAsinhFloatFloat(inV, out, false);
+            script.forEach_testAsinhFloatFloat(in, out);
+            verifyResultsAsinhFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAsinhFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testAsinhFloatFloat(inV, out);
-            verifyResultsAsinhFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testAsinhFloatFloat(in, out);
+            verifyResultsAsinhFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAsinhFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsAsinhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAsinhFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAsinh(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkAsinhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x198d997279032b38l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8986450e91b2ada6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testAsinhFloat2Float2(inV, out);
-            verifyResultsAsinhFloat2Float2(inV, out, false);
+            script.forEach_testAsinhFloat2Float2(in, out);
+            verifyResultsAsinhFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAsinhFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testAsinhFloat2Float2(inV, out);
-            verifyResultsAsinhFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testAsinhFloat2Float2(in, out);
+            verifyResultsAsinhFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAsinhFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsAsinhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAsinhFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAsinh(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkAsinhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x198f628d6f1e4c16l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x89864faff0b94340l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testAsinhFloat3Float3(inV, out);
-            verifyResultsAsinhFloat3Float3(inV, out, false);
+            script.forEach_testAsinhFloat3Float3(in, out);
+            verifyResultsAsinhFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAsinhFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testAsinhFloat3Float3(inV, out);
-            verifyResultsAsinhFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testAsinhFloat3Float3(in, out);
+            verifyResultsAsinhFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAsinhFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsAsinhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAsinhFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAsinh(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkAsinhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x19912ba865396cf4l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x89865a514fbfd8dal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testAsinhFloat4Float4(inV, out);
-            verifyResultsAsinhFloat4Float4(inV, out, false);
+            script.forEach_testAsinhFloat4Float4(in, out);
+            verifyResultsAsinhFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAsinhFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testAsinhFloat4Float4(inV, out);
-            verifyResultsAsinhFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testAsinhFloat4Float4(in, out);
+            verifyResultsAsinhFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAsinhFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsAsinhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsAsinhFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAsinh(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinh.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAsinh.rs
index d7e22fa..a72a5f4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinh.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testAsinhFloatFloat(float in) {
+    return asinh(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testAsinhFloat2Float2(float2 in) {
+    return asinh(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testAsinhFloat3Float3(float3 in) {
+    return asinh(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testAsinhFloat4Float4(float4 in) {
+    return asinh(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinhRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAsinhRelaxed.rs
index 6660366..7540ea8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinhRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAsinh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinpi.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinpi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAsinpi.java
index 23dc9b8..50bc387 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinpi.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAsinpi extends RSBaseCompute {
+public class TestAsinpi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAsinpi script;
-    private ScriptC_GeneratedTestAsinpiRelaxed scriptRelaxed;
+    private ScriptC_TestAsinpi script;
+    private ScriptC_TestAsinpiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAsinpi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAsinpiRelaxed(mRS);
+        script = new ScriptC_TestAsinpi(mRS);
+        scriptRelaxed = new ScriptC_TestAsinpiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinpi.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinpi.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAsinpi.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAsinpi.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinpiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAsinpiRelaxed.rs
index 6660366..aad672b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAsinpiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAsinpi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAtan.java
index 4721017..1d7055c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAtan extends RSBaseCompute {
+public class TestAtan extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAtan script;
-    private ScriptC_GeneratedTestAtanRelaxed scriptRelaxed;
+    private ScriptC_TestAtan script;
+    private ScriptC_TestAtanRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAtan(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAtanRelaxed(mRS);
+        script = new ScriptC_TestAtan(mRS);
+        scriptRelaxed = new ScriptC_TestAtanRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAtan.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2.java
similarity index 65%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAtan2.java
index 37843e9..10b862d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAtan2 extends RSBaseCompute {
+public class TestAtan2 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAtan2 script;
-    private ScriptC_GeneratedTestAtan2Relaxed scriptRelaxed;
+    private ScriptC_TestAtan2 script;
+    private ScriptC_TestAtan2Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAtan2(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAtan2Relaxed(mRS);
+        script = new ScriptC_TestAtan2(mRS);
+        scriptRelaxed = new ScriptC_TestAtan2Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inNumerator;
-        public float inDenominator;
+        public float inY;
+        public float inX;
         public Target.Floaty out;
     }
 
     private void checkAtan2FloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x717c0d8e261d332l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x37738e957bd90d5bl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x8f58f1f953c03c32l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x8f58f1f953c03c31l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testAtan2FloatFloatFloat(inNumerator, out);
-            verifyResultsAtan2FloatFloatFloat(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testAtan2FloatFloatFloat(inY, out);
+            verifyResultsAtan2FloatFloatFloat(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2FloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testAtan2FloatFloatFloat(inNumerator, out);
-            verifyResultsAtan2FloatFloatFloat(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testAtan2FloatFloatFloat(inY, out);
+            verifyResultsAtan2FloatFloatFloat(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2FloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsAtan2FloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 1];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 1];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsAtan2FloatFloatFloat(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i];
-                args.inDenominator = arrayInDenominator[i];
+                args.inY = arrayInY[i];
+                args.inX = arrayInX[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAtan2(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkAtan2Float2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8658ecfeefb30700l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x552b6d6bab583839l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbe78dcdcd414b6c0l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbe78dcdcd414b6bfl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testAtan2Float2Float2Float2(inNumerator, out);
-            verifyResultsAtan2Float2Float2Float2(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testAtan2Float2Float2Float2(inY, out);
+            verifyResultsAtan2Float2Float2Float2(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2Float2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testAtan2Float2Float2Float2(inNumerator, out);
-            verifyResultsAtan2Float2Float2Float2(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testAtan2Float2Float2Float2(inY, out);
+            verifyResultsAtan2Float2Float2Float2(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2Float2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsAtan2Float2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 2];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 2];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsAtan2Float2Float2Float2(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 2 + j];
-                args.inDenominator = arrayInDenominator[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAtan2(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkAtan2Float3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x61e79638927ef301l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1e8faeb47e33cb72l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x12ddbafcd5f2b861l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x12ddbafcd5f2b860l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testAtan2Float3Float3Float3(inNumerator, out);
-            verifyResultsAtan2Float3Float3Float3(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testAtan2Float3Float3Float3(inY, out);
+            verifyResultsAtan2Float3Float3Float3(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2Float3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testAtan2Float3Float3Float3(inNumerator, out);
-            verifyResultsAtan2Float3Float3Float3(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testAtan2Float3Float3Float3(inY, out);
+            verifyResultsAtan2Float3Float3Float3(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2Float3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsAtan2Float3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsAtan2Float3Float3Float3(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAtan2(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkAtan2Float4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3d763f72354adf02l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe7f3effd510f5eabl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6742991cd7d0ba02l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6742991cd7d0ba01l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testAtan2Float4Float4Float4(inNumerator, out);
-            verifyResultsAtan2Float4Float4Float4(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testAtan2Float4Float4Float4(inY, out);
+            verifyResultsAtan2Float4Float4Float4(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2Float4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testAtan2Float4Float4Float4(inNumerator, out);
-            verifyResultsAtan2Float4Float4Float4(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testAtan2Float4Float4Float4(inY, out);
+            verifyResultsAtan2Float4Float4Float4(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2Float4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsAtan2Float4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsAtan2Float4Float4Float4(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAtan2(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2.rs
new file mode 100644
index 0000000..877402d
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2.rs
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocInX;
+
+float __attribute__((kernel)) testAtan2FloatFloatFloat(float inY, unsigned int x) {
+    float inX = rsGetElementAt_float(gAllocInX, x);
+    return atan2(inY, inX);
+}
+
+float2 __attribute__((kernel)) testAtan2Float2Float2Float2(float2 inY, unsigned int x) {
+    float2 inX = rsGetElementAt_float2(gAllocInX, x);
+    return atan2(inY, inX);
+}
+
+float3 __attribute__((kernel)) testAtan2Float3Float3Float3(float3 inY, unsigned int x) {
+    float3 inX = rsGetElementAt_float3(gAllocInX, x);
+    return atan2(inY, inX);
+}
+
+float4 __attribute__((kernel)) testAtan2Float4Float4Float4(float4 inY, unsigned int x) {
+    float4 inX = rsGetElementAt_float4(gAllocInX, x);
+    return atan2(inY, inX);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAtan2Relaxed.rs
index 6660366..d5d90a1 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAtan2.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2pi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2pi.java
similarity index 65%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2pi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAtan2pi.java
index 540eede..8837003 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2pi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2pi.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAtan2pi extends RSBaseCompute {
+public class TestAtan2pi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAtan2pi script;
-    private ScriptC_GeneratedTestAtan2piRelaxed scriptRelaxed;
+    private ScriptC_TestAtan2pi script;
+    private ScriptC_TestAtan2piRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAtan2pi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAtan2piRelaxed(mRS);
+        script = new ScriptC_TestAtan2pi(mRS);
+        scriptRelaxed = new ScriptC_TestAtan2piRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inNumerator;
-        public float inDenominator;
+        public float inY;
+        public float inX;
         public Target.Floaty out;
     }
 
     private void checkAtan2piFloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3276ace81dcb793l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc4961da25a748df4l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5a912731bef85233l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5a912731bef85232l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testAtan2piFloatFloatFloat(inNumerator, out);
-            verifyResultsAtan2piFloatFloatFloat(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testAtan2piFloatFloatFloat(inY, out);
+            verifyResultsAtan2piFloatFloatFloat(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2piFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testAtan2piFloatFloatFloat(inNumerator, out);
-            verifyResultsAtan2piFloatFloatFloat(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testAtan2piFloatFloatFloat(inY, out);
+            verifyResultsAtan2piFloatFloatFloat(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2piFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsAtan2piFloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 1];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 1];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsAtan2piFloatFloatFloat(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i];
-                args.inDenominator = arrayInDenominator[i];
+                args.inY = arrayInY[i];
+                args.inX = arrayInX[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAtan2pi(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkAtan2piFloat2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3b26f42853d1a0b3l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x393d275fcc5c5614l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8031be184fee8f53l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8031be184fee8f52l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testAtan2piFloat2Float2Float2(inNumerator, out);
-            verifyResultsAtan2piFloat2Float2Float2(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testAtan2piFloat2Float2Float2(inY, out);
+            verifyResultsAtan2piFloat2Float2Float2(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2piFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testAtan2piFloat2Float2Float2(inNumerator, out);
-            verifyResultsAtan2piFloat2Float2Float2(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testAtan2piFloat2Float2Float2(inY, out);
+            verifyResultsAtan2piFloat2Float2Float2(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2piFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsAtan2piFloat2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 2];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 2];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsAtan2piFloat2Float2Float2(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 2 + j];
-                args.inDenominator = arrayInDenominator[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAtan2pi(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkAtan2piFloat3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x16b59d61f69d8cb4l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2a168a89f37e94dl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd4969c3851cc90f4l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd4969c3851cc90f3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testAtan2piFloat3Float3Float3(inNumerator, out);
-            verifyResultsAtan2piFloat3Float3Float3(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testAtan2piFloat3Float3Float3(inY, out);
+            verifyResultsAtan2piFloat3Float3Float3(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2piFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testAtan2piFloat3Float3Float3(inNumerator, out);
-            verifyResultsAtan2piFloat3Float3Float3(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testAtan2piFloat3Float3Float3(inY, out);
+            verifyResultsAtan2piFloat3Float3Float3(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2piFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsAtan2piFloat3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsAtan2piFloat3Float3Float3(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAtan2pi(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkAtan2piFloat4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf244469b996978b5l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xcc05a9f172137c86l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x28fb7a5853aa9295l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x28fb7a5853aa9294l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testAtan2piFloat4Float4Float4(inNumerator, out);
-            verifyResultsAtan2piFloat4Float4Float4(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testAtan2piFloat4Float4Float4(inY, out);
+            verifyResultsAtan2piFloat4Float4Float4(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2piFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testAtan2piFloat4Float4Float4(inNumerator, out);
-            verifyResultsAtan2piFloat4Float4Float4(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testAtan2piFloat4Float4Float4(inY, out);
+            verifyResultsAtan2piFloat4Float4Float4(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testAtan2piFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsAtan2piFloat4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsAtan2piFloat4Float4Float4(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeAtan2pi(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2pi.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2pi.rs
similarity index 61%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2pi.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAtan2pi.rs
index 25064f9..f0520d7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtan2pi.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2pi.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInDenominator;
+rs_allocation gAllocInX;
 
-float __attribute__((kernel)) testAtan2piFloatFloatFloat(float inNumerator, unsigned int x) {
-    float inDenominator = rsGetElementAt_float(gAllocInDenominator, x);
-    return atan2pi(inNumerator, inDenominator);
+float __attribute__((kernel)) testAtan2piFloatFloatFloat(float inY, unsigned int x) {
+    float inX = rsGetElementAt_float(gAllocInX, x);
+    return atan2pi(inY, inX);
 }
 
-float2 __attribute__((kernel)) testAtan2piFloat2Float2Float2(float2 inNumerator, unsigned int x) {
-    float2 inDenominator = rsGetElementAt_float2(gAllocInDenominator, x);
-    return atan2pi(inNumerator, inDenominator);
+float2 __attribute__((kernel)) testAtan2piFloat2Float2Float2(float2 inY, unsigned int x) {
+    float2 inX = rsGetElementAt_float2(gAllocInX, x);
+    return atan2pi(inY, inX);
 }
 
-float3 __attribute__((kernel)) testAtan2piFloat3Float3Float3(float3 inNumerator, unsigned int x) {
-    float3 inDenominator = rsGetElementAt_float3(gAllocInDenominator, x);
-    return atan2pi(inNumerator, inDenominator);
+float3 __attribute__((kernel)) testAtan2piFloat3Float3Float3(float3 inY, unsigned int x) {
+    float3 inX = rsGetElementAt_float3(gAllocInX, x);
+    return atan2pi(inY, inX);
 }
 
-float4 __attribute__((kernel)) testAtan2piFloat4Float4Float4(float4 inNumerator, unsigned int x) {
-    float4 inDenominator = rsGetElementAt_float4(gAllocInDenominator, x);
-    return atan2pi(inNumerator, inDenominator);
+float4 __attribute__((kernel)) testAtan2piFloat4Float4Float4(float4 inY, unsigned int x) {
+    float4 inX = rsGetElementAt_float4(gAllocInX, x);
+    return atan2pi(inY, inX);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2piRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAtan2piRelaxed.rs
index 6660366..9f87fff 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtan2piRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAtan2pi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAtanRelaxed.rs
index 6660366..cab9300 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAtan.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanh.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAtanh.java
index 266e4fe..a07c171 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanh.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAtanh extends RSBaseCompute {
+public class TestAtanh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAtanh script;
-    private ScriptC_GeneratedTestAtanhRelaxed scriptRelaxed;
+    private ScriptC_TestAtanh script;
+    private ScriptC_TestAtanhRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAtanh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAtanhRelaxed(mRS);
+        script = new ScriptC_TestAtanh(mRS);
+        scriptRelaxed = new ScriptC_TestAtanhRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanh.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanh.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanh.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAtanh.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanhRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAtanhRelaxed.rs
index 6660366..88dfc75 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanhRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAtanh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanpi.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanpi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAtanpi.java
index 97ad786..34c4e32 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanpi.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestAtanpi extends RSBaseCompute {
+public class TestAtanpi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestAtanpi script;
-    private ScriptC_GeneratedTestAtanpiRelaxed scriptRelaxed;
+    private ScriptC_TestAtanpi script;
+    private ScriptC_TestAtanpiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestAtanpi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestAtanpiRelaxed(mRS);
+        script = new ScriptC_TestAtanpi(mRS);
+        scriptRelaxed = new ScriptC_TestAtanpiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanpi.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanpi.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestAtanpi.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestAtanpi.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanpiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestAtanpiRelaxed.rs
index 6660366..6183636 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestAtanpiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestAtanpi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCbrt.java b/tests/tests/renderscript/src/android/renderscript/cts/TestCbrt.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCbrt.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestCbrt.java
index 337582d..c6e6bd3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCbrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCbrt.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestCbrt extends RSBaseCompute {
+public class TestCbrt extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestCbrt script;
-    private ScriptC_GeneratedTestCbrtRelaxed scriptRelaxed;
+    private ScriptC_TestCbrt script;
+    private ScriptC_TestCbrtRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestCbrt(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestCbrtRelaxed(mRS);
+        script = new ScriptC_TestCbrt(mRS);
+        scriptRelaxed = new ScriptC_TestCbrtRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkCbrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x21721d33845561d4l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4e2c540726cc677al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testCbrtFloatFloat(inV, out);
-            verifyResultsCbrtFloatFloat(inV, out, false);
+            script.forEach_testCbrtFloatFloat(in, out);
+            verifyResultsCbrtFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCbrtFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testCbrtFloatFloat(inV, out);
-            verifyResultsCbrtFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testCbrtFloatFloat(in, out);
+            verifyResultsCbrtFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCbrtFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsCbrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCbrtFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCbrt(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkCbrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x910f9e5d9129d518l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x9e2a09a2eb8fdb46l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testCbrtFloat2Float2(inV, out);
-            verifyResultsCbrtFloat2Float2(inV, out, false);
+            script.forEach_testCbrtFloat2Float2(in, out);
+            verifyResultsCbrtFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCbrtFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testCbrtFloat2Float2(inV, out);
-            verifyResultsCbrtFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testCbrtFloat2Float2(in, out);
+            verifyResultsCbrtFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCbrtFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsCbrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCbrtFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCbrt(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkCbrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x911167788744f5f6l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9e2a14444a9670e0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testCbrtFloat3Float3(inV, out);
-            verifyResultsCbrtFloat3Float3(inV, out, false);
+            script.forEach_testCbrtFloat3Float3(in, out);
+            verifyResultsCbrtFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCbrtFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testCbrtFloat3Float3(inV, out);
-            verifyResultsCbrtFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testCbrtFloat3Float3(in, out);
+            verifyResultsCbrtFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCbrtFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsCbrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCbrtFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCbrt(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkCbrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x911330937d6016d4l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x9e2a1ee5a99d067al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testCbrtFloat4Float4(inV, out);
-            verifyResultsCbrtFloat4Float4(inV, out, false);
+            script.forEach_testCbrtFloat4Float4(in, out);
+            verifyResultsCbrtFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCbrtFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testCbrtFloat4Float4(inV, out);
-            verifyResultsCbrtFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testCbrtFloat4Float4(in, out);
+            verifyResultsCbrtFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCbrtFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsCbrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCbrtFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCbrt(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCbrt.rs
similarity index 70%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestCbrt.rs
index d7e22fa..d14f508 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCbrt.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testCbrtFloatFloat(float in) {
+    return cbrt(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testCbrtFloat2Float2(float2 in) {
+    return cbrt(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testCbrtFloat3Float3(float3 in) {
+    return cbrt(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testCbrtFloat4Float4(float4 in) {
+    return cbrt(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCbrtRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestCbrtRelaxed.rs
index 6660366..ad970fe 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCbrtRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestCbrt.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCeil.java b/tests/tests/renderscript/src/android/renderscript/cts/TestCeil.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCeil.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestCeil.java
index f38345f..80121a8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCeil.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCeil.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestCeil extends RSBaseCompute {
+public class TestCeil extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestCeil script;
-    private ScriptC_GeneratedTestCeilRelaxed scriptRelaxed;
+    private ScriptC_TestCeil script;
+    private ScriptC_TestCeilRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestCeil(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestCeilRelaxed(mRS);
+        script = new ScriptC_TestCeil(mRS);
+        scriptRelaxed = new ScriptC_TestCeilRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkCeilFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf12a662b492bf934l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa65a49d160f51d9al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testCeilFloatFloat(inV, out);
-            verifyResultsCeilFloatFloat(inV, out, false);
+            script.forEach_testCeilFloatFloat(in, out);
+            verifyResultsCeilFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCeilFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testCeilFloatFloat(inV, out);
-            verifyResultsCeilFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testCeilFloatFloat(in, out);
+            verifyResultsCeilFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCeilFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsCeilFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCeilFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCeil(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkCeilFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdb16a3ea43152978l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x821e4b40fb9b4866l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testCeilFloat2Float2(inV, out);
-            verifyResultsCeilFloat2Float2(inV, out, false);
+            script.forEach_testCeilFloat2Float2(in, out);
+            verifyResultsCeilFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCeilFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testCeilFloat2Float2(inV, out);
-            verifyResultsCeilFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testCeilFloat2Float2(in, out);
+            verifyResultsCeilFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCeilFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsCeilFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCeilFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCeil(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkCeilFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdb186d0539304a56l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x821e55e25aa1de00l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testCeilFloat3Float3(inV, out);
-            verifyResultsCeilFloat3Float3(inV, out, false);
+            script.forEach_testCeilFloat3Float3(in, out);
+            verifyResultsCeilFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCeilFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testCeilFloat3Float3(inV, out);
-            verifyResultsCeilFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testCeilFloat3Float3(in, out);
+            verifyResultsCeilFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCeilFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsCeilFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCeilFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCeil(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkCeilFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdb1a36202f4b6b34l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x821e6083b9a8739al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testCeilFloat4Float4(inV, out);
-            verifyResultsCeilFloat4Float4(inV, out, false);
+            script.forEach_testCeilFloat4Float4(in, out);
+            verifyResultsCeilFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCeilFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testCeilFloat4Float4(inV, out);
-            verifyResultsCeilFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testCeilFloat4Float4(in, out);
+            verifyResultsCeilFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCeilFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsCeilFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCeilFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCeil(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCeil.rs
similarity index 70%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestCeil.rs
index d7e22fa..80c8708 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCeil.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testCeilFloatFloat(float in) {
+    return ceil(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testCeilFloat2Float2(float2 in) {
+    return ceil(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testCeilFloat3Float3(float3 in) {
+    return ceil(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testCeilFloat4Float4(float4 in) {
+    return ceil(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCeilRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestCeilRelaxed.rs
index 6660366..bbafb0d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCeilRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestCeil.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClamp.java b/tests/tests/renderscript/src/android/renderscript/cts/TestClamp.java
similarity index 99%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClamp.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestClamp.java
index c302a95..44f60d6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClamp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestClamp.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestClamp extends RSBaseCompute {
+public class TestClamp extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestClamp script;
-    private ScriptC_GeneratedTestClampRelaxed scriptRelaxed;
+    private ScriptC_TestClamp script;
+    private ScriptC_TestClampRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestClamp(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestClampRelaxed(mRS);
+        script = new ScriptC_TestClamp(mRS);
+        scriptRelaxed = new ScriptC_TestClampRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClamp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestClamp.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClamp.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestClamp.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestClampRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestClampRelaxed.rs
index 6660366..15fd58c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestClampRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestClamp.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClz.java b/tests/tests/renderscript/src/android/renderscript/cts/TestClz.java
similarity index 99%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClz.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestClz.java
index b10fcb9..51241aa 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClz.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestClz.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestClz extends RSBaseCompute {
+public class TestClz extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestClz script;
-    private ScriptC_GeneratedTestClzRelaxed scriptRelaxed;
+    private ScriptC_TestClz script;
+    private ScriptC_TestClzRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestClz(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestClzRelaxed(mRS);
+        script = new ScriptC_TestClz(mRS);
+        scriptRelaxed = new ScriptC_TestClzRelaxed(mRS);
     }
 
     public class ArgumentsCharChar {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClz.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestClz.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestClz.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestClz.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestClzRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestClzRelaxed.rs
index 6660366..c463c94 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestClzRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestClz.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestConvert.java b/tests/tests/renderscript/src/android/renderscript/cts/TestConvert.java
similarity index 99%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestConvert.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestConvert.java
index aa28239..fc56b26 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestConvert.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestConvert.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestConvert extends RSBaseCompute {
+public class TestConvert extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestConvert script;
-    private ScriptC_GeneratedTestConvertRelaxed scriptRelaxed;
+    private ScriptC_TestConvert script;
+    private ScriptC_TestConvertRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestConvert(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestConvertRelaxed(mRS);
+        script = new ScriptC_TestConvert(mRS);
+        scriptRelaxed = new ScriptC_TestConvertRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestConvert.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestConvert.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestConvert.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestConvert.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestConvertRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestConvertRelaxed.rs
index 6660366..d13c634 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestConvertRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestConvert.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCopysign.java b/tests/tests/renderscript/src/android/renderscript/cts/TestCopysign.java
similarity index 65%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCopysign.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestCopysign.java
index 1391b61..cb8794a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCopysign.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCopysign.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestCopysign extends RSBaseCompute {
+public class TestCopysign extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestCopysign script;
-    private ScriptC_GeneratedTestCopysignRelaxed scriptRelaxed;
+    private ScriptC_TestCopysign script;
+    private ScriptC_TestCopysignRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestCopysign(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestCopysignRelaxed(mRS);
+        script = new ScriptC_TestCopysign(mRS);
+        scriptRelaxed = new ScriptC_TestCopysignRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inMagnitudeValue;
-        public float inSignValue;
+        public float inX;
+        public float inY;
         public Target.Floaty out;
     }
 
     private void checkCopysignFloatFloatFloat() {
-        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4218ae4ccf086614l, false);
-        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd95dacad9d8d3ef5l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xeebba96e8c48145l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xeebba96e8c48146l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInSignValue(inSignValue);
-            script.forEach_testCopysignFloatFloatFloat(inMagnitudeValue, out);
-            verifyResultsCopysignFloatFloatFloat(inMagnitudeValue, inSignValue, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testCopysignFloatFloatFloat(inX, out);
+            verifyResultsCopysignFloatFloatFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInSignValue(inSignValue);
-            scriptRelaxed.forEach_testCopysignFloatFloatFloat(inMagnitudeValue, out);
-            verifyResultsCopysignFloatFloatFloat(inMagnitudeValue, inSignValue, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testCopysignFloatFloatFloat(inX, out);
+            verifyResultsCopysignFloatFloatFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsCopysignFloatFloatFloat(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
-        float[] arrayInMagnitudeValue = new float[INPUTSIZE * 1];
-        inMagnitudeValue.copyTo(arrayInMagnitudeValue);
-        float[] arrayInSignValue = new float[INPUTSIZE * 1];
-        inSignValue.copyTo(arrayInSignValue);
+    private void verifyResultsCopysignFloatFloatFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inMagnitudeValue = arrayInMagnitudeValue[i];
-                args.inSignValue = arrayInSignValue[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCopysign(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inMagnitudeValue: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMagnitudeValue, Float.floatToRawIntBits(args.inMagnitudeValue), args.inMagnitudeValue));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inSignValue: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inSignValue, Float.floatToRawIntBits(args.inSignValue), args.inSignValue));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkCopysignFloat2Float2Float2() {
-        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8efe093722e9f786l, false);
-        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb33b4a8420cec72bl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbeb0e1cc912e993bl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbeb0e1cc912e993cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInSignValue(inSignValue);
-            script.forEach_testCopysignFloat2Float2Float2(inMagnitudeValue, out);
-            verifyResultsCopysignFloat2Float2Float2(inMagnitudeValue, inSignValue, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testCopysignFloat2Float2Float2(inX, out);
+            verifyResultsCopysignFloat2Float2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInSignValue(inSignValue);
-            scriptRelaxed.forEach_testCopysignFloat2Float2Float2(inMagnitudeValue, out);
-            verifyResultsCopysignFloat2Float2Float2(inMagnitudeValue, inSignValue, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testCopysignFloat2Float2Float2(inX, out);
+            verifyResultsCopysignFloat2Float2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsCopysignFloat2Float2Float2(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
-        float[] arrayInMagnitudeValue = new float[INPUTSIZE * 2];
-        inMagnitudeValue.copyTo(arrayInMagnitudeValue);
-        float[] arrayInSignValue = new float[INPUTSIZE * 2];
-        inSignValue.copyTo(arrayInSignValue);
+    private void verifyResultsCopysignFloat2Float2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inMagnitudeValue = arrayInMagnitudeValue[i * 2 + j];
-                args.inSignValue = arrayInSignValue[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCopysign(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inMagnitudeValue: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMagnitudeValue, Float.floatToRawIntBits(args.inMagnitudeValue), args.inMagnitudeValue));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inSignValue: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inSignValue, Float.floatToRawIntBits(args.inSignValue), args.inSignValue));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkCopysignFloat3Float3Float3() {
-        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9a9db55e1b468741l, false);
-        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8ec9f3bdc39ab32cl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1315bfec930c9adcl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1315bfec930c9addl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInSignValue(inSignValue);
-            script.forEach_testCopysignFloat3Float3Float3(inMagnitudeValue, out);
-            verifyResultsCopysignFloat3Float3Float3(inMagnitudeValue, inSignValue, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testCopysignFloat3Float3Float3(inX, out);
+            verifyResultsCopysignFloat3Float3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInSignValue(inSignValue);
-            scriptRelaxed.forEach_testCopysignFloat3Float3Float3(inMagnitudeValue, out);
-            verifyResultsCopysignFloat3Float3Float3(inMagnitudeValue, inSignValue, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testCopysignFloat3Float3Float3(inX, out);
+            verifyResultsCopysignFloat3Float3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsCopysignFloat3Float3Float3(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
-        float[] arrayInMagnitudeValue = new float[INPUTSIZE * 4];
-        inMagnitudeValue.copyTo(arrayInMagnitudeValue);
-        float[] arrayInSignValue = new float[INPUTSIZE * 4];
-        inSignValue.copyTo(arrayInSignValue);
+    private void verifyResultsCopysignFloat3Float3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inMagnitudeValue = arrayInMagnitudeValue[i * 4 + j];
-                args.inSignValue = arrayInSignValue[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCopysign(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inMagnitudeValue: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMagnitudeValue, Float.floatToRawIntBits(args.inMagnitudeValue), args.inMagnitudeValue));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inSignValue: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inSignValue, Float.floatToRawIntBits(args.inSignValue), args.inSignValue));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkCopysignFloat4Float4Float4() {
-        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa63d618513a316fcl, false);
-        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6a589cf766669f2dl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x677a9e0c94ea9c7dl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x677a9e0c94ea9c7el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInSignValue(inSignValue);
-            script.forEach_testCopysignFloat4Float4Float4(inMagnitudeValue, out);
-            verifyResultsCopysignFloat4Float4Float4(inMagnitudeValue, inSignValue, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testCopysignFloat4Float4Float4(inX, out);
+            verifyResultsCopysignFloat4Float4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInSignValue(inSignValue);
-            scriptRelaxed.forEach_testCopysignFloat4Float4Float4(inMagnitudeValue, out);
-            verifyResultsCopysignFloat4Float4Float4(inMagnitudeValue, inSignValue, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testCopysignFloat4Float4Float4(inX, out);
+            verifyResultsCopysignFloat4Float4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsCopysignFloat4Float4Float4(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
-        float[] arrayInMagnitudeValue = new float[INPUTSIZE * 4];
-        inMagnitudeValue.copyTo(arrayInMagnitudeValue);
-        float[] arrayInSignValue = new float[INPUTSIZE * 4];
-        inSignValue.copyTo(arrayInSignValue);
+    private void verifyResultsCopysignFloat4Float4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inMagnitudeValue = arrayInMagnitudeValue[i * 4 + j];
-                args.inSignValue = arrayInSignValue[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCopysign(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inMagnitudeValue: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMagnitudeValue, Float.floatToRawIntBits(args.inMagnitudeValue), args.inMagnitudeValue));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inSignValue: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inSignValue, Float.floatToRawIntBits(args.inSignValue), args.inSignValue));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCopysign.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCopysign.rs
similarity index 60%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCopysign.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestCopysign.rs
index ccbf2b7..d7bc4d0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCopysign.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCopysign.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInSignValue;
+rs_allocation gAllocInY;
 
-float __attribute__((kernel)) testCopysignFloatFloatFloat(float inMagnitudeValue, unsigned int x) {
-    float inSignValue = rsGetElementAt_float(gAllocInSignValue, x);
-    return copysign(inMagnitudeValue, inSignValue);
+float __attribute__((kernel)) testCopysignFloatFloatFloat(float inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return copysign(inX, inY);
 }
 
-float2 __attribute__((kernel)) testCopysignFloat2Float2Float2(float2 inMagnitudeValue, unsigned int x) {
-    float2 inSignValue = rsGetElementAt_float2(gAllocInSignValue, x);
-    return copysign(inMagnitudeValue, inSignValue);
+float2 __attribute__((kernel)) testCopysignFloat2Float2Float2(float2 inX, unsigned int x) {
+    float2 inY = rsGetElementAt_float2(gAllocInY, x);
+    return copysign(inX, inY);
 }
 
-float3 __attribute__((kernel)) testCopysignFloat3Float3Float3(float3 inMagnitudeValue, unsigned int x) {
-    float3 inSignValue = rsGetElementAt_float3(gAllocInSignValue, x);
-    return copysign(inMagnitudeValue, inSignValue);
+float3 __attribute__((kernel)) testCopysignFloat3Float3Float3(float3 inX, unsigned int x) {
+    float3 inY = rsGetElementAt_float3(gAllocInY, x);
+    return copysign(inX, inY);
 }
 
-float4 __attribute__((kernel)) testCopysignFloat4Float4Float4(float4 inMagnitudeValue, unsigned int x) {
-    float4 inSignValue = rsGetElementAt_float4(gAllocInSignValue, x);
-    return copysign(inMagnitudeValue, inSignValue);
+float4 __attribute__((kernel)) testCopysignFloat4Float4Float4(float4 inX, unsigned int x) {
+    float4 inY = rsGetElementAt_float4(gAllocInY, x);
+    return copysign(inX, inY);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCopysignRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestCopysignRelaxed.rs
index 6660366..01002d7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCopysignRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestCopysign.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCos.java b/tests/tests/renderscript/src/android/renderscript/cts/TestCos.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCos.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestCos.java
index ef2d39f..c3aaf28 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCos.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestCos extends RSBaseCompute {
+public class TestCos extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestCos script;
-    private ScriptC_GeneratedTestCosRelaxed scriptRelaxed;
+    private ScriptC_TestCos script;
+    private ScriptC_TestCosRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestCos(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestCosRelaxed(mRS);
+        script = new ScriptC_TestCos(mRS);
+        scriptRelaxed = new ScriptC_TestCosRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkCosFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe70ae86bb80fef6l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x35eace7a33fd0be0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testCosFloatFloat(inV, out);
-            verifyResultsCosFloatFloat(inV, out, false);
+            script.forEach_testCosFloatFloat(in, out);
+            verifyResultsCosFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCosFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testCosFloatFloat(inV, out);
-            verifyResultsCosFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testCosFloatFloat(in, out);
+            verifyResultsCosFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCosFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsCosFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCosFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCos(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkCosFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4bb740670b2bbfaal, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6cec729d2fe33ffcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testCosFloat2Float2(inV, out);
-            verifyResultsCosFloat2Float2(inV, out, false);
+            script.forEach_testCosFloat2Float2(in, out);
+            verifyResultsCosFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCosFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testCosFloat2Float2(inV, out);
-            verifyResultsCosFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testCosFloat2Float2(in, out);
+            verifyResultsCosFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCosFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsCosFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCosFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCos(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkCosFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4bb909820146e088l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6cec7d3e8ee9d596l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testCosFloat3Float3(inV, out);
-            verifyResultsCosFloat3Float3(inV, out, false);
+            script.forEach_testCosFloat3Float3(in, out);
+            verifyResultsCosFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCosFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testCosFloat3Float3(inV, out);
-            verifyResultsCosFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testCosFloat3Float3(in, out);
+            verifyResultsCosFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCosFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsCosFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCosFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCos(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkCosFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4bbad29cf7620166l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6cec87dfedf06b30l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testCosFloat4Float4(inV, out);
-            verifyResultsCosFloat4Float4(inV, out, false);
+            script.forEach_testCosFloat4Float4(in, out);
+            verifyResultsCosFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCosFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testCosFloat4Float4(inV, out);
-            verifyResultsCosFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testCosFloat4Float4(in, out);
+            verifyResultsCosFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCosFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsCosFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCosFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCos(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCos.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestCos.rs
index d7e22fa..5605139 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCos.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testCosFloatFloat(float in) {
+    return cos(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testCosFloat2Float2(float2 in) {
+    return cos(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testCosFloat3Float3(float3 in) {
+    return cos(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testCosFloat4Float4(float4 in) {
+    return cos(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCosRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestCosRelaxed.rs
index 6660366..1871a69 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCosRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestCos.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCosh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestCosh.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCosh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestCosh.java
index f1c3a83..c1f6bf3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCosh.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestCosh extends RSBaseCompute {
+public class TestCosh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestCosh script;
-    private ScriptC_GeneratedTestCoshRelaxed scriptRelaxed;
+    private ScriptC_TestCosh script;
+    private ScriptC_TestCoshRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestCosh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestCoshRelaxed(mRS);
+        script = new ScriptC_TestCosh(mRS);
+        scriptRelaxed = new ScriptC_TestCoshRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkCoshFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfb54622d108cfb40l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xca4f5b95e29e11bel, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testCoshFloatFloat(inV, out);
-            verifyResultsCoshFloatFloat(inV, out, false);
+            script.forEach_testCoshFloatFloat(in, out);
+            verifyResultsCoshFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCoshFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testCoshFloatFloat(inV, out);
-            verifyResultsCoshFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testCoshFloatFloat(in, out);
+            verifyResultsCoshFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCoshFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsCoshFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCoshFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCosh(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkCoshFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4453ccc34ebcf224l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x372b9f8d78e6a06al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testCoshFloat2Float2(inV, out);
-            verifyResultsCoshFloat2Float2(inV, out, false);
+            script.forEach_testCoshFloat2Float2(in, out);
+            verifyResultsCoshFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCoshFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testCoshFloat2Float2(inV, out);
-            verifyResultsCoshFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testCoshFloat2Float2(in, out);
+            verifyResultsCoshFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCoshFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsCoshFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCoshFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCosh(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkCoshFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x445595de44d81302l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x372baa2ed7ed3604l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testCoshFloat3Float3(inV, out);
-            verifyResultsCoshFloat3Float3(inV, out, false);
+            script.forEach_testCoshFloat3Float3(in, out);
+            verifyResultsCoshFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCoshFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testCoshFloat3Float3(inV, out);
-            verifyResultsCoshFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testCoshFloat3Float3(in, out);
+            verifyResultsCoshFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCoshFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsCoshFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCoshFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCosh(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkCoshFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x44575ef93af333e0l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x372bb4d036f3cb9el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testCoshFloat4Float4(inV, out);
-            verifyResultsCoshFloat4Float4(inV, out, false);
+            script.forEach_testCoshFloat4Float4(in, out);
+            verifyResultsCoshFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCoshFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testCoshFloat4Float4(inV, out);
-            verifyResultsCoshFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testCoshFloat4Float4(in, out);
+            verifyResultsCoshFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCoshFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsCoshFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCoshFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCosh(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCosh.rs
similarity index 70%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestCosh.rs
index d7e22fa..b2d89b9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCosh.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testCoshFloatFloat(float in) {
+    return cosh(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testCoshFloat2Float2(float2 in) {
+    return cosh(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testCoshFloat3Float3(float3 in) {
+    return cosh(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testCoshFloat4Float4(float4 in) {
+    return cosh(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCoshRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestCoshRelaxed.rs
index 6660366..cf28629 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCoshRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestCosh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCospi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestCospi.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCospi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestCospi.java
index 66ad337..2d18af9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCospi.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestCospi extends RSBaseCompute {
+public class TestCospi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestCospi script;
-    private ScriptC_GeneratedTestCospiRelaxed scriptRelaxed;
+    private ScriptC_TestCospi script;
+    private ScriptC_TestCospiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestCospi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestCospiRelaxed(mRS);
+        script = new ScriptC_TestCospi(mRS);
+        scriptRelaxed = new ScriptC_TestCospiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkCospiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x95c59d24cc7595d1l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf63d9fae6fcc7f1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testCospiFloatFloat(inV, out);
-            verifyResultsCospiFloatFloat(inV, out, false);
+            script.forEach_testCospiFloatFloat(in, out);
+            verifyResultsCospiFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCospiFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testCospiFloatFloat(inV, out);
-            verifyResultsCospiFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testCospiFloatFloat(in, out);
+            verifyResultsCospiFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCospiFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsCospiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCospiFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCospi(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkCospiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc026b40f81c1536dl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2830872a08f896c5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testCospiFloat2Float2(inV, out);
-            verifyResultsCospiFloat2Float2(inV, out, false);
+            script.forEach_testCospiFloat2Float2(in, out);
+            verifyResultsCospiFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCospiFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testCospiFloat2Float2(inV, out);
-            verifyResultsCospiFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testCospiFloat2Float2(in, out);
+            verifyResultsCospiFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCospiFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsCospiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCospiFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCospi(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkCospiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc0287d2a77dc744bl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x283091cb67ff2c5fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testCospiFloat3Float3(inV, out);
-            verifyResultsCospiFloat3Float3(inV, out, false);
+            script.forEach_testCospiFloat3Float3(in, out);
+            verifyResultsCospiFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCospiFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testCospiFloat3Float3(inV, out);
-            verifyResultsCospiFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testCospiFloat3Float3(in, out);
+            verifyResultsCospiFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCospiFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsCospiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCospiFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCospi(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkCospiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc02a46456df79529l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x28309c6cc705c1f9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testCospiFloat4Float4(inV, out);
-            verifyResultsCospiFloat4Float4(inV, out, false);
+            script.forEach_testCospiFloat4Float4(in, out);
+            verifyResultsCospiFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCospiFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testCospiFloat4Float4(inV, out);
-            verifyResultsCospiFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testCospiFloat4Float4(in, out);
+            verifyResultsCospiFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCospiFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsCospiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsCospiFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeCospi(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCospi.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestCospi.rs
index d7e22fa..a0cc778 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCospi.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testCospiFloatFloat(float in) {
+    return cospi(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testCospiFloat2Float2(float2 in) {
+    return cospi(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testCospiFloat3Float3(float3 in) {
+    return cospi(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testCospiFloat4Float4(float4 in) {
+    return cospi(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCospiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestCospiRelaxed.rs
index 6660366..aac7b90 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCospiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestCospi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCross.java b/tests/tests/renderscript/src/android/renderscript/cts/TestCross.java
similarity index 66%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCross.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestCross.java
index 748bdd8..c5dc979 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCross.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCross.java
@@ -22,64 +22,64 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestCross extends RSBaseCompute {
+public class TestCross extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestCross script;
-    private ScriptC_GeneratedTestCrossRelaxed scriptRelaxed;
+    private ScriptC_TestCross script;
+    private ScriptC_TestCrossRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestCross(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestCrossRelaxed(mRS);
+        script = new ScriptC_TestCross(mRS);
+        scriptRelaxed = new ScriptC_TestCrossRelaxed(mRS);
     }
 
     public class ArgumentsFloatNFloatNFloatN {
-        public float[] inLeftVector;
-        public float[] inRightVector;
+        public float[] inLhs;
+        public float[] inRhs;
         public Target.Floaty[] out;
     }
 
     private void checkCrossFloat3Float3Float3() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3505ebf7382f1ad4l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe9d27bf3de024b21l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdec3726a2995edb5l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdec3726a2996190bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testCrossFloat3Float3Float3(inLeftVector, out);
-            verifyResultsCrossFloat3Float3Float3(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testCrossFloat3Float3Float3(inLhs, out);
+            verifyResultsCrossFloat3Float3Float3(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCrossFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testCrossFloat3Float3Float3(inLeftVector, out);
-            verifyResultsCrossFloat3Float3Float3(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testCrossFloat3Float3Float3(inLhs, out);
+            verifyResultsCrossFloat3Float3Float3(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCrossFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsCrossFloat3Float3Float3(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsCrossFloat3Float3Float3(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloatN args = new ArgumentsFloatNFloatNFloatN();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[3];
-            args.inRightVector = new float[3];
+            args.inLhs = new float[3];
+            args.inRhs = new float[3];
             args.out = new Target.Floaty[3];
             // Fill args with the input values
             for (int j = 0; j < 3 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
+                args.inLhs[j] = arrayInLhs[i * 4 + j];
             }
             for (int j = 0; j < 3 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 4 + j];
+                args.inRhs[j] = arrayInRhs[i * 4 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeCross(args, target);
@@ -94,15 +94,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 4 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 4 + j]), arrayInLeftVector[i * 4 + j]));
+                            arrayInLhs[i * 4 + j], Float.floatToRawIntBits(arrayInLhs[i * 4 + j]), arrayInLhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 4 + j], Float.floatToRawIntBits(arrayInRightVector[i * 4 + j]), arrayInRightVector[i * 4 + j]));
+                            arrayInRhs[i * 4 + j], Float.floatToRawIntBits(arrayInRhs[i * 4 + j]), arrayInRhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 3 ; j++) {
@@ -124,45 +124,45 @@
     }
 
     private void checkCrossFloat4Float4Float4() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x15fc58a5906fbeffl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb336bd3cb0ddde5al, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6b4bc797a60fb18el, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6b4bc797a60fdce4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testCrossFloat4Float4Float4(inLeftVector, out);
-            verifyResultsCrossFloat4Float4Float4(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testCrossFloat4Float4Float4(inLhs, out);
+            verifyResultsCrossFloat4Float4Float4(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCrossFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testCrossFloat4Float4Float4(inLeftVector, out);
-            verifyResultsCrossFloat4Float4Float4(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testCrossFloat4Float4Float4(inLhs, out);
+            verifyResultsCrossFloat4Float4Float4(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCrossFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsCrossFloat4Float4Float4(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsCrossFloat4Float4Float4(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloatN args = new ArgumentsFloatNFloatNFloatN();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[4];
-            args.inRightVector = new float[4];
+            args.inLhs = new float[4];
+            args.inRhs = new float[4];
             args.out = new Target.Floaty[4];
             // Fill args with the input values
             for (int j = 0; j < 4 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
+                args.inLhs[j] = arrayInLhs[i * 4 + j];
             }
             for (int j = 0; j < 4 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 4 + j];
+                args.inRhs[j] = arrayInRhs[i * 4 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeCross(args, target);
@@ -177,15 +177,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 4 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 4 + j]), arrayInLeftVector[i * 4 + j]));
+                            arrayInLhs[i * 4 + j], Float.floatToRawIntBits(arrayInLhs[i * 4 + j]), arrayInLhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 4 + j], Float.floatToRawIntBits(arrayInRightVector[i * 4 + j]), arrayInRightVector[i * 4 + j]));
+                            arrayInRhs[i * 4 + j], Float.floatToRawIntBits(arrayInRhs[i * 4 + j]), arrayInRhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 4 ; j++) {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCross.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCross.rs
similarity index 72%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCross.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestCross.rs
index 7858054..16d5d35 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestCross.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCross.rs
@@ -19,14 +19,14 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInRightVector;
+rs_allocation gAllocInRhs;
 
-float3 __attribute__((kernel)) testCrossFloat3Float3Float3(float3 inLeftVector, unsigned int x) {
-    float3 inRightVector = rsGetElementAt_float3(gAllocInRightVector, x);
-    return cross(inLeftVector, inRightVector);
+float3 __attribute__((kernel)) testCrossFloat3Float3Float3(float3 inLhs, unsigned int x) {
+    float3 inRhs = rsGetElementAt_float3(gAllocInRhs, x);
+    return cross(inLhs, inRhs);
 }
 
-float4 __attribute__((kernel)) testCrossFloat4Float4Float4(float4 inLeftVector, unsigned int x) {
-    float4 inRightVector = rsGetElementAt_float4(gAllocInRightVector, x);
-    return cross(inLeftVector, inRightVector);
+float4 __attribute__((kernel)) testCrossFloat4Float4Float4(float4 inLhs, unsigned int x) {
+    float4 inRhs = rsGetElementAt_float4(gAllocInRhs, x);
+    return cross(inLhs, inRhs);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCrossRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestCrossRelaxed.rs
index 6660366..59fa62d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCrossRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestCross.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDegrees.java b/tests/tests/renderscript/src/android/renderscript/cts/TestDegrees.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDegrees.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestDegrees.java
index 5c0b2fa..b956dbd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDegrees.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestDegrees.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestDegrees extends RSBaseCompute {
+public class TestDegrees extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestDegrees script;
-    private ScriptC_GeneratedTestDegreesRelaxed scriptRelaxed;
+    private ScriptC_TestDegrees script;
+    private ScriptC_TestDegreesRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestDegrees(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestDegreesRelaxed(mRS);
+        script = new ScriptC_TestDegrees(mRS);
+        scriptRelaxed = new ScriptC_TestDegreesRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float inValue;
         public Target.Floaty out;
     }
 
     private void checkDegreesFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x606ed077c5dde30al, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3325fa58542a6bb5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testDegreesFloatFloat(inV, out);
-            verifyResultsDegreesFloatFloat(inV, out, false);
+            script.forEach_testDegreesFloatFloat(inValue, out);
+            verifyResultsDegreesFloatFloat(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDegreesFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testDegreesFloatFloat(inV, out);
-            verifyResultsDegreesFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testDegreesFloatFloat(inValue, out);
+            verifyResultsDegreesFloatFloat(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDegreesFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsDegreesFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsDegreesFloatFloat(Allocation inValue, Allocation out, boolean relaxed) {
+        float[] arrayInValue = new float[INPUTSIZE * 1];
+        inValue.copyTo(arrayInValue);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.inValue = arrayInValue[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeDegrees(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inValue: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inValue, Float.floatToRawIntBits(args.inValue), args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkDegreesFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x803a665ae417141el, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7a202f393d2a289l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testDegreesFloat2Float2(inV, out);
-            verifyResultsDegreesFloat2Float2(inV, out, false);
+            script.forEach_testDegreesFloat2Float2(inValue, out);
+            verifyResultsDegreesFloat2Float2(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDegreesFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testDegreesFloat2Float2(inV, out);
-            verifyResultsDegreesFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testDegreesFloat2Float2(inValue, out);
+            verifyResultsDegreesFloat2Float2(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDegreesFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsDegreesFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsDegreesFloat2Float2(Allocation inValue, Allocation out, boolean relaxed) {
+        float[] arrayInValue = new float[INPUTSIZE * 2];
+        inValue.copyTo(arrayInValue);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.inValue = arrayInValue[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeDegrees(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inValue: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inValue, Float.floatToRawIntBits(args.inValue), args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkDegreesFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x803c2f75da3234fcl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2d56787add10c807l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testDegreesFloat3Float3(inV, out);
-            verifyResultsDegreesFloat3Float3(inV, out, false);
+            script.forEach_testDegreesFloat3Float3(inValue, out);
+            verifyResultsDegreesFloat3Float3(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDegreesFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testDegreesFloat3Float3(inV, out);
-            verifyResultsDegreesFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testDegreesFloat3Float3(inValue, out);
+            verifyResultsDegreesFloat3Float3(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDegreesFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsDegreesFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsDegreesFloat3Float3(Allocation inValue, Allocation out, boolean relaxed) {
+        float[] arrayInValue = new float[INPUTSIZE * 4];
+        inValue.copyTo(arrayInValue);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.inValue = arrayInValue[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeDegrees(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inValue: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inValue, Float.floatToRawIntBits(args.inValue), args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkDegreesFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x803df890d04d55dal, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x530aee02264eed85l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testDegreesFloat4Float4(inV, out);
-            verifyResultsDegreesFloat4Float4(inV, out, false);
+            script.forEach_testDegreesFloat4Float4(inValue, out);
+            verifyResultsDegreesFloat4Float4(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDegreesFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testDegreesFloat4Float4(inV, out);
-            verifyResultsDegreesFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testDegreesFloat4Float4(inValue, out);
+            verifyResultsDegreesFloat4Float4(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDegreesFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsDegreesFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsDegreesFloat4Float4(Allocation inValue, Allocation out, boolean relaxed) {
+        float[] arrayInValue = new float[INPUTSIZE * 4];
+        inValue.copyTo(arrayInValue);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.inValue = arrayInValue[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeDegrees(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inValue: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inValue, Float.floatToRawIntBits(args.inValue), args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDegrees.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestDegrees.rs
similarity index 82%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDegrees.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestDegrees.rs
index bfbb9f4..78741a8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDegrees.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestDegrees.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testDegreesFloatFloat(float inV) {
-    return degrees(inV);
+float __attribute__((kernel)) testDegreesFloatFloat(float inValue) {
+    return degrees(inValue);
 }
 
-float2 __attribute__((kernel)) testDegreesFloat2Float2(float2 inV) {
-    return degrees(inV);
+float2 __attribute__((kernel)) testDegreesFloat2Float2(float2 inValue) {
+    return degrees(inValue);
 }
 
-float3 __attribute__((kernel)) testDegreesFloat3Float3(float3 inV) {
-    return degrees(inV);
+float3 __attribute__((kernel)) testDegreesFloat3Float3(float3 inValue) {
+    return degrees(inValue);
 }
 
-float4 __attribute__((kernel)) testDegreesFloat4Float4(float4 inV) {
-    return degrees(inV);
+float4 __attribute__((kernel)) testDegreesFloat4Float4(float4 inValue) {
+    return degrees(inValue);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestDegreesRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestDegreesRelaxed.rs
index 6660366..7a443bf 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestDegreesRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestDegrees.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDistance.java b/tests/tests/renderscript/src/android/renderscript/cts/TestDistance.java
similarity index 64%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDistance.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestDistance.java
index ee69fc7..091c12c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDistance.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestDistance.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestDistance extends RSBaseCompute {
+public class TestDistance extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestDistance script;
-    private ScriptC_GeneratedTestDistanceRelaxed scriptRelaxed;
+    private ScriptC_TestDistance script;
+    private ScriptC_TestDistanceRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestDistance(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestDistanceRelaxed(mRS);
+        script = new ScriptC_TestDistance(mRS);
+        scriptRelaxed = new ScriptC_TestDistanceRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inLeftVector;
-        public float inRightVector;
+        public float inLhs;
+        public float inRhs;
         public Target.Floaty out;
     }
 
     private void checkDistanceFloatFloatFloat() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa481527082ced52al, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa38cb25366d69793l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf62f685ebafc5b67l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf62f685ebafc86bdl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testDistanceFloatFloatFloat(inLeftVector, out);
-            verifyResultsDistanceFloatFloatFloat(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testDistanceFloatFloatFloat(inLhs, out);
+            verifyResultsDistanceFloatFloatFloat(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDistanceFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testDistanceFloatFloatFloat(inLeftVector, out);
-            verifyResultsDistanceFloatFloatFloat(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testDistanceFloatFloatFloat(inLhs, out);
+            verifyResultsDistanceFloatFloatFloat(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDistanceFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsDistanceFloatFloatFloat(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 1];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 1];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsDistanceFloatFloatFloat(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 1];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 1];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
             // Create the appropriate sized arrays in args
             // Fill args with the input values
-            args.inLeftVector = arrayInLeftVector[i];
-            args.inRightVector = arrayInRightVector[i];
+            args.inLhs = arrayInLhs[i];
+            args.inRhs = arrayInRhs[i];
             Target target = new Target(relaxed);
             CoreMathVerifier.computeDistance(args, target);
 
@@ -84,13 +84,13 @@
             }
             if (!valid) {
                 StringBuilder message = new StringBuilder();
-                message.append("Input inLeftVector: ");
+                message.append("Input inLhs: ");
                 message.append(String.format("%14.8g {%8x} %15a",
-                        arrayInLeftVector[i], Float.floatToRawIntBits(arrayInLeftVector[i]), arrayInLeftVector[i]));
+                        arrayInLhs[i], Float.floatToRawIntBits(arrayInLhs[i]), arrayInLhs[i]));
                 message.append("\n");
-                message.append("Input inRightVector: ");
+                message.append("Input inRhs: ");
                 message.append(String.format("%14.8g {%8x} %15a",
-                        arrayInRightVector[i], Float.floatToRawIntBits(arrayInRightVector[i]), arrayInRightVector[i]));
+                        arrayInRhs[i], Float.floatToRawIntBits(arrayInRhs[i]), arrayInRhs[i]));
                 message.append("\n");
                 message.append("Expected output out: ");
                 message.append(args.out.toString());
@@ -109,50 +109,50 @@
     }
 
     public class ArgumentsFloatNFloatNFloat {
-        public float[] inLeftVector;
-        public float[] inRightVector;
+        public float[] inLhs;
+        public float[] inRhs;
         public Target.Floaty out;
     }
 
     private void checkDistanceFloat2Float2Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbf71d23b554dab2el, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x29f22964c2248a3fl, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3fdeb51f89981593l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3fdeb51f899840e9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testDistanceFloat2Float2Float(inLeftVector, out);
-            verifyResultsDistanceFloat2Float2Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testDistanceFloat2Float2Float(inLhs, out);
+            verifyResultsDistanceFloat2Float2Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDistanceFloat2Float2Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testDistanceFloat2Float2Float(inLeftVector, out);
-            verifyResultsDistanceFloat2Float2Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testDistanceFloat2Float2Float(inLhs, out);
+            verifyResultsDistanceFloat2Float2Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDistanceFloat2Float2Float: " + e.toString());
         }
     }
 
-    private void verifyResultsDistanceFloat2Float2Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 2];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 2];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsDistanceFloat2Float2Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 2];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 2];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[2];
-            args.inRightVector = new float[2];
+            args.inLhs = new float[2];
+            args.inRhs = new float[2];
             // Fill args with the input values
             for (int j = 0; j < 2 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 2 + j];
+                args.inLhs[j] = arrayInLhs[i * 2 + j];
             }
             for (int j = 0; j < 2 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 2 + j];
+                args.inRhs[j] = arrayInRhs[i * 2 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeDistance(args, target);
@@ -165,15 +165,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 2 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 2 + j]), arrayInLeftVector[i * 2 + j]));
+                            arrayInLhs[i * 2 + j], Float.floatToRawIntBits(arrayInLhs[i * 2 + j]), arrayInLhs[i * 2 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 2 + j], Float.floatToRawIntBits(arrayInRightVector[i * 2 + j]), arrayInRightVector[i * 2 + j]));
+                            arrayInRhs[i * 2 + j], Float.floatToRawIntBits(arrayInRhs[i * 2 + j]), arrayInRhs[i * 2 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
@@ -193,44 +193,44 @@
     }
 
     private void checkDistanceFloat3Float3Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8e1af7b976ec5f7cl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe05b759467ccd359l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6cd0047fd9ae30edl, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6cd0047fd9ae5c43l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testDistanceFloat3Float3Float(inLeftVector, out);
-            verifyResultsDistanceFloat3Float3Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testDistanceFloat3Float3Float(inLhs, out);
+            verifyResultsDistanceFloat3Float3Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDistanceFloat3Float3Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testDistanceFloat3Float3Float(inLeftVector, out);
-            verifyResultsDistanceFloat3Float3Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testDistanceFloat3Float3Float(inLhs, out);
+            verifyResultsDistanceFloat3Float3Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDistanceFloat3Float3Float: " + e.toString());
         }
     }
 
-    private void verifyResultsDistanceFloat3Float3Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsDistanceFloat3Float3Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[3];
-            args.inRightVector = new float[3];
+            args.inLhs = new float[3];
+            args.inRhs = new float[3];
             // Fill args with the input values
             for (int j = 0; j < 3 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
+                args.inLhs[j] = arrayInLhs[i * 4 + j];
             }
             for (int j = 0; j < 3 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 4 + j];
+                args.inRhs[j] = arrayInRhs[i * 4 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeDistance(args, target);
@@ -243,15 +243,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 4 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 4 + j]), arrayInLeftVector[i * 4 + j]));
+                            arrayInLhs[i * 4 + j], Float.floatToRawIntBits(arrayInLhs[i * 4 + j]), arrayInLhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 4 + j], Float.floatToRawIntBits(arrayInRightVector[i * 4 + j]), arrayInRightVector[i * 4 + j]));
+                            arrayInRhs[i * 4 + j], Float.floatToRawIntBits(arrayInRhs[i * 4 + j]), arrayInRhs[i * 4 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
@@ -271,44 +271,44 @@
     }
 
     private void checkDistanceFloat4Float4Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x5cc41d37988b13cal, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x96c4c1c40d751c73l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x99c153e029c44c47l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x99c153e029c4779dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testDistanceFloat4Float4Float(inLeftVector, out);
-            verifyResultsDistanceFloat4Float4Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testDistanceFloat4Float4Float(inLhs, out);
+            verifyResultsDistanceFloat4Float4Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDistanceFloat4Float4Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testDistanceFloat4Float4Float(inLeftVector, out);
-            verifyResultsDistanceFloat4Float4Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testDistanceFloat4Float4Float(inLhs, out);
+            verifyResultsDistanceFloat4Float4Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDistanceFloat4Float4Float: " + e.toString());
         }
     }
 
-    private void verifyResultsDistanceFloat4Float4Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsDistanceFloat4Float4Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[4];
-            args.inRightVector = new float[4];
+            args.inLhs = new float[4];
+            args.inRhs = new float[4];
             // Fill args with the input values
             for (int j = 0; j < 4 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
+                args.inLhs[j] = arrayInLhs[i * 4 + j];
             }
             for (int j = 0; j < 4 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 4 + j];
+                args.inRhs[j] = arrayInRhs[i * 4 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeDistance(args, target);
@@ -321,15 +321,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 4 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 4 + j]), arrayInLeftVector[i * 4 + j]));
+                            arrayInLhs[i * 4 + j], Float.floatToRawIntBits(arrayInLhs[i * 4 + j]), arrayInLhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 4 + j], Float.floatToRawIntBits(arrayInRightVector[i * 4 + j]), arrayInRightVector[i * 4 + j]));
+                            arrayInRhs[i * 4 + j], Float.floatToRawIntBits(arrayInRhs[i * 4 + j]), arrayInRhs[i * 4 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDistance.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestDistance.rs
similarity index 61%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDistance.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestDistance.rs
index cbea040..fdc1783 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDistance.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestDistance.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInRightVector;
+rs_allocation gAllocInRhs;
 
-float __attribute__((kernel)) testDistanceFloatFloatFloat(float inLeftVector, unsigned int x) {
-    float inRightVector = rsGetElementAt_float(gAllocInRightVector, x);
-    return distance(inLeftVector, inRightVector);
+float __attribute__((kernel)) testDistanceFloatFloatFloat(float inLhs, unsigned int x) {
+    float inRhs = rsGetElementAt_float(gAllocInRhs, x);
+    return distance(inLhs, inRhs);
 }
 
-float __attribute__((kernel)) testDistanceFloat2Float2Float(float2 inLeftVector, unsigned int x) {
-    float2 inRightVector = rsGetElementAt_float2(gAllocInRightVector, x);
-    return distance(inLeftVector, inRightVector);
+float __attribute__((kernel)) testDistanceFloat2Float2Float(float2 inLhs, unsigned int x) {
+    float2 inRhs = rsGetElementAt_float2(gAllocInRhs, x);
+    return distance(inLhs, inRhs);
 }
 
-float __attribute__((kernel)) testDistanceFloat3Float3Float(float3 inLeftVector, unsigned int x) {
-    float3 inRightVector = rsGetElementAt_float3(gAllocInRightVector, x);
-    return distance(inLeftVector, inRightVector);
+float __attribute__((kernel)) testDistanceFloat3Float3Float(float3 inLhs, unsigned int x) {
+    float3 inRhs = rsGetElementAt_float3(gAllocInRhs, x);
+    return distance(inLhs, inRhs);
 }
 
-float __attribute__((kernel)) testDistanceFloat4Float4Float(float4 inLeftVector, unsigned int x) {
-    float4 inRightVector = rsGetElementAt_float4(gAllocInRightVector, x);
-    return distance(inLeftVector, inRightVector);
+float __attribute__((kernel)) testDistanceFloat4Float4Float(float4 inLhs, unsigned int x) {
+    float4 inRhs = rsGetElementAt_float4(gAllocInRhs, x);
+    return distance(inLhs, inRhs);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestDistanceRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestDistanceRelaxed.rs
index 6660366..ba4c096 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestDistanceRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestDistance.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDot.java b/tests/tests/renderscript/src/android/renderscript/cts/TestDot.java
similarity index 62%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDot.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestDot.java
index b9b7729..666906b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestDot.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestDot.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestDot extends RSBaseCompute {
+public class TestDot extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestDot script;
-    private ScriptC_GeneratedTestDotRelaxed scriptRelaxed;
+    private ScriptC_TestDot script;
+    private ScriptC_TestDotRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestDot(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestDotRelaxed(mRS);
+        script = new ScriptC_TestDot(mRS);
+        scriptRelaxed = new ScriptC_TestDotRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inLeftVector;
-        public float inRightVector;
+        public float inLhs;
+        public float inRhs;
         public Target.Floaty out;
     }
 
     private void checkDotFloatFloatFloat() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x38fe5ebdf7ff2d3el, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x948dc35615f562efl, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x93a0502d7b6ecc43l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x93a0502d7b6ef799l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testDotFloatFloatFloat(inLeftVector, out);
-            verifyResultsDotFloatFloatFloat(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testDotFloatFloatFloat(inLhs, out);
+            verifyResultsDotFloatFloatFloat(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDotFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testDotFloatFloatFloat(inLeftVector, out);
-            verifyResultsDotFloatFloatFloat(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testDotFloatFloatFloat(inLhs, out);
+            verifyResultsDotFloatFloatFloat(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDotFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsDotFloatFloatFloat(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 1];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 1];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsDotFloatFloatFloat(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 1];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 1];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
             // Create the appropriate sized arrays in args
             // Fill args with the input values
-            args.inLeftVector = arrayInLeftVector[i];
-            args.inRightVector = arrayInRightVector[i];
+            args.inLhs = arrayInLhs[i];
+            args.inRhs = arrayInRhs[i];
             Target target = new Target(relaxed);
             CoreMathVerifier.computeDot(args, target);
 
@@ -84,13 +84,13 @@
             }
             if (!valid) {
                 StringBuilder message = new StringBuilder();
-                message.append("Input inLeftVector: ");
+                message.append("Input inLhs: ");
                 message.append(String.format("%14.8g {%8x} %15a",
-                        arrayInLeftVector[i], Float.floatToRawIntBits(arrayInLeftVector[i]), arrayInLeftVector[i]));
+                        arrayInLhs[i], Float.floatToRawIntBits(arrayInLhs[i]), arrayInLhs[i]));
                 message.append("\n");
-                message.append("Input inRightVector: ");
+                message.append("Input inRhs: ");
                 message.append(String.format("%14.8g {%8x} %15a",
-                        arrayInRightVector[i], Float.floatToRawIntBits(arrayInRightVector[i]), arrayInRightVector[i]));
+                        arrayInRhs[i], Float.floatToRawIntBits(arrayInRhs[i]), arrayInRhs[i]));
                 message.append("\n");
                 message.append("Expected output out: ");
                 message.append(args.out.toString());
@@ -109,50 +109,50 @@
     }
 
     public class ArgumentsFloatNFloatNFloat {
-        public float[] inLeftVector;
-        public float[] inRightVector;
+        public float[] inLhs;
+        public float[] inRhs;
         public Target.Floaty out;
     }
 
     private void checkDotFloat2Float2Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3a9fadaebf79d3a2l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdaa605c7978f55bbl, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6458f96b84293a8fl, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6458f96b842965e5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testDotFloat2Float2Float(inLeftVector, out);
-            verifyResultsDotFloat2Float2Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testDotFloat2Float2Float(inLhs, out);
+            verifyResultsDotFloat2Float2Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDotFloat2Float2Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testDotFloat2Float2Float(inLeftVector, out);
-            verifyResultsDotFloat2Float2Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testDotFloat2Float2Float(inLhs, out);
+            verifyResultsDotFloat2Float2Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDotFloat2Float2Float: " + e.toString());
         }
     }
 
-    private void verifyResultsDotFloat2Float2Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 2];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 2];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsDotFloat2Float2Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 2];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 2];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[2];
-            args.inRightVector = new float[2];
+            args.inLhs = new float[2];
+            args.inRhs = new float[2];
             // Fill args with the input values
             for (int j = 0; j < 2 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 2 + j];
+                args.inLhs[j] = arrayInLhs[i * 2 + j];
             }
             for (int j = 0; j < 2 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 2 + j];
+                args.inRhs[j] = arrayInRhs[i * 2 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeDot(args, target);
@@ -165,15 +165,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 2 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 2 + j]), arrayInLeftVector[i * 2 + j]));
+                            arrayInLhs[i * 2 + j], Float.floatToRawIntBits(arrayInLhs[i * 2 + j]), arrayInLhs[i * 2 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 2 + j], Float.floatToRawIntBits(arrayInRightVector[i * 2 + j]), arrayInRightVector[i * 2 + j]));
+                            arrayInRhs[i * 2 + j], Float.floatToRawIntBits(arrayInRhs[i * 2 + j]), arrayInRhs[i * 2 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
@@ -193,44 +193,44 @@
     }
 
     private void checkDotFloat3Float3Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x948d32ce11887f0l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x910f51f73d379ed5l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x914a48cbd43f55e9l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x914a48cbd43f813fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testDotFloat3Float3Float(inLeftVector, out);
-            verifyResultsDotFloat3Float3Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testDotFloat3Float3Float(inLhs, out);
+            verifyResultsDotFloat3Float3Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDotFloat3Float3Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testDotFloat3Float3Float(inLeftVector, out);
-            verifyResultsDotFloat3Float3Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testDotFloat3Float3Float(inLhs, out);
+            verifyResultsDotFloat3Float3Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDotFloat3Float3Float: " + e.toString());
         }
     }
 
-    private void verifyResultsDotFloat3Float3Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsDotFloat3Float3Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[3];
-            args.inRightVector = new float[3];
+            args.inLhs = new float[3];
+            args.inRhs = new float[3];
             // Fill args with the input values
             for (int j = 0; j < 3 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
+                args.inLhs[j] = arrayInLhs[i * 4 + j];
             }
             for (int j = 0; j < 3 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 4 + j];
+                args.inRhs[j] = arrayInRhs[i * 4 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeDot(args, target);
@@ -243,15 +243,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 4 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 4 + j]), arrayInLeftVector[i * 4 + j]));
+                            arrayInLhs[i * 4 + j], Float.floatToRawIntBits(arrayInLhs[i * 4 + j]), arrayInLhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 4 + j], Float.floatToRawIntBits(arrayInRightVector[i * 4 + j]), arrayInRightVector[i * 4 + j]));
+                            arrayInRhs[i * 4 + j], Float.floatToRawIntBits(arrayInRhs[i * 4 + j]), arrayInRhs[i * 4 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
@@ -271,44 +271,44 @@
     }
 
     private void checkDotFloat4Float4Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd7f1f8ab02b73c3el, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x47789e26e2dfe7efl, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbe3b982c24557143l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbe3b982c24559c99l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testDotFloat4Float4Float(inLeftVector, out);
-            verifyResultsDotFloat4Float4Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testDotFloat4Float4Float(inLhs, out);
+            verifyResultsDotFloat4Float4Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDotFloat4Float4Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testDotFloat4Float4Float(inLeftVector, out);
-            verifyResultsDotFloat4Float4Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testDotFloat4Float4Float(inLhs, out);
+            verifyResultsDotFloat4Float4Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testDotFloat4Float4Float: " + e.toString());
         }
     }
 
-    private void verifyResultsDotFloat4Float4Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsDotFloat4Float4Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[4];
-            args.inRightVector = new float[4];
+            args.inLhs = new float[4];
+            args.inRhs = new float[4];
             // Fill args with the input values
             for (int j = 0; j < 4 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
+                args.inLhs[j] = arrayInLhs[i * 4 + j];
             }
             for (int j = 0; j < 4 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 4 + j];
+                args.inRhs[j] = arrayInRhs[i * 4 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeDot(args, target);
@@ -321,15 +321,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 4 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 4 + j]), arrayInLeftVector[i * 4 + j]));
+                            arrayInLhs[i * 4 + j], Float.floatToRawIntBits(arrayInLhs[i * 4 + j]), arrayInLhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 4 + j], Float.floatToRawIntBits(arrayInRightVector[i * 4 + j]), arrayInRightVector[i * 4 + j]));
+                            arrayInRhs[i * 4 + j], Float.floatToRawIntBits(arrayInRhs[i * 4 + j]), arrayInRhs[i * 4 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestDot.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestDot.rs
new file mode 100644
index 0000000..27aa8aa
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestDot.rs
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocInRhs;
+
+float __attribute__((kernel)) testDotFloatFloatFloat(float inLhs, unsigned int x) {
+    float inRhs = rsGetElementAt_float(gAllocInRhs, x);
+    return dot(inLhs, inRhs);
+}
+
+float __attribute__((kernel)) testDotFloat2Float2Float(float2 inLhs, unsigned int x) {
+    float2 inRhs = rsGetElementAt_float2(gAllocInRhs, x);
+    return dot(inLhs, inRhs);
+}
+
+float __attribute__((kernel)) testDotFloat3Float3Float(float3 inLhs, unsigned int x) {
+    float3 inRhs = rsGetElementAt_float3(gAllocInRhs, x);
+    return dot(inLhs, inRhs);
+}
+
+float __attribute__((kernel)) testDotFloat4Float4Float(float4 inLhs, unsigned int x) {
+    float4 inRhs = rsGetElementAt_float4(gAllocInRhs, x);
+    return dot(inLhs, inRhs);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestDotRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestDotRelaxed.rs
index 6660366..53e7080 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestDotRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestDot.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErf.java b/tests/tests/renderscript/src/android/renderscript/cts/TestErf.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErf.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestErf.java
index f46136d..6c73bf1 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErf.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestErf.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestErf extends RSBaseCompute {
+public class TestErf extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestErf script;
-    private ScriptC_GeneratedTestErfRelaxed scriptRelaxed;
+    private ScriptC_TestErf script;
+    private ScriptC_TestErfRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestErf(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestErfRelaxed(mRS);
+        script = new ScriptC_TestErf(mRS);
+        scriptRelaxed = new ScriptC_TestErfRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkErfFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xccfbfd30a3951fb8l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x287cee12fdd9cb26l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testErfFloatFloat(inV, out);
-            verifyResultsErfFloatFloat(inV, out, false);
+            script.forEach_testErfFloatFloat(in, out);
+            verifyResultsErfFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testErfFloatFloat(inV, out);
-            verifyResultsErfFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testErfFloatFloat(in, out);
+            verifyResultsErfFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsErfFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsErfFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeErf(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkErfFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x87e26994448c58dcl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6e52a9272b44c092l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testErfFloat2Float2(inV, out);
-            verifyResultsErfFloat2Float2(inV, out, false);
+            script.forEach_testErfFloat2Float2(in, out);
+            verifyResultsErfFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testErfFloat2Float2(inV, out);
-            verifyResultsErfFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testErfFloat2Float2(in, out);
+            verifyResultsErfFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsErfFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsErfFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeErf(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkErfFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x87e432af3aa779bal, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6e52b3c88a4b562cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testErfFloat3Float3(inV, out);
-            verifyResultsErfFloat3Float3(inV, out, false);
+            script.forEach_testErfFloat3Float3(in, out);
+            verifyResultsErfFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testErfFloat3Float3(inV, out);
-            verifyResultsErfFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testErfFloat3Float3(in, out);
+            verifyResultsErfFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsErfFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsErfFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeErf(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkErfFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x87e5fbca30c29a98l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6e52be69e951ebc6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testErfFloat4Float4(inV, out);
-            verifyResultsErfFloat4Float4(inV, out, false);
+            script.forEach_testErfFloat4Float4(in, out);
+            verifyResultsErfFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testErfFloat4Float4(inV, out);
-            verifyResultsErfFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testErfFloat4Float4(in, out);
+            verifyResultsErfFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsErfFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsErfFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeErf(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestErf.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestErf.rs
index d7e22fa..5d26ed6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestErf.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testErfFloatFloat(float in) {
+    return erf(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testErfFloat2Float2(float2 in) {
+    return erf(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testErfFloat3Float3(float3 in) {
+    return erf(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testErfFloat4Float4(float4 in) {
+    return erf(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestErfRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestErfRelaxed.rs
index 6660366..1551db8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestErfRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestErf.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfc.java b/tests/tests/renderscript/src/android/renderscript/cts/TestErfc.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfc.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestErfc.java
index a8a37c9..86c2aa1 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestErfc.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestErfc.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestErfc extends RSBaseCompute {
+public class TestErfc extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestErfc script;
-    private ScriptC_GeneratedTestErfcRelaxed scriptRelaxed;
+    private ScriptC_TestErfc script;
+    private ScriptC_TestErfcRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestErfc(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestErfcRelaxed(mRS);
+        script = new ScriptC_TestErfc(mRS);
+        scriptRelaxed = new ScriptC_TestErfcRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkErfcFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x40344e4f0dfa008fl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb41907c64db86b2bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testErfcFloatFloat(inV, out);
-            verifyResultsErfcFloatFloat(inV, out, false);
+            script.forEach_testErfcFloatFloat(in, out);
+            verifyResultsErfcFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfcFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testErfcFloatFloat(inV, out);
-            verifyResultsErfcFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testErfcFloatFloat(in, out);
+            verifyResultsErfcFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfcFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsErfcFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsErfcFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeErfc(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkErfcFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb9a44e42b72849bbl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc8c849430a3684afl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testErfcFloat2Float2(inV, out);
-            verifyResultsErfcFloat2Float2(inV, out, false);
+            script.forEach_testErfcFloat2Float2(in, out);
+            verifyResultsErfcFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfcFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testErfcFloat2Float2(inV, out);
-            verifyResultsErfcFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testErfcFloat2Float2(in, out);
+            verifyResultsErfcFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfcFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsErfcFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsErfcFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeErfc(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkErfcFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb9a6175dad436a99l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc8c853e4693d1a49l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testErfcFloat3Float3(inV, out);
-            verifyResultsErfcFloat3Float3(inV, out, false);
+            script.forEach_testErfcFloat3Float3(in, out);
+            verifyResultsErfcFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfcFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testErfcFloat3Float3(inV, out);
-            verifyResultsErfcFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testErfcFloat3Float3(in, out);
+            verifyResultsErfcFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfcFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsErfcFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsErfcFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeErfc(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkErfcFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb9a7e078a35e8b77l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc8c85e85c843afe3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testErfcFloat4Float4(inV, out);
-            verifyResultsErfcFloat4Float4(inV, out, false);
+            script.forEach_testErfcFloat4Float4(in, out);
+            verifyResultsErfcFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfcFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testErfcFloat4Float4(inV, out);
-            verifyResultsErfcFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testErfcFloat4Float4(in, out);
+            verifyResultsErfcFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testErfcFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsErfcFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsErfcFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeErfc(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestErfc.rs
similarity index 70%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestErfc.rs
index d7e22fa..d12ea25 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestErfc.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testErfcFloatFloat(float in) {
+    return erfc(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testErfcFloat2Float2(float2 in) {
+    return erfc(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testErfcFloat3Float3(float3 in) {
+    return erfc(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testErfcFloat4Float4(float4 in) {
+    return erfc(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestErfcRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestErfcRelaxed.rs
index 6660366..f6117c8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestErfcRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestErfc.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.java b/tests/tests/renderscript/src/android/renderscript/cts/TestExp.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestExp.java
index f2a5042..224a64c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExp.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestExp extends RSBaseCompute {
+public class TestExp extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestExp script;
-    private ScriptC_GeneratedTestExpRelaxed scriptRelaxed;
+    private ScriptC_TestExp script;
+    private ScriptC_TestExpRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestExp(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestExpRelaxed(mRS);
+        script = new ScriptC_TestExp(mRS);
+        scriptRelaxed = new ScriptC_TestExpRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkExpFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x45e6c49035f888fcl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb43af2b5f55920f2l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testExpFloatFloat(inV, out);
-            verifyResultsExpFloatFloat(inV, out, false);
+            script.forEach_testExpFloatFloat(in, out);
+            verifyResultsExpFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testExpFloatFloat(inV, out);
-            verifyResultsExpFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testExpFloatFloat(in, out);
+            verifyResultsExpFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsExpFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExpFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkExpFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdf9c6adc948fa500l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbdc22634c1f76efel, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testExpFloat2Float2(inV, out);
-            verifyResultsExpFloat2Float2(inV, out, false);
+            script.forEach_testExpFloat2Float2(in, out);
+            verifyResultsExpFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testExpFloat2Float2(inV, out);
-            verifyResultsExpFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testExpFloat2Float2(in, out);
+            verifyResultsExpFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsExpFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExpFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkExpFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdf9e33f78aaac5del, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbdc230d620fe0498l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testExpFloat3Float3(inV, out);
-            verifyResultsExpFloat3Float3(inV, out, false);
+            script.forEach_testExpFloat3Float3(in, out);
+            verifyResultsExpFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testExpFloat3Float3(inV, out);
-            verifyResultsExpFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testExpFloat3Float3(in, out);
+            verifyResultsExpFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsExpFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExpFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkExpFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdf9ffd1280c5e6bcl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbdc23b7780049a32l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testExpFloat4Float4(inV, out);
-            verifyResultsExpFloat4Float4(inV, out, false);
+            script.forEach_testExpFloat4Float4(in, out);
+            verifyResultsExpFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testExpFloat4Float4(inV, out);
-            verifyResultsExpFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testExpFloat4Float4(in, out);
+            verifyResultsExpFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsExpFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExpFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestExp.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestExp.rs
index d7e22fa..90879d9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExp.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testExpFloatFloat(float in) {
+    return exp(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testExpFloat2Float2(float2 in) {
+    return exp(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testExpFloat3Float3(float3 in) {
+    return exp(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testExpFloat4Float4(float4 in) {
+    return exp(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp10.java b/tests/tests/renderscript/src/android/renderscript/cts/TestExp10.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp10.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestExp10.java
index 9253fd4..874d17b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExp10.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestExp10 extends RSBaseCompute {
+public class TestExp10 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestExp10 script;
-    private ScriptC_GeneratedTestExp10Relaxed scriptRelaxed;
+    private ScriptC_TestExp10 script;
+    private ScriptC_TestExp10Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestExp10(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestExp10Relaxed(mRS);
+        script = new ScriptC_TestExp10(mRS);
+        scriptRelaxed = new ScriptC_TestExp10Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkExp10FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc5df97aec123e2edl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9f6474a4cee90545l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testExp10FloatFloat(inV, out);
-            verifyResultsExp10FloatFloat(inV, out, false);
+            script.forEach_testExp10FloatFloat(in, out);
+            verifyResultsExp10FloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp10FloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testExp10FloatFloat(inV, out);
-            verifyResultsExp10FloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testExp10FloatFloat(in, out);
+            verifyResultsExp10FloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp10FloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsExp10FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExp10FloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp10(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkExp10Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2bc94277c0ac42a9l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3c8d9c56223f8a79l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testExp10Float2Float2(inV, out);
-            verifyResultsExp10Float2Float2(inV, out, false);
+            script.forEach_testExp10Float2Float2(in, out);
+            verifyResultsExp10Float2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp10Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testExp10Float2Float2(inV, out);
-            verifyResultsExp10Float2Float2(inV, out, true);
+            scriptRelaxed.forEach_testExp10Float2Float2(in, out);
+            verifyResultsExp10Float2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp10Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsExp10Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExp10Float2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp10(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkExp10Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2bcb0b92b6c76387l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3c8da6f781462013l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testExp10Float3Float3(inV, out);
-            verifyResultsExp10Float3Float3(inV, out, false);
+            script.forEach_testExp10Float3Float3(in, out);
+            verifyResultsExp10Float3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp10Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testExp10Float3Float3(inV, out);
-            verifyResultsExp10Float3Float3(inV, out, true);
+            scriptRelaxed.forEach_testExp10Float3Float3(in, out);
+            verifyResultsExp10Float3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp10Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsExp10Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExp10Float3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp10(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkExp10Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2bccd4adace28465l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3c8db198e04cb5adl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testExp10Float4Float4(inV, out);
-            verifyResultsExp10Float4Float4(inV, out, false);
+            script.forEach_testExp10Float4Float4(in, out);
+            verifyResultsExp10Float4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp10Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testExp10Float4Float4(inV, out);
-            verifyResultsExp10Float4Float4(inV, out, true);
+            scriptRelaxed.forEach_testExp10Float4Float4(in, out);
+            verifyResultsExp10Float4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp10Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsExp10Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExp10Float4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp10(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestExp10.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestExp10.rs
index d7e22fa..117fe26 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExp10.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testExp10FloatFloat(float in) {
+    return exp10(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testExp10Float2Float2(float2 in) {
+    return exp10(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testExp10Float3Float3(float3 in) {
+    return exp10(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testExp10Float4Float4(float4 in) {
+    return exp10(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestExp10Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestExp10Relaxed.rs
index 6660366..9b07598 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExp10Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestExp10.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp2.java b/tests/tests/renderscript/src/android/renderscript/cts/TestExp2.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp2.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestExp2.java
index 32d39fa..bbb9c68 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExp2.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestExp2 extends RSBaseCompute {
+public class TestExp2 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestExp2 script;
-    private ScriptC_GeneratedTestExp2Relaxed scriptRelaxed;
+    private ScriptC_TestExp2 script;
+    private ScriptC_TestExp2Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestExp2(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestExp2Relaxed(mRS);
+        script = new ScriptC_TestExp2(mRS);
+        scriptRelaxed = new ScriptC_TestExp2Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkExp2FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x58195894b8b72a10l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x80096e5b0f2662el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testExp2FloatFloat(inV, out);
-            verifyResultsExp2FloatFloat(inV, out, false);
+            script.forEach_testExp2FloatFloat(in, out);
+            verifyResultsExp2FloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp2FloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testExp2FloatFloat(inV, out);
-            verifyResultsExp2FloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testExp2FloatFloat(in, out);
+            verifyResultsExp2FloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp2FloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsExp2FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExp2FloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp2(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkExp2Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4eeb7f70e7690e74l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xcc4102f6b7fc7d5al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testExp2Float2Float2(inV, out);
-            verifyResultsExp2Float2Float2(inV, out, false);
+            script.forEach_testExp2Float2Float2(in, out);
+            verifyResultsExp2Float2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testExp2Float2Float2(inV, out);
-            verifyResultsExp2Float2Float2(inV, out, true);
+            scriptRelaxed.forEach_testExp2Float2Float2(in, out);
+            verifyResultsExp2Float2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsExp2Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExp2Float2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp2(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkExp2Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4eed488bdd842f52l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xcc410d98170312f4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testExp2Float3Float3(inV, out);
-            verifyResultsExp2Float3Float3(inV, out, false);
+            script.forEach_testExp2Float3Float3(in, out);
+            verifyResultsExp2Float3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp2Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testExp2Float3Float3(inV, out);
-            verifyResultsExp2Float3Float3(inV, out, true);
+            scriptRelaxed.forEach_testExp2Float3Float3(in, out);
+            verifyResultsExp2Float3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp2Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsExp2Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExp2Float3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp2(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkExp2Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4eef11a6d39f5030l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xcc4118397609a88el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testExp2Float4Float4(inV, out);
-            verifyResultsExp2Float4Float4(inV, out, false);
+            script.forEach_testExp2Float4Float4(in, out);
+            verifyResultsExp2Float4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp2Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testExp2Float4Float4(inV, out);
-            verifyResultsExp2Float4Float4(inV, out, true);
+            scriptRelaxed.forEach_testExp2Float4Float4(in, out);
+            verifyResultsExp2Float4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExp2Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsExp2Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExp2Float4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExp2(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestExp2.rs
similarity index 70%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestExp2.rs
index d7e22fa..61ff900 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExp2.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testExp2FloatFloat(float in) {
+    return exp2(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testExp2Float2Float2(float2 in) {
+    return exp2(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testExp2Float3Float3(float3 in) {
+    return exp2(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testExp2Float4Float4(float4 in) {
+    return exp2(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestExp2Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestExp2Relaxed.rs
index 6660366..06810b3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExp2Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestExp2.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestExpRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestExpRelaxed.rs
index 6660366..f98bf80 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExpRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestExp.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpm1.java b/tests/tests/renderscript/src/android/renderscript/cts/TestExpm1.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpm1.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestExpm1.java
index 3c9921c..c922e49 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExpm1.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExpm1.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestExpm1 extends RSBaseCompute {
+public class TestExpm1 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestExpm1 script;
-    private ScriptC_GeneratedTestExpm1Relaxed scriptRelaxed;
+    private ScriptC_TestExpm1 script;
+    private ScriptC_TestExpm1Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestExpm1(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestExpm1Relaxed(mRS);
+        script = new ScriptC_TestExpm1(mRS);
+        scriptRelaxed = new ScriptC_TestExpm1Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkExpm1FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xea420692a183a9e4l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa03d120368f727aal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testExpm1FloatFloat(inV, out);
-            verifyResultsExpm1FloatFloat(inV, out, false);
+            script.forEach_testExpm1FloatFloat(in, out);
+            verifyResultsExpm1FloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpm1FloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testExpm1FloatFloat(inV, out);
-            verifyResultsExpm1FloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testExpm1FloatFloat(in, out);
+            verifyResultsExpm1FloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpm1FloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsExpm1FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExpm1FloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExpm1(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkExpm1Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf6bc2e57547050a8l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x59163c9cd255f5f6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testExpm1Float2Float2(inV, out);
-            verifyResultsExpm1Float2Float2(inV, out, false);
+            script.forEach_testExpm1Float2Float2(in, out);
+            verifyResultsExpm1Float2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpm1Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testExpm1Float2Float2(inV, out);
-            verifyResultsExpm1Float2Float2(inV, out, true);
+            scriptRelaxed.forEach_testExpm1Float2Float2(in, out);
+            verifyResultsExpm1Float2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpm1Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsExpm1Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExpm1Float2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExpm1(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkExpm1Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf6bdf7724a8b7186l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5916473e315c8b90l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testExpm1Float3Float3(inV, out);
-            verifyResultsExpm1Float3Float3(inV, out, false);
+            script.forEach_testExpm1Float3Float3(in, out);
+            verifyResultsExpm1Float3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpm1Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testExpm1Float3Float3(inV, out);
-            verifyResultsExpm1Float3Float3(inV, out, true);
+            scriptRelaxed.forEach_testExpm1Float3Float3(in, out);
+            verifyResultsExpm1Float3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpm1Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsExpm1Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExpm1Float3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExpm1(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkExpm1Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf6bfc08d40a69264l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x591651df9063212al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testExpm1Float4Float4(inV, out);
-            verifyResultsExpm1Float4Float4(inV, out, false);
+            script.forEach_testExpm1Float4Float4(in, out);
+            verifyResultsExpm1Float4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpm1Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testExpm1Float4Float4(inV, out);
-            verifyResultsExpm1Float4Float4(inV, out, true);
+            scriptRelaxed.forEach_testExpm1Float4Float4(in, out);
+            verifyResultsExpm1Float4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testExpm1Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsExpm1Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsExpm1Float4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeExpm1(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestExpm1.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestExpm1.rs
index d7e22fa..9399576 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExpm1.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testExpm1FloatFloat(float in) {
+    return expm1(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testExpm1Float2Float2(float2 in) {
+    return expm1(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testExpm1Float3Float3(float3 in) {
+    return expm1(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testExpm1Float4Float4(float4 in) {
+    return expm1(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestExpm1Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestExpm1Relaxed.rs
index 6660366..bd73f9d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestExpm1Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestExpm1.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFabs.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFabs.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFabs.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFabs.java
index 5f73747..29cdd86 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFabs.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFabs.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestFabs extends RSBaseCompute {
+public class TestFabs extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestFabs script;
-    private ScriptC_GeneratedTestFabsRelaxed scriptRelaxed;
+    private ScriptC_TestFabs script;
+    private ScriptC_TestFabsRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestFabs(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFabsRelaxed(mRS);
+        script = new ScriptC_TestFabs(mRS);
+        scriptRelaxed = new ScriptC_TestFabsRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkFabsFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd84cf8f27f929ae9l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x70316affaf9e3339l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testFabsFloatFloat(inV, out);
-            verifyResultsFabsFloatFloat(inV, out, false);
+            script.forEach_testFabsFloatFloat(in, out);
+            verifyResultsFabsFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFabsFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testFabsFloatFloat(inV, out);
-            verifyResultsFabsFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testFabsFloatFloat(in, out);
+            verifyResultsFabsFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFabsFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsFabsFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsFabsFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFabs(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkFabsFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x43ccc4c22e5b1dc5l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x54ecf2b71ed871cdl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testFabsFloat2Float2(inV, out);
-            verifyResultsFabsFloat2Float2(inV, out, false);
+            script.forEach_testFabsFloat2Float2(in, out);
+            verifyResultsFabsFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFabsFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testFabsFloat2Float2(inV, out);
-            verifyResultsFabsFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testFabsFloat2Float2(in, out);
+            verifyResultsFabsFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFabsFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsFabsFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsFabsFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFabs(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkFabsFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x43ce8ddd24763ea3l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x54ecfd587ddf0767l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testFabsFloat3Float3(inV, out);
-            verifyResultsFabsFloat3Float3(inV, out, false);
+            script.forEach_testFabsFloat3Float3(in, out);
+            verifyResultsFabsFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFabsFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testFabsFloat3Float3(inV, out);
-            verifyResultsFabsFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testFabsFloat3Float3(in, out);
+            verifyResultsFabsFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFabsFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsFabsFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsFabsFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFabs(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkFabsFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x43d056f81a915f81l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x54ed07f9dce59d01l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testFabsFloat4Float4(inV, out);
-            verifyResultsFabsFloat4Float4(inV, out, false);
+            script.forEach_testFabsFloat4Float4(in, out);
+            verifyResultsFabsFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFabsFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testFabsFloat4Float4(inV, out);
-            verifyResultsFabsFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testFabsFloat4Float4(in, out);
+            verifyResultsFabsFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFabsFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsFabsFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsFabsFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFabs(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFabs.rs
similarity index 70%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFabs.rs
index d7e22fa..aed0318 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFabs.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testFabsFloatFloat(float in) {
+    return fabs(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testFabsFloat2Float2(float2 in) {
+    return fabs(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testFabsFloat3Float3(float3 in) {
+    return fabs(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testFabsFloat4Float4(float4 in) {
+    return fabs(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFabsRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFabsRelaxed.rs
index 6660366..4d2214a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFabsRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFabs.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastDistance.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFastDistance.java
similarity index 65%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastDistance.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFastDistance.java
index 817f0bc..8091015 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastDistance.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFastDistance.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestFastDistance extends RSBaseCompute {
+public class TestFastDistance extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestFastDistance script;
-    private ScriptC_GeneratedTestFastDistanceRelaxed scriptRelaxed;
+    private ScriptC_TestFastDistance script;
+    private ScriptC_TestFastDistanceRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestFastDistance(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFastDistanceRelaxed(mRS);
+        script = new ScriptC_TestFastDistance(mRS);
+        scriptRelaxed = new ScriptC_TestFastDistanceRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inLeftVector;
-        public float inRightVector;
+        public float inLhs;
+        public float inRhs;
         public Target.Floaty out;
     }
 
     private void checkFastDistanceFloatFloatFloat() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xeb32e5abb9b28b1al, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x83606d459f1626e3l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfe7e5e843bff0cb7l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfe7e5e843bff380dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testFastDistanceFloatFloatFloat(inLeftVector, out);
-            verifyResultsFastDistanceFloatFloatFloat(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testFastDistanceFloatFloatFloat(inLhs, out);
+            verifyResultsFastDistanceFloatFloatFloat(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFastDistanceFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testFastDistanceFloatFloatFloat(inLeftVector, out);
-            verifyResultsFastDistanceFloatFloatFloat(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testFastDistanceFloatFloatFloat(inLhs, out);
+            verifyResultsFastDistanceFloatFloatFloat(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFastDistanceFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsFastDistanceFloatFloatFloat(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 1];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 1];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsFastDistanceFloatFloatFloat(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 1];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 1];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
             // Create the appropriate sized arrays in args
             // Fill args with the input values
-            args.inLeftVector = arrayInLeftVector[i];
-            args.inRightVector = arrayInRightVector[i];
+            args.inLhs = arrayInLhs[i];
+            args.inRhs = arrayInRhs[i];
             Target target = new Target(relaxed);
             CoreMathVerifier.computeFastDistance(args, target);
 
@@ -84,13 +84,13 @@
             }
             if (!valid) {
                 StringBuilder message = new StringBuilder();
-                message.append("Input inLeftVector: ");
+                message.append("Input inLhs: ");
                 message.append(String.format("%14.8g {%8x} %15a",
-                        arrayInLeftVector[i], Float.floatToRawIntBits(arrayInLeftVector[i]), arrayInLeftVector[i]));
+                        arrayInLhs[i], Float.floatToRawIntBits(arrayInLhs[i]), arrayInLhs[i]));
                 message.append("\n");
-                message.append("Input inRightVector: ");
+                message.append("Input inRhs: ");
                 message.append(String.format("%14.8g {%8x} %15a",
-                        arrayInRightVector[i], Float.floatToRawIntBits(arrayInRightVector[i]), arrayInRightVector[i]));
+                        arrayInRhs[i], Float.floatToRawIntBits(arrayInRhs[i]), arrayInRhs[i]));
                 message.append("\n");
                 message.append("Expected output out: ");
                 message.append(args.out.toString());
@@ -109,50 +109,50 @@
     }
 
     public class ArgumentsFloatNFloatNFloat {
-        public float[] inLeftVector;
-        public float[] inRightVector;
+        public float[] inLhs;
+        public float[] inRhs;
         public Target.Floaty out;
     }
 
     private void checkFastDistanceFloat2Float2Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x580238eac7fabd9el, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xca3368dd0536a30fl, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x422e8a00560ac063l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x422e8a00560aebb9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testFastDistanceFloat2Float2Float(inLeftVector, out);
-            verifyResultsFastDistanceFloat2Float2Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testFastDistanceFloat2Float2Float(inLhs, out);
+            verifyResultsFastDistanceFloat2Float2Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFastDistanceFloat2Float2Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testFastDistanceFloat2Float2Float(inLeftVector, out);
-            verifyResultsFastDistanceFloat2Float2Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testFastDistanceFloat2Float2Float(inLhs, out);
+            verifyResultsFastDistanceFloat2Float2Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFastDistanceFloat2Float2Float: " + e.toString());
         }
     }
 
-    private void verifyResultsFastDistanceFloat2Float2Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 2];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 2];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsFastDistanceFloat2Float2Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 2];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 2];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[2];
-            args.inRightVector = new float[2];
+            args.inLhs = new float[2];
+            args.inRhs = new float[2];
             // Fill args with the input values
             for (int j = 0; j < 2 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 2 + j];
+                args.inLhs[j] = arrayInLhs[i * 2 + j];
             }
             for (int j = 0; j < 2 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 2 + j];
+                args.inRhs[j] = arrayInRhs[i * 2 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeFastDistance(args, target);
@@ -165,15 +165,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 2 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 2 + j]), arrayInLeftVector[i * 2 + j]));
+                            arrayInLhs[i * 2 + j], Float.floatToRawIntBits(arrayInLhs[i * 2 + j]), arrayInLhs[i * 2 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 2 + j], Float.floatToRawIntBits(arrayInRightVector[i * 2 + j]), arrayInRightVector[i * 2 + j]));
+                            arrayInRhs[i * 2 + j], Float.floatToRawIntBits(arrayInRhs[i * 2 + j]), arrayInRhs[i * 2 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
@@ -193,44 +193,44 @@
     }
 
     private void checkFastDistanceFloat3Float3Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x26ab5e68e99971ecl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x809cb50caadeec29l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6f1fd960a620dbbdl, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6f1fd960a6210713l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testFastDistanceFloat3Float3Float(inLeftVector, out);
-            verifyResultsFastDistanceFloat3Float3Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testFastDistanceFloat3Float3Float(inLhs, out);
+            verifyResultsFastDistanceFloat3Float3Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFastDistanceFloat3Float3Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testFastDistanceFloat3Float3Float(inLeftVector, out);
-            verifyResultsFastDistanceFloat3Float3Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testFastDistanceFloat3Float3Float(inLhs, out);
+            verifyResultsFastDistanceFloat3Float3Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFastDistanceFloat3Float3Float: " + e.toString());
         }
     }
 
-    private void verifyResultsFastDistanceFloat3Float3Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsFastDistanceFloat3Float3Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[3];
-            args.inRightVector = new float[3];
+            args.inLhs = new float[3];
+            args.inRhs = new float[3];
             // Fill args with the input values
             for (int j = 0; j < 3 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
+                args.inLhs[j] = arrayInLhs[i * 4 + j];
             }
             for (int j = 0; j < 3 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 4 + j];
+                args.inRhs[j] = arrayInRhs[i * 4 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeFastDistance(args, target);
@@ -243,15 +243,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 4 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 4 + j]), arrayInLeftVector[i * 4 + j]));
+                            arrayInLhs[i * 4 + j], Float.floatToRawIntBits(arrayInLhs[i * 4 + j]), arrayInLhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 4 + j], Float.floatToRawIntBits(arrayInRightVector[i * 4 + j]), arrayInRightVector[i * 4 + j]));
+                            arrayInRhs[i * 4 + j], Float.floatToRawIntBits(arrayInRhs[i * 4 + j]), arrayInRhs[i * 4 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
@@ -271,44 +271,44 @@
     }
 
     private void checkFastDistanceFloat4Float4Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf55483e70b38263al, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3706013c50873543l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x9c1128c0f636f717l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x9c1128c0f637226dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testFastDistanceFloat4Float4Float(inLeftVector, out);
-            verifyResultsFastDistanceFloat4Float4Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testFastDistanceFloat4Float4Float(inLhs, out);
+            verifyResultsFastDistanceFloat4Float4Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFastDistanceFloat4Float4Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testFastDistanceFloat4Float4Float(inLeftVector, out);
-            verifyResultsFastDistanceFloat4Float4Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testFastDistanceFloat4Float4Float(inLhs, out);
+            verifyResultsFastDistanceFloat4Float4Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFastDistanceFloat4Float4Float: " + e.toString());
         }
     }
 
-    private void verifyResultsFastDistanceFloat4Float4Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsFastDistanceFloat4Float4Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[4];
-            args.inRightVector = new float[4];
+            args.inLhs = new float[4];
+            args.inRhs = new float[4];
             // Fill args with the input values
             for (int j = 0; j < 4 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
+                args.inLhs[j] = arrayInLhs[i * 4 + j];
             }
             for (int j = 0; j < 4 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 4 + j];
+                args.inRhs[j] = arrayInRhs[i * 4 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeFastDistance(args, target);
@@ -321,15 +321,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 4 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 4 + j]), arrayInLeftVector[i * 4 + j]));
+                            arrayInLhs[i * 4 + j], Float.floatToRawIntBits(arrayInLhs[i * 4 + j]), arrayInLhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 4 + j], Float.floatToRawIntBits(arrayInRightVector[i * 4 + j]), arrayInRightVector[i * 4 + j]));
+                            arrayInRhs[i * 4 + j], Float.floatToRawIntBits(arrayInRhs[i * 4 + j]), arrayInRhs[i * 4 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastDistance.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFastDistance.rs
similarity index 60%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastDistance.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFastDistance.rs
index 1101207..62c0931 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastDistance.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFastDistance.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInRightVector;
+rs_allocation gAllocInRhs;
 
-float __attribute__((kernel)) testFastDistanceFloatFloatFloat(float inLeftVector, unsigned int x) {
-    float inRightVector = rsGetElementAt_float(gAllocInRightVector, x);
-    return fast_distance(inLeftVector, inRightVector);
+float __attribute__((kernel)) testFastDistanceFloatFloatFloat(float inLhs, unsigned int x) {
+    float inRhs = rsGetElementAt_float(gAllocInRhs, x);
+    return fast_distance(inLhs, inRhs);
 }
 
-float __attribute__((kernel)) testFastDistanceFloat2Float2Float(float2 inLeftVector, unsigned int x) {
-    float2 inRightVector = rsGetElementAt_float2(gAllocInRightVector, x);
-    return fast_distance(inLeftVector, inRightVector);
+float __attribute__((kernel)) testFastDistanceFloat2Float2Float(float2 inLhs, unsigned int x) {
+    float2 inRhs = rsGetElementAt_float2(gAllocInRhs, x);
+    return fast_distance(inLhs, inRhs);
 }
 
-float __attribute__((kernel)) testFastDistanceFloat3Float3Float(float3 inLeftVector, unsigned int x) {
-    float3 inRightVector = rsGetElementAt_float3(gAllocInRightVector, x);
-    return fast_distance(inLeftVector, inRightVector);
+float __attribute__((kernel)) testFastDistanceFloat3Float3Float(float3 inLhs, unsigned int x) {
+    float3 inRhs = rsGetElementAt_float3(gAllocInRhs, x);
+    return fast_distance(inLhs, inRhs);
 }
 
-float __attribute__((kernel)) testFastDistanceFloat4Float4Float(float4 inLeftVector, unsigned int x) {
-    float4 inRightVector = rsGetElementAt_float4(gAllocInRightVector, x);
-    return fast_distance(inLeftVector, inRightVector);
+float __attribute__((kernel)) testFastDistanceFloat4Float4Float(float4 inLhs, unsigned int x) {
+    float4 inRhs = rsGetElementAt_float4(gAllocInRhs, x);
+    return fast_distance(inLhs, inRhs);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFastDistanceRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFastDistanceRelaxed.rs
index 6660366..245bc65 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFastDistanceRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFastDistance.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastLength.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFastLength.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastLength.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFastLength.java
index 007a635..e990d15 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastLength.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFastLength.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestFastLength extends RSBaseCompute {
+public class TestFastLength extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestFastLength script;
-    private ScriptC_GeneratedTestFastLengthRelaxed scriptRelaxed;
+    private ScriptC_TestFastLength script;
+    private ScriptC_TestFastLengthRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestFastLength(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFastLengthRelaxed(mRS);
+        script = new ScriptC_TestFastLength(mRS);
+        scriptRelaxed = new ScriptC_TestFastLengthRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastLength.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFastLength.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastLength.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFastLength.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFastLengthRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFastLengthRelaxed.rs
index 6660366..680c3e1 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFastLengthRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFastLength.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastNormalize.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFastNormalize.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastNormalize.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFastNormalize.java
index e5df624..4e42575 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastNormalize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFastNormalize.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestFastNormalize extends RSBaseCompute {
+public class TestFastNormalize extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestFastNormalize script;
-    private ScriptC_GeneratedTestFastNormalizeRelaxed scriptRelaxed;
+    private ScriptC_TestFastNormalize script;
+    private ScriptC_TestFastNormalizeRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestFastNormalize(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFastNormalizeRelaxed(mRS);
+        script = new ScriptC_TestFastNormalize(mRS);
+        scriptRelaxed = new ScriptC_TestFastNormalizeRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastNormalize.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFastNormalize.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFastNormalize.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFastNormalize.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFastNormalizeRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFastNormalizeRelaxed.rs
index 6660366..e195f60 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFastNormalizeRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFastNormalize.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFdim.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFdim.java
similarity index 98%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFdim.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFdim.java
index eff3e49..bbe1e7a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFdim.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFdim.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestFdim extends RSBaseCompute {
+public class TestFdim extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestFdim script;
-    private ScriptC_GeneratedTestFdimRelaxed scriptRelaxed;
+    private ScriptC_TestFdim script;
+    private ScriptC_TestFdimRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestFdim(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFdimRelaxed(mRS);
+        script = new ScriptC_TestFdim(mRS);
+        scriptRelaxed = new ScriptC_TestFdimRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFdim.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFdim.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFdim.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFdim.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFdimRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFdimRelaxed.rs
index 6660366..473a588 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFdimRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFdim.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFloor.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFloor.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFloor.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFloor.java
index 295c1fe..39ec8bd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFloor.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFloor.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestFloor extends RSBaseCompute {
+public class TestFloor extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestFloor script;
-    private ScriptC_GeneratedTestFloorRelaxed scriptRelaxed;
+    private ScriptC_TestFloor script;
+    private ScriptC_TestFloorRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestFloor(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFloorRelaxed(mRS);
+        script = new ScriptC_TestFloor(mRS);
+        scriptRelaxed = new ScriptC_TestFloorRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkFloorFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3b3c924b95badeadl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9c2b15433f045885l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testFloorFloatFloat(inV, out);
-            verifyResultsFloorFloatFloat(inV, out, false);
+            script.forEach_testFloorFloatFloat(in, out);
+            verifyResultsFloorFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFloorFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testFloorFloatFloat(inV, out);
-            verifyResultsFloorFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testFloorFloatFloat(in, out);
+            verifyResultsFloorFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFloorFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsFloorFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsFloorFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFloor(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkFloorFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd8575933372c9069l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf32bb4add79bd3b9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testFloorFloat2Float2(inV, out);
-            verifyResultsFloorFloat2Float2(inV, out, false);
+            script.forEach_testFloorFloat2Float2(in, out);
+            verifyResultsFloorFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFloorFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testFloorFloat2Float2(inV, out);
-            verifyResultsFloorFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testFloorFloat2Float2(in, out);
+            verifyResultsFloorFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFloorFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsFloorFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsFloorFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFloor(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkFloorFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd859224e2d47b147l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf32bbf4f36a26953l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testFloorFloat3Float3(inV, out);
-            verifyResultsFloorFloat3Float3(inV, out, false);
+            script.forEach_testFloorFloat3Float3(in, out);
+            verifyResultsFloorFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFloorFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testFloorFloat3Float3(inV, out);
-            verifyResultsFloorFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testFloorFloat3Float3(in, out);
+            verifyResultsFloorFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFloorFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsFloorFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsFloorFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFloor(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkFloorFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd85aeb692362d225l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf32bc9f095a8feedl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testFloorFloat4Float4(inV, out);
-            verifyResultsFloorFloat4Float4(inV, out, false);
+            script.forEach_testFloorFloat4Float4(in, out);
+            verifyResultsFloorFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFloorFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testFloorFloat4Float4(inV, out);
-            verifyResultsFloorFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testFloorFloat4Float4(in, out);
+            verifyResultsFloorFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFloorFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsFloorFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsFloorFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFloor(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFloor.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFloor.rs
index d7e22fa..f74fc2b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFloor.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testFloorFloatFloat(float in) {
+    return floor(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testFloorFloat2Float2(float2 in) {
+    return floor(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testFloorFloat3Float3(float3 in) {
+    return floor(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testFloorFloat4Float4(float4 in) {
+    return floor(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFloorRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFloorRelaxed.rs
index 6660366..4caf0de 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFloorRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFloor.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFma.java
similarity index 64%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.java
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFma.java
index 006562f..fcb7c5f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFma.java
@@ -22,61 +22,68 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestHypot extends RSBaseCompute {
+public class TestFma extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestHypot script;
-    private ScriptC_GeneratedTestHypotRelaxed scriptRelaxed;
+    private ScriptC_TestFma script;
+    private ScriptC_TestFmaRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestHypot(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestHypotRelaxed(mRS);
+        script = new ScriptC_TestFma(mRS);
+        scriptRelaxed = new ScriptC_TestFmaRelaxed(mRS);
     }
 
-    public class ArgumentsFloatFloatFloat {
+    public class ArgumentsFloatFloatFloatFloat {
         public float inA;
         public float inB;
+        public float inC;
         public Target.Floaty out;
     }
 
-    private void checkHypotFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7deb65e7738c74c4l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7deb65e7738c74c5l, false);
+    private void checkFmaFloatFloatFloatFloat() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5f6b3ee0c3466c2l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5f6b3ee0c3466c3l, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5f6b3ee0c3466c4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testHypotFloatFloatFloat(inA, out);
-            verifyResultsHypotFloatFloatFloat(inA, inB, out, false);
+            script.set_gAllocInC(inC);
+            script.forEach_testFmaFloatFloatFloatFloat(inA, out);
+            verifyResultsFmaFloatFloatFloatFloat(inA, inB, inC, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloatFloatFloat: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloatFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloatFloatFloat(inA, out);
-            verifyResultsHypotFloatFloatFloat(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.forEach_testFmaFloatFloatFloatFloat(inA, out);
+            verifyResultsFmaFloatFloatFloatFloat(inA, inB, inC, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloatFloatFloat: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloatFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsFmaFloatFloatFloatFloat(Allocation inA, Allocation inB, Allocation inC, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 1];
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
         inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 1];
+        inC.copyTo(arrayInC);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
-                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inA = arrayInA[i];
                 args.inB = arrayInB[i];
+                args.inC = arrayInC[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeHypot(args, target);
+                CoreMathVerifier.computeFma(args, target);
                 // Validate the outputs.
                 boolean valid = true;
                 if (!args.out.couldBe(arrayOut[i * 1 + j])) {
@@ -92,6 +99,10 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inB, Float.floatToRawIntBits(args.inB), args.inB));
                     message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
                     message.append("\n");
@@ -102,50 +113,56 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloatFloatFloat" +
+                    assertTrue("Incorrect output for checkFmaFloatFloatFloatFloat" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    private void checkHypotFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x14f3c91a62f71c46l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x14f3c91a62f71c47l, false);
+    private void checkFmaFloat2Float2Float2Float2() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x47b62b8849bc43dal, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x47b62b8849bc43dbl, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x47b62b8849bc43dcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testHypotFloat2Float2Float2(inA, out);
-            verifyResultsHypotFloat2Float2Float2(inA, inB, out, false);
+            script.set_gAllocInC(inC);
+            script.forEach_testFmaFloat2Float2Float2Float2(inA, out);
+            verifyResultsFmaFloat2Float2Float2Float2(inA, inB, inC, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat2Float2Float2: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat2Float2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloat2Float2Float2(inA, out);
-            verifyResultsHypotFloat2Float2Float2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.forEach_testFmaFloat2Float2Float2Float2(inA, out);
+            verifyResultsFmaFloat2Float2Float2Float2(inA, inB, inC, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat2Float2Float2: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat2Float2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsFmaFloat2Float2Float2Float2(Allocation inA, Allocation inB, Allocation inC, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 2];
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 2];
         inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 2];
+        inC.copyTo(arrayInC);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
-                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inA = arrayInA[i * 2 + j];
                 args.inB = arrayInB[i * 2 + j];
+                args.inC = arrayInC[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeHypot(args, target);
+                CoreMathVerifier.computeFma(args, target);
                 // Validate the outputs.
                 boolean valid = true;
                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
@@ -161,6 +178,10 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inB, Float.floatToRawIntBits(args.inB), args.inB));
                     message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
                     message.append("\n");
@@ -171,50 +192,56 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloat2Float2Float2" +
+                    assertTrue("Incorrect output for checkFmaFloat2Float2Float2Float2" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    private void checkHypotFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6958a73a64d51de7l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6958a73a64d51de8l, false);
+    private void checkFmaFloat3Float3Float3Float3() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1d2fcf231c237d76l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1d2fcf231c237d77l, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1d2fcf231c237d78l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testHypotFloat3Float3Float3(inA, out);
-            verifyResultsHypotFloat3Float3Float3(inA, inB, out, false);
+            script.set_gAllocInC(inC);
+            script.forEach_testFmaFloat3Float3Float3Float3(inA, out);
+            verifyResultsFmaFloat3Float3Float3Float3(inA, inB, inC, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat3Float3Float3: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat3Float3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloat3Float3Float3(inA, out);
-            verifyResultsHypotFloat3Float3Float3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.forEach_testFmaFloat3Float3Float3Float3(inA, out);
+            verifyResultsFmaFloat3Float3Float3Float3(inA, inB, inC, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat3Float3Float3: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat3Float3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsFmaFloat3Float3Float3Float3(Allocation inA, Allocation inB, Allocation inC, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
         inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 4];
+        inC.copyTo(arrayInC);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
-                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inA = arrayInA[i * 4 + j];
                 args.inB = arrayInB[i * 4 + j];
+                args.inC = arrayInC[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeHypot(args, target);
+                CoreMathVerifier.computeFma(args, target);
                 // Validate the outputs.
                 boolean valid = true;
                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
@@ -230,6 +257,10 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inB, Float.floatToRawIntBits(args.inB), args.inB));
                     message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
                     message.append("\n");
@@ -240,50 +271,56 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloat3Float3Float3" +
+                    assertTrue("Incorrect output for checkFmaFloat3Float3Float3Float3" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    private void checkHypotFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbdbd855a66b31f88l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbdbd855a66b31f89l, false);
+    private void checkFmaFloat4Float4Float4Float4() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf2a972bdee8ab712l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf2a972bdee8ab713l, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf2a972bdee8ab714l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testHypotFloat4Float4Float4(inA, out);
-            verifyResultsHypotFloat4Float4Float4(inA, inB, out, false);
+            script.set_gAllocInC(inC);
+            script.forEach_testFmaFloat4Float4Float4Float4(inA, out);
+            verifyResultsFmaFloat4Float4Float4Float4(inA, inB, inC, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat4Float4Float4: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat4Float4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloat4Float4Float4(inA, out);
-            verifyResultsHypotFloat4Float4Float4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.forEach_testFmaFloat4Float4Float4Float4(inA, out);
+            verifyResultsFmaFloat4Float4Float4Float4(inA, inB, inC, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat4Float4Float4: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaFloat4Float4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsFmaFloat4Float4Float4Float4(Allocation inA, Allocation inB, Allocation inC, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
         inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 4];
+        inC.copyTo(arrayInC);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
-                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inA = arrayInA[i * 4 + j];
                 args.inB = arrayInB[i * 4 + j];
+                args.inC = arrayInC[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeHypot(args, target);
+                CoreMathVerifier.computeFma(args, target);
                 // Validate the outputs.
                 boolean valid = true;
                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
@@ -299,6 +336,10 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inB, Float.floatToRawIntBits(args.inB), args.inB));
                     message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
                     message.append("\n");
@@ -309,17 +350,17 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloat4Float4Float4" +
+                    assertTrue("Incorrect output for checkFmaFloat4Float4Float4Float4" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    public void testHypot() {
-        checkHypotFloatFloatFloat();
-        checkHypotFloat2Float2Float2();
-        checkHypotFloat3Float3Float3();
-        checkHypotFloat4Float4Float4();
+    public void testFma() {
+        checkFmaFloatFloatFloatFloat();
+        checkFmaFloat2Float2Float2Float2();
+        checkFmaFloat3Float3Float3Float3();
+        checkFmaFloat4Float4Float4Float4();
     }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestFma.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFma.rs
new file mode 100644
index 0000000..b0cb2dd
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFma.rs
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocInB;
+rs_allocation gAllocInC;
+
+float __attribute__((kernel)) testFmaFloatFloatFloatFloat(float inA, unsigned int x) {
+    float inB = rsGetElementAt_float(gAllocInB, x);
+    float inC = rsGetElementAt_float(gAllocInC, x);
+    return fma(inA, inB, inC);
+}
+
+float2 __attribute__((kernel)) testFmaFloat2Float2Float2Float2(float2 inA, unsigned int x) {
+    float2 inB = rsGetElementAt_float2(gAllocInB, x);
+    float2 inC = rsGetElementAt_float2(gAllocInC, x);
+    return fma(inA, inB, inC);
+}
+
+float3 __attribute__((kernel)) testFmaFloat3Float3Float3Float3(float3 inA, unsigned int x) {
+    float3 inB = rsGetElementAt_float3(gAllocInB, x);
+    float3 inC = rsGetElementAt_float3(gAllocInC, x);
+    return fma(inA, inB, inC);
+}
+
+float4 __attribute__((kernel)) testFmaFloat4Float4Float4Float4(float4 inA, unsigned int x) {
+    float4 inB = rsGetElementAt_float4(gAllocInB, x);
+    float4 inC = rsGetElementAt_float4(gAllocInC, x);
+    return fma(inA, inB, inC);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFmaRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFmaRelaxed.rs
index 6660366..cc80e06 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFmaRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFma.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmax.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFmax.java
similarity index 69%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmax.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFmax.java
index abe0c9e..7d4e633 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmax.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFmax.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestFmax extends RSBaseCompute {
+public class TestFmax extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestFmax script;
-    private ScriptC_GeneratedTestFmaxRelaxed scriptRelaxed;
+    private ScriptC_TestFmax script;
+    private ScriptC_TestFmaxRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestFmax(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFmaxRelaxed(mRS);
+        script = new ScriptC_TestFmax(mRS);
+        scriptRelaxed = new ScriptC_TestFmaxRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inA;
-        public float inB;
+        public float inX;
+        public float inY;
         public Target.Floaty out;
     }
 
     private void checkFmaxFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe6ec75a46e6fdd7al, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe6ec75a46e6fdd7bl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe6ec75a46e6fdd91l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe6ec75a46e6fdd92l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFmaxFloatFloatFloat(inA, out);
-            verifyResultsFmaxFloatFloatFloat(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFmaxFloatFloatFloat(inX, out);
+            verifyResultsFmaxFloatFloatFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFmaxFloatFloatFloat(inA, out);
-            verifyResultsFmaxFloatFloatFloat(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFmaxFloatFloatFloat(inX, out);
+            verifyResultsFmaxFloatFloatFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsFmaxFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFmaxFloatFloatFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmax(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkFmaxFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa99eaa6dd458a0c8l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa99eaa6dd458a0c9l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa99eaa6dd458a0dfl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa99eaa6dd458a0e0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFmaxFloat2Float2Float2(inA, out);
-            verifyResultsFmaxFloat2Float2Float2(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFmaxFloat2Float2Float2(inX, out);
+            verifyResultsFmaxFloat2Float2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFmaxFloat2Float2Float2(inA, out);
-            verifyResultsFmaxFloat2Float2Float2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFmaxFloat2Float2Float2(inX, out);
+            verifyResultsFmaxFloat2Float2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsFmaxFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFmaxFloat2Float2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmax(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkFmaxFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfe03888dd636a269l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfe03888dd636a26al, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfe03888dd636a280l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfe03888dd636a281l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFmaxFloat3Float3Float3(inA, out);
-            verifyResultsFmaxFloat3Float3Float3(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFmaxFloat3Float3Float3(inX, out);
+            verifyResultsFmaxFloat3Float3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFmaxFloat3Float3Float3(inA, out);
-            verifyResultsFmaxFloat3Float3Float3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFmaxFloat3Float3Float3(inX, out);
+            verifyResultsFmaxFloat3Float3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsFmaxFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFmaxFloat3Float3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmax(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkFmaxFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x526866add814a40al, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x526866add814a40bl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x526866add814a421l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x526866add814a422l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFmaxFloat4Float4Float4(inA, out);
-            verifyResultsFmaxFloat4Float4Float4(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFmaxFloat4Float4Float4(inX, out);
+            verifyResultsFmaxFloat4Float4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFmaxFloat4Float4Float4(inA, out);
-            verifyResultsFmaxFloat4Float4Float4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFmaxFloat4Float4Float4(inX, out);
+            verifyResultsFmaxFloat4Float4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsFmaxFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFmaxFloat4Float4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmax(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -317,39 +317,39 @@
     }
 
     private void checkFmaxFloat2FloatFloat2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xce5ddc06dc631102l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xce5ddc06dc631103l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xce5ddc06dc631119l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xce5ddc06dc63111al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFmaxFloat2FloatFloat2(inA, out);
-            verifyResultsFmaxFloat2FloatFloat2(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFmaxFloat2FloatFloat2(inX, out);
+            verifyResultsFmaxFloat2FloatFloat2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat2FloatFloat2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFmaxFloat2FloatFloat2(inA, out);
-            verifyResultsFmaxFloat2FloatFloat2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFmaxFloat2FloatFloat2(inX, out);
+            verifyResultsFmaxFloat2FloatFloat2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat2FloatFloat2: " + e.toString());
         }
     }
 
-    private void verifyResultsFmaxFloat2FloatFloat2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFmaxFloat2FloatFloat2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmax(args, target);
@@ -360,13 +360,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -386,39 +386,39 @@
     }
 
     private void checkFmaxFloat3FloatFloat3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x23ad8f1ecace055el, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x23ad8f1ecace055fl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x23ad8f1ecace0575l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x23ad8f1ecace0576l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFmaxFloat3FloatFloat3(inA, out);
-            verifyResultsFmaxFloat3FloatFloat3(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFmaxFloat3FloatFloat3(inX, out);
+            verifyResultsFmaxFloat3FloatFloat3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat3FloatFloat3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFmaxFloat3FloatFloat3(inA, out);
-            verifyResultsFmaxFloat3FloatFloat3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFmaxFloat3FloatFloat3(inX, out);
+            verifyResultsFmaxFloat3FloatFloat3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat3FloatFloat3: " + e.toString());
         }
     }
 
-    private void verifyResultsFmaxFloat3FloatFloat3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFmaxFloat3FloatFloat3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmax(args, target);
@@ -429,13 +429,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -455,39 +455,39 @@
     }
 
     private void checkFmaxFloat4FloatFloat4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x78fd4236b938f9bal, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x78fd4236b938f9bbl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x78fd4236b938f9d1l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x78fd4236b938f9d2l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFmaxFloat4FloatFloat4(inA, out);
-            verifyResultsFmaxFloat4FloatFloat4(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFmaxFloat4FloatFloat4(inX, out);
+            verifyResultsFmaxFloat4FloatFloat4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat4FloatFloat4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFmaxFloat4FloatFloat4(inA, out);
-            verifyResultsFmaxFloat4FloatFloat4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFmaxFloat4FloatFloat4(inX, out);
+            verifyResultsFmaxFloat4FloatFloat4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmaxFloat4FloatFloat4: " + e.toString());
         }
     }
 
-    private void verifyResultsFmaxFloat4FloatFloat4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFmaxFloat4FloatFloat4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmax(args, target);
@@ -498,13 +498,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmax.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFmax.rs
similarity index 60%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmax.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFmax.rs
index 59eb2bd..50e5e3f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmax.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFmax.rs
@@ -19,39 +19,39 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInB;
+rs_allocation gAllocInY;
 
-float __attribute__((kernel)) testFmaxFloatFloatFloat(float inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return fmax(inA, inB);
+float __attribute__((kernel)) testFmaxFloatFloatFloat(float inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return fmax(inX, inY);
 }
 
-float2 __attribute__((kernel)) testFmaxFloat2Float2Float2(float2 inA, unsigned int x) {
-    float2 inB = rsGetElementAt_float2(gAllocInB, x);
-    return fmax(inA, inB);
+float2 __attribute__((kernel)) testFmaxFloat2Float2Float2(float2 inX, unsigned int x) {
+    float2 inY = rsGetElementAt_float2(gAllocInY, x);
+    return fmax(inX, inY);
 }
 
-float3 __attribute__((kernel)) testFmaxFloat3Float3Float3(float3 inA, unsigned int x) {
-    float3 inB = rsGetElementAt_float3(gAllocInB, x);
-    return fmax(inA, inB);
+float3 __attribute__((kernel)) testFmaxFloat3Float3Float3(float3 inX, unsigned int x) {
+    float3 inY = rsGetElementAt_float3(gAllocInY, x);
+    return fmax(inX, inY);
 }
 
-float4 __attribute__((kernel)) testFmaxFloat4Float4Float4(float4 inA, unsigned int x) {
-    float4 inB = rsGetElementAt_float4(gAllocInB, x);
-    return fmax(inA, inB);
+float4 __attribute__((kernel)) testFmaxFloat4Float4Float4(float4 inX, unsigned int x) {
+    float4 inY = rsGetElementAt_float4(gAllocInY, x);
+    return fmax(inX, inY);
 }
 
-float2 __attribute__((kernel)) testFmaxFloat2FloatFloat2(float2 inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return fmax(inA, inB);
+float2 __attribute__((kernel)) testFmaxFloat2FloatFloat2(float2 inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return fmax(inX, inY);
 }
 
-float3 __attribute__((kernel)) testFmaxFloat3FloatFloat3(float3 inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return fmax(inA, inB);
+float3 __attribute__((kernel)) testFmaxFloat3FloatFloat3(float3 inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return fmax(inX, inY);
 }
 
-float4 __attribute__((kernel)) testFmaxFloat4FloatFloat4(float4 inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return fmax(inA, inB);
+float4 __attribute__((kernel)) testFmaxFloat4FloatFloat4(float4 inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return fmax(inX, inY);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFmaxRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFmaxRelaxed.rs
index 6660366..74c8b3d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFmaxRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFmax.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmin.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFmin.java
similarity index 69%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmin.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFmin.java
index 8183585..f206a74 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFmin.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestFmin extends RSBaseCompute {
+public class TestFmin extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestFmin script;
-    private ScriptC_GeneratedTestFminRelaxed scriptRelaxed;
+    private ScriptC_TestFmin script;
+    private ScriptC_TestFminRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestFmin(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFminRelaxed(mRS);
+        script = new ScriptC_TestFmin(mRS);
+        scriptRelaxed = new ScriptC_TestFminRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inA;
-        public float inB;
+        public float inX;
+        public float inY;
         public Target.Floaty out;
     }
 
     private void checkFminFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7b46a8451d7b1058l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7b46a8451d7b1059l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7b46a8451d7b106fl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7b46a8451d7b1070l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFminFloatFloatFloat(inA, out);
-            verifyResultsFminFloatFloatFloat(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFminFloatFloatFloat(inX, out);
+            verifyResultsFminFloatFloatFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFminFloatFloatFloat(inA, out);
-            verifyResultsFminFloatFloatFloat(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFminFloatFloatFloat(inX, out);
+            verifyResultsFminFloatFloatFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsFminFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFminFloatFloatFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmin(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkFminFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x12b850a9e75faa42l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x12b850a9e75faa43l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x12b850a9e75faa59l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x12b850a9e75faa5al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFminFloat2Float2Float2(inA, out);
-            verifyResultsFminFloat2Float2Float2(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFminFloat2Float2Float2(inX, out);
+            verifyResultsFminFloat2Float2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFminFloat2Float2Float2(inA, out);
-            verifyResultsFminFloat2Float2Float2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFminFloat2Float2Float2(inX, out);
+            verifyResultsFminFloat2Float2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsFminFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFminFloat2Float2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmin(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkFminFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x671d2ec9e93dabe3l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x671d2ec9e93dabe4l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x671d2ec9e93dabfal, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x671d2ec9e93dabfbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFminFloat3Float3Float3(inA, out);
-            verifyResultsFminFloat3Float3Float3(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFminFloat3Float3Float3(inX, out);
+            verifyResultsFminFloat3Float3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFminFloat3Float3Float3(inA, out);
-            verifyResultsFminFloat3Float3Float3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFminFloat3Float3Float3(inX, out);
+            verifyResultsFminFloat3Float3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsFminFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFminFloat3Float3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmin(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkFminFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbb820ce9eb1bad84l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbb820ce9eb1bad85l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbb820ce9eb1bad9bl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbb820ce9eb1bad9cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFminFloat4Float4Float4(inA, out);
-            verifyResultsFminFloat4Float4Float4(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFminFloat4Float4Float4(inX, out);
+            verifyResultsFminFloat4Float4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFminFloat4Float4Float4(inA, out);
-            verifyResultsFminFloat4Float4Float4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFminFloat4Float4Float4(inX, out);
+            verifyResultsFminFloat4Float4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsFminFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFminFloat4Float4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmin(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -317,39 +317,39 @@
     }
 
     private void checkFminFloat2FloatFloat2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4dd5869724457670l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4dd5869724457671l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4dd5869724457687l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4dd5869724457688l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFminFloat2FloatFloat2(inA, out);
-            verifyResultsFminFloat2FloatFloat2(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFminFloat2FloatFloat2(inX, out);
+            verifyResultsFminFloat2FloatFloat2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat2FloatFloat2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFminFloat2FloatFloat2(inA, out);
-            verifyResultsFminFloat2FloatFloat2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFminFloat2FloatFloat2(inX, out);
+            verifyResultsFminFloat2FloatFloat2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat2FloatFloat2: " + e.toString());
         }
     }
 
-    private void verifyResultsFminFloat2FloatFloat2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFminFloat2FloatFloat2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmin(args, target);
@@ -360,13 +360,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -386,39 +386,39 @@
     }
 
     private void checkFminFloat3FloatFloat3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xa32539af12b06accl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa32539af12b06acdl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xa32539af12b06ae3l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa32539af12b06ae4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFminFloat3FloatFloat3(inA, out);
-            verifyResultsFminFloat3FloatFloat3(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFminFloat3FloatFloat3(inX, out);
+            verifyResultsFminFloat3FloatFloat3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat3FloatFloat3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFminFloat3FloatFloat3(inA, out);
-            verifyResultsFminFloat3FloatFloat3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFminFloat3FloatFloat3(inX, out);
+            verifyResultsFminFloat3FloatFloat3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat3FloatFloat3: " + e.toString());
         }
     }
 
-    private void verifyResultsFminFloat3FloatFloat3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFminFloat3FloatFloat3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmin(args, target);
@@ -429,13 +429,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -455,39 +455,39 @@
     }
 
     private void checkFminFloat4FloatFloat4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf874ecc7011b5f28l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf874ecc7011b5f29l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf874ecc7011b5f3fl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf874ecc7011b5f40l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testFminFloat4FloatFloat4(inA, out);
-            verifyResultsFminFloat4FloatFloat4(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFminFloat4FloatFloat4(inX, out);
+            verifyResultsFminFloat4FloatFloat4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat4FloatFloat4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testFminFloat4FloatFloat4(inA, out);
-            verifyResultsFminFloat4FloatFloat4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFminFloat4FloatFloat4(inX, out);
+            verifyResultsFminFloat4FloatFloat4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFminFloat4FloatFloat4: " + e.toString());
         }
     }
 
-    private void verifyResultsFminFloat4FloatFloat4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsFminFloat4FloatFloat4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmin(args, target);
@@ -498,13 +498,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmin.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFmin.rs
similarity index 60%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmin.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFmin.rs
index 0846051..28db18f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmin.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFmin.rs
@@ -19,39 +19,39 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInB;
+rs_allocation gAllocInY;
 
-float __attribute__((kernel)) testFminFloatFloatFloat(float inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return fmin(inA, inB);
+float __attribute__((kernel)) testFminFloatFloatFloat(float inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return fmin(inX, inY);
 }
 
-float2 __attribute__((kernel)) testFminFloat2Float2Float2(float2 inA, unsigned int x) {
-    float2 inB = rsGetElementAt_float2(gAllocInB, x);
-    return fmin(inA, inB);
+float2 __attribute__((kernel)) testFminFloat2Float2Float2(float2 inX, unsigned int x) {
+    float2 inY = rsGetElementAt_float2(gAllocInY, x);
+    return fmin(inX, inY);
 }
 
-float3 __attribute__((kernel)) testFminFloat3Float3Float3(float3 inA, unsigned int x) {
-    float3 inB = rsGetElementAt_float3(gAllocInB, x);
-    return fmin(inA, inB);
+float3 __attribute__((kernel)) testFminFloat3Float3Float3(float3 inX, unsigned int x) {
+    float3 inY = rsGetElementAt_float3(gAllocInY, x);
+    return fmin(inX, inY);
 }
 
-float4 __attribute__((kernel)) testFminFloat4Float4Float4(float4 inA, unsigned int x) {
-    float4 inB = rsGetElementAt_float4(gAllocInB, x);
-    return fmin(inA, inB);
+float4 __attribute__((kernel)) testFminFloat4Float4Float4(float4 inX, unsigned int x) {
+    float4 inY = rsGetElementAt_float4(gAllocInY, x);
+    return fmin(inX, inY);
 }
 
-float2 __attribute__((kernel)) testFminFloat2FloatFloat2(float2 inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return fmin(inA, inB);
+float2 __attribute__((kernel)) testFminFloat2FloatFloat2(float2 inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return fmin(inX, inY);
 }
 
-float3 __attribute__((kernel)) testFminFloat3FloatFloat3(float3 inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return fmin(inA, inB);
+float3 __attribute__((kernel)) testFminFloat3FloatFloat3(float3 inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return fmin(inX, inY);
 }
 
-float4 __attribute__((kernel)) testFminFloat4FloatFloat4(float4 inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return fmin(inA, inB);
+float4 __attribute__((kernel)) testFminFloat4FloatFloat4(float4 inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return fmin(inX, inY);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFminRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFminRelaxed.rs
index 6660366..571f64a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFminRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFmin.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmod.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFmod.java
similarity index 64%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmod.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFmod.java
index 0096e27..7bd59ef 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFmod.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFmod.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestFmod extends RSBaseCompute {
+public class TestFmod extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestFmod script;
-    private ScriptC_GeneratedTestFmodRelaxed scriptRelaxed;
+    private ScriptC_TestFmod script;
+    private ScriptC_TestFmodRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestFmod(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFmodRelaxed(mRS);
+        script = new ScriptC_TestFmod(mRS);
+        scriptRelaxed = new ScriptC_TestFmodRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inNumerator;
-        public float inDenominator;
+        public float inX;
+        public float inY;
         public Target.Floaty out;
     }
 
     private void checkFmodFloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xed70b65ddcc790e8l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xeff8dc0a04b044e1l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x51ab5ae4481379a7l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x51ab5ae4481379a8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testFmodFloatFloatFloat(inNumerator, out);
-            verifyResultsFmodFloatFloatFloat(inNumerator, inDenominator, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFmodFloatFloatFloat(inX, out);
+            verifyResultsFmodFloatFloatFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmodFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testFmodFloatFloatFloat(inNumerator, out);
-            verifyResultsFmodFloatFloatFloat(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFmodFloatFloatFloat(inX, out);
+            verifyResultsFmodFloatFloatFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmodFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsFmodFloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 1];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 1];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsFmodFloatFloatFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i];
-                args.inDenominator = arrayInDenominator[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmod(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkFmodFloat2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x84bcef91ebd95a82l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb582050adc295e2bl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1ed79fa3ec4de581l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1ed79fa3ec4de582l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testFmodFloat2Float2Float2(inNumerator, out);
-            verifyResultsFmodFloat2Float2Float2(inNumerator, inDenominator, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFmodFloat2Float2Float2(inX, out);
+            verifyResultsFmodFloat2Float2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmodFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testFmodFloat2Float2Float2(inNumerator, out);
-            verifyResultsFmodFloat2Float2Float2(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFmodFloat2Float2Float2(inX, out);
+            verifyResultsFmodFloat2Float2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmodFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsFmodFloat2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 2];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 2];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsFmodFloat2Float2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 2 + j];
-                args.inDenominator = arrayInDenominator[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmod(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkFmodFloat3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x604b98cb8ea54683l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7ee64653af04f164l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x733c7dc3ee2be722l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x733c7dc3ee2be723l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testFmodFloat3Float3Float3(inNumerator, out);
-            verifyResultsFmodFloat3Float3Float3(inNumerator, inDenominator, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFmodFloat3Float3Float3(inX, out);
+            verifyResultsFmodFloat3Float3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmodFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testFmodFloat3Float3Float3(inNumerator, out);
-            verifyResultsFmodFloat3Float3Float3(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFmodFloat3Float3Float3(inX, out);
+            verifyResultsFmodFloat3Float3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmodFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsFmodFloat3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsFmodFloat3Float3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmod(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkFmodFloat4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3bda420531713284l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x484a879c81e0849dl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc7a15be3f009e8c3l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc7a15be3f009e8c4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testFmodFloat4Float4Float4(inNumerator, out);
-            verifyResultsFmodFloat4Float4Float4(inNumerator, inDenominator, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testFmodFloat4Float4Float4(inX, out);
+            verifyResultsFmodFloat4Float4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmodFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testFmodFloat4Float4Float4(inNumerator, out);
-            verifyResultsFmodFloat4Float4Float4(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testFmodFloat4Float4Float4(inX, out);
+            verifyResultsFmodFloat4Float4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFmodFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsFmodFloat4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsFmodFloat4Float4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeFmod(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestFmod.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFmod.rs
new file mode 100644
index 0000000..c1c2bff
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFmod.rs
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocInY;
+
+float __attribute__((kernel)) testFmodFloatFloatFloat(float inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return fmod(inX, inY);
+}
+
+float2 __attribute__((kernel)) testFmodFloat2Float2Float2(float2 inX, unsigned int x) {
+    float2 inY = rsGetElementAt_float2(gAllocInY, x);
+    return fmod(inX, inY);
+}
+
+float3 __attribute__((kernel)) testFmodFloat3Float3Float3(float3 inX, unsigned int x) {
+    float3 inY = rsGetElementAt_float3(gAllocInY, x);
+    return fmod(inX, inY);
+}
+
+float4 __attribute__((kernel)) testFmodFloat4Float4Float4(float4 inX, unsigned int x) {
+    float4 inY = rsGetElementAt_float4(gAllocInY, x);
+    return fmod(inX, inY);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFmodRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFmodRelaxed.rs
index 6660366..02888a1 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFmodRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFmod.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFract.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFract.java
similarity index 98%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFract.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFract.java
index 0367b05..891ad96 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFract.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFract.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestFract extends RSBaseCompute {
+public class TestFract extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestFract script;
-    private ScriptC_GeneratedTestFractRelaxed scriptRelaxed;
+    private ScriptC_TestFract script;
+    private ScriptC_TestFractRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestFract(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFractRelaxed(mRS);
+        script = new ScriptC_TestFract(mRS);
+        scriptRelaxed = new ScriptC_TestFractRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFract.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFract.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFract.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFract.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFractRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFractRelaxed.rs
index 6660366..c9a98df 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFractRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFract.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFrexp.java b/tests/tests/renderscript/src/android/renderscript/cts/TestFrexp.java
similarity index 73%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFrexp.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFrexp.java
index 47e400d..7258d3c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFrexp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFrexp.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestFrexp extends RSBaseCompute {
+public class TestFrexp extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestFrexp script;
-    private ScriptC_GeneratedTestFrexpRelaxed scriptRelaxed;
+    private ScriptC_TestFrexp script;
+    private ScriptC_TestFrexpRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestFrexp(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestFrexpRelaxed(mRS);
+        script = new ScriptC_TestFrexp(mRS);
+        scriptRelaxed = new ScriptC_TestFrexpRelaxed(mRS);
     }
 
     public class ArgumentsFloatIntFloat {
         public float inV;
-        public int outExponent;
+        public int outIptr;
         public Target.Floaty out;
     }
 
     private void checkFrexpFloatIntFloat() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x57ae9fe07384e56dl, false);
         try {
-            Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
+            Allocation outIptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocOutExponent(outExponent);
+            script.set_gAllocOutIptr(outIptr);
             script.forEach_testFrexpFloatIntFloat(inV, out);
-            verifyResultsFrexpFloatIntFloat(inV, outExponent, out, false);
+            verifyResultsFrexpFloatIntFloat(inV, outIptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFrexpFloatIntFloat: " + e.toString());
         }
         try {
-            Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
+            Allocation outIptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutExponent(outExponent);
+            scriptRelaxed.set_gAllocOutIptr(outIptr);
             scriptRelaxed.forEach_testFrexpFloatIntFloat(inV, out);
-            verifyResultsFrexpFloatIntFloat(inV, outExponent, out, true);
+            verifyResultsFrexpFloatIntFloat(inV, outIptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFrexpFloatIntFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsFrexpFloatIntFloat(Allocation inV, Allocation outExponent, Allocation out, boolean relaxed) {
+    private void verifyResultsFrexpFloatIntFloat(Allocation inV, Allocation outIptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
         inV.copyTo(arrayInV);
-        int[] arrayOutExponent = new int[INPUTSIZE * 1];
-        outExponent.copyTo(arrayOutExponent);
+        int[] arrayOutIptr = new int[INPUTSIZE * 1];
+        outIptr.copyTo(arrayOutIptr);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -79,7 +79,7 @@
                 CoreMathVerifier.computeFrexp(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (args.outExponent != arrayOutExponent[i * 1 + j]) {
+                if (args.outIptr != arrayOutIptr[i * 1 + j]) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 1 + j])) {
@@ -91,12 +91,12 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outExponent: ");
-                    message.append(String.format("%d", args.outExponent));
+                    message.append("Expected output outIptr: ");
+                    message.append(String.format("%d", args.outIptr));
                     message.append("\n");
-                    message.append("Actual   output outExponent: ");
-                    message.append(String.format("%d", arrayOutExponent[i * 1 + j]));
-                    if (args.outExponent != arrayOutExponent[i * 1 + j]) {
+                    message.append("Actual   output outIptr: ");
+                    message.append(String.format("%d", arrayOutIptr[i * 1 + j]));
+                    if (args.outIptr != arrayOutIptr[i * 1 + j]) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -120,30 +120,30 @@
     private void checkFrexpFloat2Int2Float2() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x544e0a688fe7701l, false);
         try {
-            Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
+            Allocation outIptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocOutExponent(outExponent);
+            script.set_gAllocOutIptr(outIptr);
             script.forEach_testFrexpFloat2Int2Float2(inV, out);
-            verifyResultsFrexpFloat2Int2Float2(inV, outExponent, out, false);
+            verifyResultsFrexpFloat2Int2Float2(inV, outIptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFrexpFloat2Int2Float2: " + e.toString());
         }
         try {
-            Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
+            Allocation outIptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutExponent(outExponent);
+            scriptRelaxed.set_gAllocOutIptr(outIptr);
             scriptRelaxed.forEach_testFrexpFloat2Int2Float2(inV, out);
-            verifyResultsFrexpFloat2Int2Float2(inV, outExponent, out, true);
+            verifyResultsFrexpFloat2Int2Float2(inV, outIptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFrexpFloat2Int2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsFrexpFloat2Int2Float2(Allocation inV, Allocation outExponent, Allocation out, boolean relaxed) {
+    private void verifyResultsFrexpFloat2Int2Float2(Allocation inV, Allocation outIptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
         inV.copyTo(arrayInV);
-        int[] arrayOutExponent = new int[INPUTSIZE * 2];
-        outExponent.copyTo(arrayOutExponent);
+        int[] arrayOutIptr = new int[INPUTSIZE * 2];
+        outIptr.copyTo(arrayOutIptr);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -156,7 +156,7 @@
                 CoreMathVerifier.computeFrexp(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (args.outExponent != arrayOutExponent[i * 2 + j]) {
+                if (args.outIptr != arrayOutIptr[i * 2 + j]) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
@@ -168,12 +168,12 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outExponent: ");
-                    message.append(String.format("%d", args.outExponent));
+                    message.append("Expected output outIptr: ");
+                    message.append(String.format("%d", args.outIptr));
                     message.append("\n");
-                    message.append("Actual   output outExponent: ");
-                    message.append(String.format("%d", arrayOutExponent[i * 2 + j]));
-                    if (args.outExponent != arrayOutExponent[i * 2 + j]) {
+                    message.append("Actual   output outIptr: ");
+                    message.append(String.format("%d", arrayOutIptr[i * 2 + j]));
+                    if (args.outIptr != arrayOutIptr[i * 2 + j]) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -197,30 +197,30 @@
     private void checkFrexpFloat3Int3Float3() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2afb1f097eb0e3bal, false);
         try {
-            Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
+            Allocation outIptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocOutExponent(outExponent);
+            script.set_gAllocOutIptr(outIptr);
             script.forEach_testFrexpFloat3Int3Float3(inV, out);
-            verifyResultsFrexpFloat3Int3Float3(inV, outExponent, out, false);
+            verifyResultsFrexpFloat3Int3Float3(inV, outIptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFrexpFloat3Int3Float3: " + e.toString());
         }
         try {
-            Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
+            Allocation outIptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutExponent(outExponent);
+            scriptRelaxed.set_gAllocOutIptr(outIptr);
             scriptRelaxed.forEach_testFrexpFloat3Int3Float3(inV, out);
-            verifyResultsFrexpFloat3Int3Float3(inV, outExponent, out, true);
+            verifyResultsFrexpFloat3Int3Float3(inV, outIptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFrexpFloat3Int3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsFrexpFloat3Int3Float3(Allocation inV, Allocation outExponent, Allocation out, boolean relaxed) {
+    private void verifyResultsFrexpFloat3Int3Float3(Allocation inV, Allocation outIptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
         inV.copyTo(arrayInV);
-        int[] arrayOutExponent = new int[INPUTSIZE * 4];
-        outExponent.copyTo(arrayOutExponent);
+        int[] arrayOutIptr = new int[INPUTSIZE * 4];
+        outIptr.copyTo(arrayOutIptr);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -233,7 +233,7 @@
                 CoreMathVerifier.computeFrexp(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (args.outExponent != arrayOutExponent[i * 4 + j]) {
+                if (args.outIptr != arrayOutIptr[i * 4 + j]) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
@@ -245,12 +245,12 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outExponent: ");
-                    message.append(String.format("%d", args.outExponent));
+                    message.append("Expected output outIptr: ");
+                    message.append(String.format("%d", args.outIptr));
                     message.append("\n");
-                    message.append("Actual   output outExponent: ");
-                    message.append(String.format("%d", arrayOutExponent[i * 4 + j]));
-                    if (args.outExponent != arrayOutExponent[i * 4 + j]) {
+                    message.append("Actual   output outIptr: ");
+                    message.append(String.format("%d", arrayOutIptr[i * 4 + j]));
+                    if (args.outIptr != arrayOutIptr[i * 4 + j]) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -274,30 +274,30 @@
     private void checkFrexpFloat4Int4Float4() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x50b15d6c74635073l, false);
         try {
-            Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
+            Allocation outIptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocOutExponent(outExponent);
+            script.set_gAllocOutIptr(outIptr);
             script.forEach_testFrexpFloat4Int4Float4(inV, out);
-            verifyResultsFrexpFloat4Int4Float4(inV, outExponent, out, false);
+            verifyResultsFrexpFloat4Int4Float4(inV, outIptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFrexpFloat4Int4Float4: " + e.toString());
         }
         try {
-            Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
+            Allocation outIptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutExponent(outExponent);
+            scriptRelaxed.set_gAllocOutIptr(outIptr);
             scriptRelaxed.forEach_testFrexpFloat4Int4Float4(inV, out);
-            verifyResultsFrexpFloat4Int4Float4(inV, outExponent, out, true);
+            verifyResultsFrexpFloat4Int4Float4(inV, outIptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testFrexpFloat4Int4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsFrexpFloat4Int4Float4(Allocation inV, Allocation outExponent, Allocation out, boolean relaxed) {
+    private void verifyResultsFrexpFloat4Int4Float4(Allocation inV, Allocation outIptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
         inV.copyTo(arrayInV);
-        int[] arrayOutExponent = new int[INPUTSIZE * 4];
-        outExponent.copyTo(arrayOutExponent);
+        int[] arrayOutIptr = new int[INPUTSIZE * 4];
+        outIptr.copyTo(arrayOutIptr);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -310,7 +310,7 @@
                 CoreMathVerifier.computeFrexp(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (args.outExponent != arrayOutExponent[i * 4 + j]) {
+                if (args.outIptr != arrayOutIptr[i * 4 + j]) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
@@ -322,12 +322,12 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outExponent: ");
-                    message.append(String.format("%d", args.outExponent));
+                    message.append("Expected output outIptr: ");
+                    message.append(String.format("%d", args.outIptr));
                     message.append("\n");
-                    message.append("Actual   output outExponent: ");
-                    message.append(String.format("%d", arrayOutExponent[i * 4 + j]));
-                    if (args.outExponent != arrayOutExponent[i * 4 + j]) {
+                    message.append("Actual   output outIptr: ");
+                    message.append(String.format("%d", arrayOutIptr[i * 4 + j]));
+                    if (args.outIptr != arrayOutIptr[i * 4 + j]) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFrexp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFrexp.rs
similarity index 68%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFrexp.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestFrexp.rs
index 7193fe6..70c6c13 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFrexp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFrexp.rs
@@ -19,32 +19,32 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocOutExponent;
+rs_allocation gAllocOutIptr;
 
 float __attribute__((kernel)) testFrexpFloatIntFloat(float inV, unsigned int x) {
-    int outExponent = 0;
-    float out = frexp(inV, &outExponent);
-    rsSetElementAt_int(gAllocOutExponent, outExponent, x);
+    int outIptr = 0;
+    float out = frexp(inV, &outIptr);
+    rsSetElementAt_int(gAllocOutIptr, outIptr, x);
     return out;
 }
 
 float2 __attribute__((kernel)) testFrexpFloat2Int2Float2(float2 inV, unsigned int x) {
-    int2 outExponent = 0;
-    float2 out = frexp(inV, &outExponent);
-    rsSetElementAt_int2(gAllocOutExponent, outExponent, x);
+    int2 outIptr = 0;
+    float2 out = frexp(inV, &outIptr);
+    rsSetElementAt_int2(gAllocOutIptr, outIptr, x);
     return out;
 }
 
 float3 __attribute__((kernel)) testFrexpFloat3Int3Float3(float3 inV, unsigned int x) {
-    int3 outExponent = 0;
-    float3 out = frexp(inV, &outExponent);
-    rsSetElementAt_int3(gAllocOutExponent, outExponent, x);
+    int3 outIptr = 0;
+    float3 out = frexp(inV, &outIptr);
+    rsSetElementAt_int3(gAllocOutIptr, outIptr, x);
     return out;
 }
 
 float4 __attribute__((kernel)) testFrexpFloat4Int4Float4(float4 inV, unsigned int x) {
-    int4 outExponent = 0;
-    float4 out = frexp(inV, &outExponent);
-    rsSetElementAt_int4(gAllocOutExponent, outExponent, x);
+    int4 outIptr = 0;
+    float4 out = frexp(inV, &outIptr);
+    rsSetElementAt_int4(gAllocOutIptr, outIptr, x);
     return out;
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestFrexpRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestFrexpRelaxed.rs
index 6660366..8dc4c4d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestFrexpRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestFrexp.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRecip.java b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfRecip.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRecip.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestHalfRecip.java
index 5648d96..8d4f1b7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRecip.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfRecip.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestHalfRecip extends RSBaseCompute {
+public class TestHalfRecip extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestHalfRecip script;
-    private ScriptC_GeneratedTestHalfRecipRelaxed scriptRelaxed;
+    private ScriptC_TestHalfRecip script;
+    private ScriptC_TestHalfRecipRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestHalfRecip(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestHalfRecipRelaxed(mRS);
+        script = new ScriptC_TestHalfRecip(mRS);
+        scriptRelaxed = new ScriptC_TestHalfRecipRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRecip.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfRecip.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRecip.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestHalfRecip.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfRecipRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestHalfRecipRelaxed.rs
index 6660366..da453fa 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfRecipRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestHalfRecip.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRsqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfRsqrt.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRsqrt.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestHalfRsqrt.java
index ac3a7d9..5cd4e90 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRsqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfRsqrt.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestHalfRsqrt extends RSBaseCompute {
+public class TestHalfRsqrt extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestHalfRsqrt script;
-    private ScriptC_GeneratedTestHalfRsqrtRelaxed scriptRelaxed;
+    private ScriptC_TestHalfRsqrt script;
+    private ScriptC_TestHalfRsqrtRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestHalfRsqrt(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestHalfRsqrtRelaxed(mRS);
+        script = new ScriptC_TestHalfRsqrt(mRS);
+        scriptRelaxed = new ScriptC_TestHalfRsqrtRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRsqrt.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfRsqrt.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfRsqrt.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestHalfRsqrt.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfRsqrtRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestHalfRsqrtRelaxed.rs
index 6660366..4f94200 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfRsqrtRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestHalfRsqrt.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfSqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfSqrt.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfSqrt.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestHalfSqrt.java
index ee7ae11..b57291d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfSqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfSqrt.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestHalfSqrt extends RSBaseCompute {
+public class TestHalfSqrt extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestHalfSqrt script;
-    private ScriptC_GeneratedTestHalfSqrtRelaxed scriptRelaxed;
+    private ScriptC_TestHalfSqrt script;
+    private ScriptC_TestHalfSqrtRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestHalfSqrt(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestHalfSqrtRelaxed(mRS);
+        script = new ScriptC_TestHalfSqrt(mRS);
+        scriptRelaxed = new ScriptC_TestHalfSqrtRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfSqrt.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfSqrt.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHalfSqrt.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestHalfSqrt.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfSqrtRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestHalfSqrtRelaxed.rs
index 6660366..46b979d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestHalfSqrtRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestHalfSqrt.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.java b/tests/tests/renderscript/src/android/renderscript/cts/TestHypot.java
similarity index 70%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestHypot.java
index 006562f..8aecdcd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestHypot.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestHypot extends RSBaseCompute {
+public class TestHypot extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestHypot script;
-    private ScriptC_GeneratedTestHypotRelaxed scriptRelaxed;
+    private ScriptC_TestHypot script;
+    private ScriptC_TestHypotRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestHypot(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestHypotRelaxed(mRS);
+        script = new ScriptC_TestHypot(mRS);
+        scriptRelaxed = new ScriptC_TestHypotRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inA;
-        public float inB;
+        public float inX;
+        public float inY;
         public Target.Floaty out;
     }
 
     private void checkHypotFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7deb65e7738c74c4l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7deb65e7738c74c5l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7deb65e7738c74dbl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7deb65e7738c74dcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testHypotFloatFloatFloat(inA, out);
-            verifyResultsHypotFloatFloatFloat(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testHypotFloatFloatFloat(inX, out);
+            verifyResultsHypotFloatFloatFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloatFloatFloat(inA, out);
-            verifyResultsHypotFloatFloatFloat(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testHypotFloatFloatFloat(inX, out);
+            verifyResultsHypotFloatFloatFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsHypotFloatFloatFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeHypot(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkHypotFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x14f3c91a62f71c46l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x14f3c91a62f71c47l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x14f3c91a62f71c5dl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x14f3c91a62f71c5el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testHypotFloat2Float2Float2(inA, out);
-            verifyResultsHypotFloat2Float2Float2(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testHypotFloat2Float2Float2(inX, out);
+            verifyResultsHypotFloat2Float2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloat2Float2Float2(inA, out);
-            verifyResultsHypotFloat2Float2Float2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testHypotFloat2Float2Float2(inX, out);
+            verifyResultsHypotFloat2Float2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsHypotFloat2Float2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeHypot(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkHypotFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6958a73a64d51de7l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6958a73a64d51de8l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6958a73a64d51dfel, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6958a73a64d51dffl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testHypotFloat3Float3Float3(inA, out);
-            verifyResultsHypotFloat3Float3Float3(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testHypotFloat3Float3Float3(inX, out);
+            verifyResultsHypotFloat3Float3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloat3Float3Float3(inA, out);
-            verifyResultsHypotFloat3Float3Float3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testHypotFloat3Float3Float3(inX, out);
+            verifyResultsHypotFloat3Float3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsHypotFloat3Float3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeHypot(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkHypotFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbdbd855a66b31f88l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbdbd855a66b31f89l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbdbd855a66b31f9fl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbdbd855a66b31fa0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testHypotFloat4Float4Float4(inA, out);
-            verifyResultsHypotFloat4Float4Float4(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testHypotFloat4Float4Float4(inX, out);
+            verifyResultsHypotFloat4Float4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloat4Float4Float4(inA, out);
-            verifyResultsHypotFloat4Float4Float4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testHypotFloat4Float4Float4(inX, out);
+            verifyResultsHypotFloat4Float4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsHypotFloat4Float4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeHypot(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestHypot.rs
similarity index 67%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestHypot.rs
index 655344c..9425121 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestHypot.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInB;
+rs_allocation gAllocInY;
 
-float __attribute__((kernel)) testHypotFloatFloatFloat(float inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return hypot(inA, inB);
+float __attribute__((kernel)) testHypotFloatFloatFloat(float inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return hypot(inX, inY);
 }
 
-float2 __attribute__((kernel)) testHypotFloat2Float2Float2(float2 inA, unsigned int x) {
-    float2 inB = rsGetElementAt_float2(gAllocInB, x);
-    return hypot(inA, inB);
+float2 __attribute__((kernel)) testHypotFloat2Float2Float2(float2 inX, unsigned int x) {
+    float2 inY = rsGetElementAt_float2(gAllocInY, x);
+    return hypot(inX, inY);
 }
 
-float3 __attribute__((kernel)) testHypotFloat3Float3Float3(float3 inA, unsigned int x) {
-    float3 inB = rsGetElementAt_float3(gAllocInB, x);
-    return hypot(inA, inB);
+float3 __attribute__((kernel)) testHypotFloat3Float3Float3(float3 inX, unsigned int x) {
+    float3 inY = rsGetElementAt_float3(gAllocInY, x);
+    return hypot(inX, inY);
 }
 
-float4 __attribute__((kernel)) testHypotFloat4Float4Float4(float4 inA, unsigned int x) {
-    float4 inB = rsGetElementAt_float4(gAllocInB, x);
-    return hypot(inA, inB);
+float4 __attribute__((kernel)) testHypotFloat4Float4Float4(float4 inX, unsigned int x) {
+    float4 inY = rsGetElementAt_float4(gAllocInY, x);
+    return hypot(inX, inY);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestHypotRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestHypotRelaxed.rs
index 6660366..15d02f3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestHypotRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestHypot.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestIlogb.java b/tests/tests/renderscript/src/android/renderscript/cts/TestIlogb.java
similarity index 72%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestIlogb.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestIlogb.java
index dd72973..9bac16f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestIlogb.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestIlogb.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestIlogb extends RSBaseCompute {
+public class TestIlogb extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestIlogb script;
-    private ScriptC_GeneratedTestIlogbRelaxed scriptRelaxed;
+    private ScriptC_TestIlogb script;
+    private ScriptC_TestIlogbRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestIlogb(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestIlogbRelaxed(mRS);
+        script = new ScriptC_TestIlogb(mRS);
+        scriptRelaxed = new ScriptC_TestIlogbRelaxed(mRS);
     }
 
     public class ArgumentsFloatInt {
-        public float inV;
+        public float in;
         public int out;
     }
 
     private void checkIlogbFloatInt() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6103ca4b5664967bl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc0c48da27f084aefl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
-            script.forEach_testIlogbFloatInt(inV, out);
-            verifyResultsIlogbFloatInt(inV, out, false);
+            script.forEach_testIlogbFloatInt(in, out);
+            verifyResultsIlogbFloatInt(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testIlogbFloatInt: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testIlogbFloatInt(inV, out);
-            verifyResultsIlogbFloatInt(inV, out, true);
+            scriptRelaxed.forEach_testIlogbFloatInt(in, out);
+            verifyResultsIlogbFloatInt(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testIlogbFloatInt: " + e.toString());
         }
     }
 
-    private void verifyResultsIlogbFloatInt(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsIlogbFloatInt(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         int[] arrayOut = new int[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatInt args = new ArgumentsFloatInt();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Extract the outputs.
                 args.out = arrayOut[i * 1 + j];
                 // Ask the CoreMathVerifier to validate.
@@ -74,9 +74,9 @@
                 boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Output out: ");
                     message.append(String.format("%d", args.out));
@@ -90,33 +90,33 @@
     }
 
     private void checkIlogbFloat2Int2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb460143cb6f32a61l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4ba2fa846382ada1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
-            script.forEach_testIlogbFloat2Int2(inV, out);
-            verifyResultsIlogbFloat2Int2(inV, out, false);
+            script.forEach_testIlogbFloat2Int2(in, out);
+            verifyResultsIlogbFloat2Int2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testIlogbFloat2Int2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testIlogbFloat2Int2(inV, out);
-            verifyResultsIlogbFloat2Int2(inV, out, true);
+            scriptRelaxed.forEach_testIlogbFloat2Int2(in, out);
+            verifyResultsIlogbFloat2Int2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testIlogbFloat2Int2: " + e.toString());
         }
     }
 
-    private void verifyResultsIlogbFloat2Int2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsIlogbFloat2Int2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         int[] arrayOut = new int[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatInt args = new ArgumentsFloatInt();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Extract the outputs.
                 args.out = arrayOut[i * 2 + j];
                 // Ask the CoreMathVerifier to validate.
@@ -124,9 +124,9 @@
                 boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Output out: ");
                     message.append(String.format("%d", args.out));
@@ -140,33 +140,33 @@
     }
 
     private void checkIlogbFloat3Int3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb460147c009b3a97l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4ba2fa85dc4b0d43l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
-            script.forEach_testIlogbFloat3Int3(inV, out);
-            verifyResultsIlogbFloat3Int3(inV, out, false);
+            script.forEach_testIlogbFloat3Int3(in, out);
+            verifyResultsIlogbFloat3Int3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testIlogbFloat3Int3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testIlogbFloat3Int3(inV, out);
-            verifyResultsIlogbFloat3Int3(inV, out, true);
+            scriptRelaxed.forEach_testIlogbFloat3Int3(in, out);
+            verifyResultsIlogbFloat3Int3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testIlogbFloat3Int3: " + e.toString());
         }
     }
 
-    private void verifyResultsIlogbFloat3Int3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsIlogbFloat3Int3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatInt args = new ArgumentsFloatInt();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Extract the outputs.
                 args.out = arrayOut[i * 4 + j];
                 // Ask the CoreMathVerifier to validate.
@@ -174,9 +174,9 @@
                 boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Output out: ");
                     message.append(String.format("%d", args.out));
@@ -190,33 +190,33 @@
     }
 
     private void checkIlogbFloat4Int4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb46014bb4a434acdl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4ba2fa8755136ce5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
-            script.forEach_testIlogbFloat4Int4(inV, out);
-            verifyResultsIlogbFloat4Int4(inV, out, false);
+            script.forEach_testIlogbFloat4Int4(in, out);
+            verifyResultsIlogbFloat4Int4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testIlogbFloat4Int4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testIlogbFloat4Int4(inV, out);
-            verifyResultsIlogbFloat4Int4(inV, out, true);
+            scriptRelaxed.forEach_testIlogbFloat4Int4(in, out);
+            verifyResultsIlogbFloat4Int4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testIlogbFloat4Int4: " + e.toString());
         }
     }
 
-    private void verifyResultsIlogbFloat4Int4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsIlogbFloat4Int4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatInt args = new ArgumentsFloatInt();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Extract the outputs.
                 args.out = arrayOut[i * 4 + j];
                 // Ask the CoreMathVerifier to validate.
@@ -224,9 +224,9 @@
                 boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Output out: ");
                     message.append(String.format("%d", args.out));
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestIlogb.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestIlogb.rs
index d7e22fa..d9d62ed 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestIlogb.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+int __attribute__((kernel)) testIlogbFloatInt(float in) {
+    return ilogb(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+int2 __attribute__((kernel)) testIlogbFloat2Int2(float2 in) {
+    return ilogb(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+int3 __attribute__((kernel)) testIlogbFloat3Int3(float3 in) {
+    return ilogb(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+int4 __attribute__((kernel)) testIlogbFloat4Int4(float4 in) {
+    return ilogb(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestIlogbRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestIlogbRelaxed.rs
index 6660366..6a60e53 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestIlogbRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestIlogb.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLdexp.java b/tests/tests/renderscript/src/android/renderscript/cts/TestLdexp.java
similarity index 65%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLdexp.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestLdexp.java
index 6ac13b7..3f3aee9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLdexp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLdexp.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestLdexp extends RSBaseCompute {
+public class TestLdexp extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestLdexp script;
-    private ScriptC_GeneratedTestLdexpRelaxed scriptRelaxed;
+    private ScriptC_TestLdexp script;
+    private ScriptC_TestLdexpRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestLdexp(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestLdexpRelaxed(mRS);
+        script = new ScriptC_TestLdexp(mRS);
+        scriptRelaxed = new ScriptC_TestLdexpRelaxed(mRS);
     }
 
     public class ArgumentsFloatIntFloat {
-        public float inMantissa;
-        public int inExponent;
+        public float inX;
+        public int inY;
         public Target.Floaty out;
     }
 
     private void checkLdexpFloatIntFloat() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdffd225490f0e26fl, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xdffd207c2e4133c4l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdeada0999238fe8bl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xdeada0999238fe8cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testLdexpFloatIntFloat(inMantissa, out);
-            verifyResultsLdexpFloatIntFloat(inMantissa, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testLdexpFloatIntFloat(inX, out);
+            verifyResultsLdexpFloatIntFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloatIntFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testLdexpFloatIntFloat(inMantissa, out);
-            verifyResultsLdexpFloatIntFloat(inMantissa, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testLdexpFloatIntFloat(inX, out);
+            verifyResultsLdexpFloatIntFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloatIntFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsLdexpFloatIntFloat(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInMantissa = new float[INPUTSIZE * 1];
-        inMantissa.copyTo(arrayInMantissa);
-        int[] arrayInExponent = new int[INPUTSIZE * 1];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsLdexpFloatIntFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        int[] arrayInY = new int[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inMantissa = arrayInMantissa[i];
-                args.inExponent = arrayInExponent[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLdexp(args, target);
@@ -84,12 +84,12 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMantissa, Float.floatToRawIntBits(args.inMantissa), args.inMantissa));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
-                    message.append(String.format("%d", args.inExponent));
+                    message.append("Input inY: ");
+                    message.append(String.format("%d", args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -109,39 +109,39 @@
     }
 
     private void checkLdexpFloat2Int2Float2() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7d0b1a44fe92893l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x7d0afcbed3979e8l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x5492762140d0ca17l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x5492762140d0ca18l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testLdexpFloat2Int2Float2(inMantissa, out);
-            verifyResultsLdexpFloat2Int2Float2(inMantissa, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testLdexpFloat2Int2Float2(inX, out);
+            verifyResultsLdexpFloat2Int2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat2Int2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testLdexpFloat2Int2Float2(inMantissa, out);
-            verifyResultsLdexpFloat2Int2Float2(inMantissa, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testLdexpFloat2Int2Float2(inX, out);
+            verifyResultsLdexpFloat2Int2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat2Int2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsLdexpFloat2Int2Float2(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInMantissa = new float[INPUTSIZE * 2];
-        inMantissa.copyTo(arrayInMantissa);
-        int[] arrayInExponent = new int[INPUTSIZE * 2];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsLdexpFloat2Int2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        int[] arrayInY = new int[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inMantissa = arrayInMantissa[i * 2 + j];
-                args.inExponent = arrayInExponent[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLdexp(args, target);
@@ -152,12 +152,12 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMantissa, Float.floatToRawIntBits(args.inMantissa), args.inMantissa));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
-                    message.append(String.format("%d", args.inExponent));
+                    message.append("Input inY: ");
+                    message.append(String.format("%d", args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -177,39 +177,39 @@
     }
 
     private void checkLdexpFloat3Int3Float3() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xa8e041253fa3335el, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xa8e03f4cdcf384b3l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7a48b484368336d0l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x7a48b484368336d1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testLdexpFloat3Int3Float3(inMantissa, out);
-            verifyResultsLdexpFloat3Int3Float3(inMantissa, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testLdexpFloat3Int3Float3(inX, out);
+            verifyResultsLdexpFloat3Int3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat3Int3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testLdexpFloat3Int3Float3(inMantissa, out);
-            verifyResultsLdexpFloat3Int3Float3(inMantissa, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testLdexpFloat3Int3Float3(inX, out);
+            verifyResultsLdexpFloat3Int3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat3Int3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsLdexpFloat3Int3Float3(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInMantissa = new float[INPUTSIZE * 4];
-        inMantissa.copyTo(arrayInMantissa);
-        int[] arrayInExponent = new int[INPUTSIZE * 4];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsLdexpFloat3Int3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        int[] arrayInY = new int[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inMantissa = arrayInMantissa[i * 4 + j];
-                args.inExponent = arrayInExponent[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLdexp(args, target);
@@ -220,12 +220,12 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMantissa, Float.floatToRawIntBits(args.inMantissa), args.inMantissa));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
-                    message.append(String.format("%d", args.inExponent));
+                    message.append("Input inY: ");
+                    message.append(String.format("%d", args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -245,39 +245,39 @@
     }
 
     private void checkLdexpFloat4Int4Float4() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x49efd0a62f5d3e29l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x49efcecdccad8f7el, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x9ffef2e72c35a389l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x9ffef2e72c35a38al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testLdexpFloat4Int4Float4(inMantissa, out);
-            verifyResultsLdexpFloat4Int4Float4(inMantissa, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testLdexpFloat4Int4Float4(inX, out);
+            verifyResultsLdexpFloat4Int4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat4Int4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testLdexpFloat4Int4Float4(inMantissa, out);
-            verifyResultsLdexpFloat4Int4Float4(inMantissa, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testLdexpFloat4Int4Float4(inX, out);
+            verifyResultsLdexpFloat4Int4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat4Int4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsLdexpFloat4Int4Float4(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInMantissa = new float[INPUTSIZE * 4];
-        inMantissa.copyTo(arrayInMantissa);
-        int[] arrayInExponent = new int[INPUTSIZE * 4];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsLdexpFloat4Int4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        int[] arrayInY = new int[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inMantissa = arrayInMantissa[i * 4 + j];
-                args.inExponent = arrayInExponent[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLdexp(args, target);
@@ -288,12 +288,12 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMantissa, Float.floatToRawIntBits(args.inMantissa), args.inMantissa));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
-                    message.append(String.format("%d", args.inExponent));
+                    message.append("Input inY: ");
+                    message.append(String.format("%d", args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -313,39 +313,39 @@
     }
 
     private void checkLdexpFloat2IntFloat2() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6a72b89838bd38d1l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x6a72b6bfd60d8a26l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa2b6e0c39777b8c1l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xa2b6e0c39777b8c2l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testLdexpFloat2IntFloat2(inMantissa, out);
-            verifyResultsLdexpFloat2IntFloat2(inMantissa, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testLdexpFloat2IntFloat2(inX, out);
+            verifyResultsLdexpFloat2IntFloat2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat2IntFloat2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testLdexpFloat2IntFloat2(inMantissa, out);
-            verifyResultsLdexpFloat2IntFloat2(inMantissa, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testLdexpFloat2IntFloat2(inX, out);
+            verifyResultsLdexpFloat2IntFloat2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat2IntFloat2: " + e.toString());
         }
     }
 
-    private void verifyResultsLdexpFloat2IntFloat2(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInMantissa = new float[INPUTSIZE * 2];
-        inMantissa.copyTo(arrayInMantissa);
-        int[] arrayInExponent = new int[INPUTSIZE * 1];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsLdexpFloat2IntFloat2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        int[] arrayInY = new int[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inMantissa = arrayInMantissa[i * 2 + j];
-                args.inExponent = arrayInExponent[i];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLdexp(args, target);
@@ -356,12 +356,12 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMantissa, Float.floatToRawIntBits(args.inMantissa), args.inMantissa));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
-                    message.append(String.format("%d", args.inExponent));
+                    message.append("Input inY: ");
+                    message.append(String.format("%d", args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -381,39 +381,39 @@
     }
 
     private void checkLdexpFloat3IntFloat3() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x49ba40205150f83dl, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x49ba3e47eea14992l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xcd4401424a114a65l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xcd4401424a114a66l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testLdexpFloat3IntFloat3(inMantissa, out);
-            verifyResultsLdexpFloat3IntFloat3(inMantissa, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testLdexpFloat3IntFloat3(inX, out);
+            verifyResultsLdexpFloat3IntFloat3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat3IntFloat3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testLdexpFloat3IntFloat3(inMantissa, out);
-            verifyResultsLdexpFloat3IntFloat3(inMantissa, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testLdexpFloat3IntFloat3(inX, out);
+            verifyResultsLdexpFloat3IntFloat3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat3IntFloat3: " + e.toString());
         }
     }
 
-    private void verifyResultsLdexpFloat3IntFloat3(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInMantissa = new float[INPUTSIZE * 4];
-        inMantissa.copyTo(arrayInMantissa);
-        int[] arrayInExponent = new int[INPUTSIZE * 1];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsLdexpFloat3IntFloat3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        int[] arrayInY = new int[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inMantissa = arrayInMantissa[i * 4 + j];
-                args.inExponent = arrayInExponent[i];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLdexp(args, target);
@@ -424,12 +424,12 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMantissa, Float.floatToRawIntBits(args.inMantissa), args.inMantissa));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
-                    message.append(String.format("%d", args.inExponent));
+                    message.append("Input inY: ");
+                    message.append(String.format("%d", args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -449,39 +449,39 @@
     }
 
     private void checkLdexpFloat4IntFloat4() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2901c7a869e4b7a9l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x2901c5d0073508fel, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf7d121c0fcaadc09l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xf7d121c0fcaadc0al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testLdexpFloat4IntFloat4(inMantissa, out);
-            verifyResultsLdexpFloat4IntFloat4(inMantissa, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testLdexpFloat4IntFloat4(inX, out);
+            verifyResultsLdexpFloat4IntFloat4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat4IntFloat4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testLdexpFloat4IntFloat4(inMantissa, out);
-            verifyResultsLdexpFloat4IntFloat4(inMantissa, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testLdexpFloat4IntFloat4(inX, out);
+            verifyResultsLdexpFloat4IntFloat4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLdexpFloat4IntFloat4: " + e.toString());
         }
     }
 
-    private void verifyResultsLdexpFloat4IntFloat4(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInMantissa = new float[INPUTSIZE * 4];
-        inMantissa.copyTo(arrayInMantissa);
-        int[] arrayInExponent = new int[INPUTSIZE * 1];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsLdexpFloat4IntFloat4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        int[] arrayInY = new int[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inMantissa = arrayInMantissa[i * 4 + j];
-                args.inExponent = arrayInExponent[i];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLdexp(args, target);
@@ -492,12 +492,12 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inMantissa, Float.floatToRawIntBits(args.inMantissa), args.inMantissa));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
-                    message.append(String.format("%d", args.inExponent));
+                    message.append("Input inY: ");
+                    message.append(String.format("%d", args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestLdexp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLdexp.rs
new file mode 100644
index 0000000..e8b05f2
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLdexp.rs
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocInY;
+
+float __attribute__((kernel)) testLdexpFloatIntFloat(float inX, unsigned int x) {
+    int inY = rsGetElementAt_int(gAllocInY, x);
+    return ldexp(inX, inY);
+}
+
+float2 __attribute__((kernel)) testLdexpFloat2Int2Float2(float2 inX, unsigned int x) {
+    int2 inY = rsGetElementAt_int2(gAllocInY, x);
+    return ldexp(inX, inY);
+}
+
+float3 __attribute__((kernel)) testLdexpFloat3Int3Float3(float3 inX, unsigned int x) {
+    int3 inY = rsGetElementAt_int3(gAllocInY, x);
+    return ldexp(inX, inY);
+}
+
+float4 __attribute__((kernel)) testLdexpFloat4Int4Float4(float4 inX, unsigned int x) {
+    int4 inY = rsGetElementAt_int4(gAllocInY, x);
+    return ldexp(inX, inY);
+}
+
+float2 __attribute__((kernel)) testLdexpFloat2IntFloat2(float2 inX, unsigned int x) {
+    int inY = rsGetElementAt_int(gAllocInY, x);
+    return ldexp(inX, inY);
+}
+
+float3 __attribute__((kernel)) testLdexpFloat3IntFloat3(float3 inX, unsigned int x) {
+    int inY = rsGetElementAt_int(gAllocInY, x);
+    return ldexp(inX, inY);
+}
+
+float4 __attribute__((kernel)) testLdexpFloat4IntFloat4(float4 inX, unsigned int x) {
+    int inY = rsGetElementAt_int(gAllocInY, x);
+    return ldexp(inX, inY);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLdexpRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLdexpRelaxed.rs
index 6660366..ee9f5cf 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLdexpRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestLdexp.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLength.java b/tests/tests/renderscript/src/android/renderscript/cts/TestLength.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLength.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestLength.java
index 30a9ed5..2d89536 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLength.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLength.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestLength extends RSBaseCompute {
+public class TestLength extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestLength script;
-    private ScriptC_GeneratedTestLengthRelaxed scriptRelaxed;
+    private ScriptC_TestLength script;
+    private ScriptC_TestLengthRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestLength(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestLengthRelaxed(mRS);
+        script = new ScriptC_TestLength(mRS);
+        scriptRelaxed = new ScriptC_TestLengthRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLength.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLength.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLength.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestLength.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLengthRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLengthRelaxed.rs
index 6660366..12eba8b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLengthRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestLength.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLgamma.java b/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.java
similarity index 67%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLgamma.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.java
index 773b92a..113df19 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLgamma.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestLgamma extends RSBaseCompute {
+public class TestLgamma extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestLgamma script;
-    private ScriptC_GeneratedTestLgammaRelaxed scriptRelaxed;
+    private ScriptC_TestLgamma script;
+    private ScriptC_TestLgammaRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestLgamma(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestLgammaRelaxed(mRS);
+        script = new ScriptC_TestLgamma(mRS);
+        scriptRelaxed = new ScriptC_TestLgammaRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkLgammaFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd9395583050bc4bel, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe748c67429cab138l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testLgammaFloatFloat(inV, out);
-            verifyResultsLgammaFloatFloat(inV, out, false);
+            script.forEach_testLgammaFloatFloat(in, out);
+            verifyResultsLgammaFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testLgammaFloatFloat(inV, out);
-            verifyResultsLgammaFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testLgammaFloatFloat(in, out);
+            verifyResultsLgammaFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsLgammaFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLgammaFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLgamma(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkLgammaFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xeef55496367a4132l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7ca07efd8a327894l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testLgammaFloat2Float2(inV, out);
-            verifyResultsLgammaFloat2Float2(inV, out, false);
+            script.forEach_testLgammaFloat2Float2(in, out);
+            verifyResultsLgammaFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testLgammaFloat2Float2(inV, out);
-            verifyResultsLgammaFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testLgammaFloat2Float2(in, out);
+            verifyResultsLgammaFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsLgammaFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLgammaFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLgamma(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkLgammaFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xeef71db12c956210l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7ca0899ee9390e2el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testLgammaFloat3Float3(inV, out);
-            verifyResultsLgammaFloat3Float3(inV, out, false);
+            script.forEach_testLgammaFloat3Float3(in, out);
+            verifyResultsLgammaFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testLgammaFloat3Float3(inV, out);
-            verifyResultsLgammaFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testLgammaFloat3Float3(in, out);
+            verifyResultsLgammaFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsLgammaFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLgammaFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLgamma(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkLgammaFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xeef8e6cc22b082eel, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7ca09440483fa3c8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testLgammaFloat4Float4(inV, out);
-            verifyResultsLgammaFloat4Float4(inV, out, false);
+            script.forEach_testLgammaFloat4Float4(in, out);
+            verifyResultsLgammaFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testLgammaFloat4Float4(inV, out);
-            verifyResultsLgammaFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testLgammaFloat4Float4(in, out);
+            verifyResultsLgammaFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsLgammaFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLgammaFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLgamma(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -276,47 +276,47 @@
     }
 
     public class ArgumentsFloatIntFloat {
-        public float inV;
-        public int outSignOfGamma;
+        public float inX;
+        public int outY;
         public float out;
     }
 
     private void checkLgammaFloatIntFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2a62d992979c4bb7l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2a62d992979c4bb9l, false);
         try {
-            Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
+            Allocation outY = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocOutSignOfGamma(outSignOfGamma);
-            script.forEach_testLgammaFloatIntFloat(inV, out);
-            verifyResultsLgammaFloatIntFloat(inV, outSignOfGamma, out, false);
+            script.set_gAllocOutY(outY);
+            script.forEach_testLgammaFloatIntFloat(inX, out);
+            verifyResultsLgammaFloatIntFloat(inX, outY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloatIntFloat: " + e.toString());
         }
         try {
-            Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
+            Allocation outY = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutSignOfGamma(outSignOfGamma);
-            scriptRelaxed.forEach_testLgammaFloatIntFloat(inV, out);
-            verifyResultsLgammaFloatIntFloat(inV, outSignOfGamma, out, true);
+            scriptRelaxed.set_gAllocOutY(outY);
+            scriptRelaxed.forEach_testLgammaFloatIntFloat(inX, out);
+            verifyResultsLgammaFloatIntFloat(inX, outY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloatIntFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsLgammaFloatIntFloat(Allocation inV, Allocation outSignOfGamma, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
-        int[] arrayOutSignOfGamma = new int[INPUTSIZE * 1];
-        outSignOfGamma.copyTo(arrayOutSignOfGamma);
+    private void verifyResultsLgammaFloatIntFloat(Allocation inX, Allocation outY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        int[] arrayOutY = new int[INPUTSIZE * 1];
+        outY.copyTo(arrayOutY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inV = arrayInV[i];
+                args.inX = arrayInX[i];
                 // Extract the outputs.
-                args.outSignOfGamma = arrayOutSignOfGamma[i * 1 + j];
+                args.outY = arrayOutY[i * 1 + j];
                 args.out = arrayOut[i * 1 + j];
                 // Ask the CoreMathVerifier to validate.
                 Target target = new Target(relaxed);
@@ -324,12 +324,12 @@
                 boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Output outSignOfGamma: ");
-                    message.append(String.format("%d", args.outSignOfGamma));
+                    message.append("Output outY: ");
+                    message.append(String.format("%d", args.outY));
                     message.append("\n");
                     message.append("Output out: ");
                     message.append(Float.toString(args.out));
@@ -343,41 +343,41 @@
     }
 
     private void checkLgammaFloat2Int2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x409fb9a5984bcf7fl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x409fb9a5984bcf81l, false);
         try {
-            Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
+            Allocation outY = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocOutSignOfGamma(outSignOfGamma);
-            script.forEach_testLgammaFloat2Int2Float2(inV, out);
-            verifyResultsLgammaFloat2Int2Float2(inV, outSignOfGamma, out, false);
+            script.set_gAllocOutY(outY);
+            script.forEach_testLgammaFloat2Int2Float2(inX, out);
+            verifyResultsLgammaFloat2Int2Float2(inX, outY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat2Int2Float2: " + e.toString());
         }
         try {
-            Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
+            Allocation outY = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutSignOfGamma(outSignOfGamma);
-            scriptRelaxed.forEach_testLgammaFloat2Int2Float2(inV, out);
-            verifyResultsLgammaFloat2Int2Float2(inV, outSignOfGamma, out, true);
+            scriptRelaxed.set_gAllocOutY(outY);
+            scriptRelaxed.forEach_testLgammaFloat2Int2Float2(inX, out);
+            verifyResultsLgammaFloat2Int2Float2(inX, outY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat2Int2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsLgammaFloat2Int2Float2(Allocation inV, Allocation outSignOfGamma, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
-        int[] arrayOutSignOfGamma = new int[INPUTSIZE * 2];
-        outSignOfGamma.copyTo(arrayOutSignOfGamma);
+    private void verifyResultsLgammaFloat2Int2Float2(Allocation inX, Allocation outY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        int[] arrayOutY = new int[INPUTSIZE * 2];
+        outY.copyTo(arrayOutY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
                 // Extract the outputs.
-                args.outSignOfGamma = arrayOutSignOfGamma[i * 2 + j];
+                args.outY = arrayOutY[i * 2 + j];
                 args.out = arrayOut[i * 2 + j];
                 // Ask the CoreMathVerifier to validate.
                 Target target = new Target(relaxed);
@@ -385,12 +385,12 @@
                 boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Output outSignOfGamma: ");
-                    message.append(String.format("%d", args.outSignOfGamma));
+                    message.append("Output outY: ");
+                    message.append(String.format("%d", args.outY));
                     message.append("\n");
                     message.append("Output out: ");
                     message.append(Float.toString(args.out));
@@ -404,41 +404,41 @@
     }
 
     private void checkLgammaFloat3Int3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6655f8088dfe3c38l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6655f8088dfe3c3al, false);
         try {
-            Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
+            Allocation outY = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocOutSignOfGamma(outSignOfGamma);
-            script.forEach_testLgammaFloat3Int3Float3(inV, out);
-            verifyResultsLgammaFloat3Int3Float3(inV, outSignOfGamma, out, false);
+            script.set_gAllocOutY(outY);
+            script.forEach_testLgammaFloat3Int3Float3(inX, out);
+            verifyResultsLgammaFloat3Int3Float3(inX, outY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat3Int3Float3: " + e.toString());
         }
         try {
-            Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
+            Allocation outY = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutSignOfGamma(outSignOfGamma);
-            scriptRelaxed.forEach_testLgammaFloat3Int3Float3(inV, out);
-            verifyResultsLgammaFloat3Int3Float3(inV, outSignOfGamma, out, true);
+            scriptRelaxed.set_gAllocOutY(outY);
+            scriptRelaxed.forEach_testLgammaFloat3Int3Float3(inX, out);
+            verifyResultsLgammaFloat3Int3Float3(inX, outY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat3Int3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsLgammaFloat3Int3Float3(Allocation inV, Allocation outSignOfGamma, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
-        int[] arrayOutSignOfGamma = new int[INPUTSIZE * 4];
-        outSignOfGamma.copyTo(arrayOutSignOfGamma);
+    private void verifyResultsLgammaFloat3Int3Float3(Allocation inX, Allocation outY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        int[] arrayOutY = new int[INPUTSIZE * 4];
+        outY.copyTo(arrayOutY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Extract the outputs.
-                args.outSignOfGamma = arrayOutSignOfGamma[i * 4 + j];
+                args.outY = arrayOutY[i * 4 + j];
                 args.out = arrayOut[i * 4 + j];
                 // Ask the CoreMathVerifier to validate.
                 Target target = new Target(relaxed);
@@ -446,12 +446,12 @@
                 boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Output outSignOfGamma: ");
-                    message.append(String.format("%d", args.outSignOfGamma));
+                    message.append("Output outY: ");
+                    message.append(String.format("%d", args.outY));
                     message.append("\n");
                     message.append("Output out: ");
                     message.append(Float.toString(args.out));
@@ -465,41 +465,41 @@
     }
 
     private void checkLgammaFloat4Int4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8c0c366b83b0a8f1l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8c0c366b83b0a8f3l, false);
         try {
-            Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
+            Allocation outY = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocOutSignOfGamma(outSignOfGamma);
-            script.forEach_testLgammaFloat4Int4Float4(inV, out);
-            verifyResultsLgammaFloat4Int4Float4(inV, outSignOfGamma, out, false);
+            script.set_gAllocOutY(outY);
+            script.forEach_testLgammaFloat4Int4Float4(inX, out);
+            verifyResultsLgammaFloat4Int4Float4(inX, outY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat4Int4Float4: " + e.toString());
         }
         try {
-            Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
+            Allocation outY = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutSignOfGamma(outSignOfGamma);
-            scriptRelaxed.forEach_testLgammaFloat4Int4Float4(inV, out);
-            verifyResultsLgammaFloat4Int4Float4(inV, outSignOfGamma, out, true);
+            scriptRelaxed.set_gAllocOutY(outY);
+            scriptRelaxed.forEach_testLgammaFloat4Int4Float4(inX, out);
+            verifyResultsLgammaFloat4Int4Float4(inX, outY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLgammaFloat4Int4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsLgammaFloat4Int4Float4(Allocation inV, Allocation outSignOfGamma, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
-        int[] arrayOutSignOfGamma = new int[INPUTSIZE * 4];
-        outSignOfGamma.copyTo(arrayOutSignOfGamma);
+    private void verifyResultsLgammaFloat4Int4Float4(Allocation inX, Allocation outY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        int[] arrayOutY = new int[INPUTSIZE * 4];
+        outY.copyTo(arrayOutY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Extract the outputs.
-                args.outSignOfGamma = arrayOutSignOfGamma[i * 4 + j];
+                args.outY = arrayOutY[i * 4 + j];
                 args.out = arrayOut[i * 4 + j];
                 // Ask the CoreMathVerifier to validate.
                 Target target = new Target(relaxed);
@@ -507,12 +507,12 @@
                 boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Output outSignOfGamma: ");
-                    message.append(String.format("%d", args.outSignOfGamma));
+                    message.append("Output outY: ");
+                    message.append(String.format("%d", args.outY));
                     message.append("\n");
                     message.append("Output out: ");
                     message.append(Float.toString(args.out));
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.rs
new file mode 100644
index 0000000..b39e592
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.rs
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+
+float __attribute__((kernel)) testLgammaFloatFloat(float in) {
+    return lgamma(in);
+}
+
+float2 __attribute__((kernel)) testLgammaFloat2Float2(float2 in) {
+    return lgamma(in);
+}
+
+float3 __attribute__((kernel)) testLgammaFloat3Float3(float3 in) {
+    return lgamma(in);
+}
+
+float4 __attribute__((kernel)) testLgammaFloat4Float4(float4 in) {
+    return lgamma(in);
+}
+rs_allocation gAllocOutY;
+
+float __attribute__((kernel)) testLgammaFloatIntFloat(float inX, unsigned int x) {
+    int outY = 0;
+    float out = lgamma(inX, &outY);
+    rsSetElementAt_int(gAllocOutY, outY, x);
+    return out;
+}
+
+float2 __attribute__((kernel)) testLgammaFloat2Int2Float2(float2 inX, unsigned int x) {
+    int2 outY = 0;
+    float2 out = lgamma(inX, &outY);
+    rsSetElementAt_int2(gAllocOutY, outY, x);
+    return out;
+}
+
+float3 __attribute__((kernel)) testLgammaFloat3Int3Float3(float3 inX, unsigned int x) {
+    int3 outY = 0;
+    float3 out = lgamma(inX, &outY);
+    rsSetElementAt_int3(gAllocOutY, outY, x);
+    return out;
+}
+
+float4 __attribute__((kernel)) testLgammaFloat4Int4Float4(float4 inX, unsigned int x) {
+    int4 outY = 0;
+    float4 out = lgamma(inX, &outY);
+    rsSetElementAt_int4(gAllocOutY, outY, x);
+    return out;
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLgammaRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLgammaRelaxed.rs
index 6660366..a259576 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLgammaRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestLgamma.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog.java b/tests/tests/renderscript/src/android/renderscript/cts/TestLog.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestLog.java
index cd593d3..8b4717c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLog.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestLog extends RSBaseCompute {
+public class TestLog extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestLog script;
-    private ScriptC_GeneratedTestLogRelaxed scriptRelaxed;
+    private ScriptC_TestLog script;
+    private ScriptC_TestLogRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestLog(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestLogRelaxed(mRS);
+        script = new ScriptC_TestLog(mRS);
+        scriptRelaxed = new ScriptC_TestLogRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkLogFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4176ec542a43578dl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x371a946136907325l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testLogFloatFloat(inV, out);
-            verifyResultsLogFloatFloat(inV, out, false);
+            script.forEach_testLogFloatFloat(in, out);
+            verifyResultsLogFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testLogFloatFloat(inV, out);
-            verifyResultsLogFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testLogFloatFloat(in, out);
+            verifyResultsLogFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsLogFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLogFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkLogFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd3cba12c04dd9a49l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfef8d41eca882159l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testLogFloat2Float2(inV, out);
-            verifyResultsLogFloat2Float2(inV, out, false);
+            script.forEach_testLogFloat2Float2(in, out);
+            verifyResultsLogFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testLogFloat2Float2(inV, out);
-            verifyResultsLogFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testLogFloat2Float2(in, out);
+            verifyResultsLogFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsLogFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLogFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkLogFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd3cd6a46faf8bb27l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfef8dec0298eb6f3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testLogFloat3Float3(inV, out);
-            verifyResultsLogFloat3Float3(inV, out, false);
+            script.forEach_testLogFloat3Float3(in, out);
+            verifyResultsLogFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testLogFloat3Float3(inV, out);
-            verifyResultsLogFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testLogFloat3Float3(in, out);
+            verifyResultsLogFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsLogFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLogFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkLogFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd3cf3361f113dc05l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfef8e96188954c8dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testLogFloat4Float4(inV, out);
-            verifyResultsLogFloat4Float4(inV, out, false);
+            script.forEach_testLogFloat4Float4(in, out);
+            verifyResultsLogFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testLogFloat4Float4(inV, out);
-            verifyResultsLogFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testLogFloat4Float4(in, out);
+            verifyResultsLogFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsLogFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLogFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLog.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLog.rs
index d7e22fa..4261b61 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLog.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testLogFloatFloat(float in) {
+    return log(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testLogFloat2Float2(float2 in) {
+    return log(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testLogFloat3Float3(float3 in) {
+    return log(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testLogFloat4Float4(float4 in) {
+    return log(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog10.java b/tests/tests/renderscript/src/android/renderscript/cts/TestLog10.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog10.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestLog10.java
index c3a815e..5928090 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLog10.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestLog10 extends RSBaseCompute {
+public class TestLog10 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestLog10 script;
-    private ScriptC_GeneratedTestLog10Relaxed scriptRelaxed;
+    private ScriptC_TestLog10 script;
+    private ScriptC_TestLog10Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestLog10(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestLog10Relaxed(mRS);
+        script = new ScriptC_TestLog10(mRS);
+        scriptRelaxed = new ScriptC_TestLog10Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkLog10FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xba0ecdfe3171d836l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe09b228ed779b7a0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testLog10FloatFloat(inV, out);
-            verifyResultsLog10FloatFloat(inV, out, false);
+            script.forEach_testLog10FloatFloat(in, out);
+            verifyResultsLog10FloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog10FloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testLog10FloatFloat(inV, out);
-            verifyResultsLog10FloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testLog10FloatFloat(in, out);
+            verifyResultsLog10FloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog10FloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsLog10FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog10FloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog10(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkLog10Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd4c88639e3bcdeeal, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x407bbbadff57bdbcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testLog10Float2Float2(inV, out);
-            verifyResultsLog10Float2Float2(inV, out, false);
+            script.forEach_testLog10Float2Float2(in, out);
+            verifyResultsLog10Float2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog10Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testLog10Float2Float2(inV, out);
-            verifyResultsLog10Float2Float2(inV, out, true);
+            scriptRelaxed.forEach_testLog10Float2Float2(in, out);
+            verifyResultsLog10Float2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog10Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsLog10Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog10Float2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog10(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkLog10Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd4ca4f54d9d7ffc8l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x407bc64f5e5e5356l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testLog10Float3Float3(inV, out);
-            verifyResultsLog10Float3Float3(inV, out, false);
+            script.forEach_testLog10Float3Float3(in, out);
+            verifyResultsLog10Float3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog10Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testLog10Float3Float3(inV, out);
-            verifyResultsLog10Float3Float3(inV, out, true);
+            scriptRelaxed.forEach_testLog10Float3Float3(in, out);
+            verifyResultsLog10Float3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog10Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsLog10Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog10Float3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog10(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkLog10Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd4cc186fcff320a6l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x407bd0f0bd64e8f0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testLog10Float4Float4(inV, out);
-            verifyResultsLog10Float4Float4(inV, out, false);
+            script.forEach_testLog10Float4Float4(in, out);
+            verifyResultsLog10Float4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog10Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testLog10Float4Float4(inV, out);
-            verifyResultsLog10Float4Float4(inV, out, true);
+            scriptRelaxed.forEach_testLog10Float4Float4(in, out);
+            verifyResultsLog10Float4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog10Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsLog10Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog10Float4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog10(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLog10.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLog10.rs
index d7e22fa..18fb3c3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLog10.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testLog10FloatFloat(float in) {
+    return log10(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testLog10Float2Float2(float2 in) {
+    return log10(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testLog10Float3Float3(float3 in) {
+    return log10(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testLog10Float4Float4(float4 in) {
+    return log10(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLog10Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLog10Relaxed.rs
index 6660366..c0c47f3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLog10Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestLog10.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog1p.java b/tests/tests/renderscript/src/android/renderscript/cts/TestLog1p.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog1p.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestLog1p.java
index 20d39f8..019cffb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog1p.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLog1p.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestLog1p extends RSBaseCompute {
+public class TestLog1p extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestLog1p script;
-    private ScriptC_GeneratedTestLog1pRelaxed scriptRelaxed;
+    private ScriptC_TestLog1p script;
+    private ScriptC_TestLog1pRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestLog1p(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestLog1pRelaxed(mRS);
+        script = new ScriptC_TestLog1p(mRS);
+        scriptRelaxed = new ScriptC_TestLog1pRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkLog1pFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x272c1ffe1744cef6l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x83e3423b7d907be0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testLog1pFloatFloat(inV, out);
-            verifyResultsLog1pFloatFloat(inV, out, false);
+            script.forEach_testLog1pFloatFloat(in, out);
+            verifyResultsLog1pFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog1pFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testLog1pFloatFloat(inV, out);
-            verifyResultsLog1pFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testLog1pFloatFloat(in, out);
+            verifyResultsLog1pFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog1pFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsLog1pFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog1pFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog1p(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkLog1pFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xed8dc77cd4750faal, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x946881a999c72ffcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testLog1pFloat2Float2(inV, out);
-            verifyResultsLog1pFloat2Float2(inV, out, false);
+            script.forEach_testLog1pFloat2Float2(in, out);
+            verifyResultsLog1pFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog1pFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testLog1pFloat2Float2(inV, out);
-            verifyResultsLog1pFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testLog1pFloat2Float2(in, out);
+            verifyResultsLog1pFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog1pFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsLog1pFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog1pFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog1p(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkLog1pFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xed8f9097ca903088l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x94688c4af8cdc596l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testLog1pFloat3Float3(inV, out);
-            verifyResultsLog1pFloat3Float3(inV, out, false);
+            script.forEach_testLog1pFloat3Float3(in, out);
+            verifyResultsLog1pFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog1pFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testLog1pFloat3Float3(inV, out);
-            verifyResultsLog1pFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testLog1pFloat3Float3(in, out);
+            verifyResultsLog1pFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog1pFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsLog1pFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog1pFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog1p(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkLog1pFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xed9159b2c0ab5166l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x946896ec57d45b30l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testLog1pFloat4Float4(inV, out);
-            verifyResultsLog1pFloat4Float4(inV, out, false);
+            script.forEach_testLog1pFloat4Float4(in, out);
+            verifyResultsLog1pFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog1pFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testLog1pFloat4Float4(inV, out);
-            verifyResultsLog1pFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testLog1pFloat4Float4(in, out);
+            verifyResultsLog1pFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog1pFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsLog1pFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog1pFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog1p(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLog1p.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLog1p.rs
index d7e22fa..bc5577e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLog1p.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testLog1pFloatFloat(float in) {
+    return log1p(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testLog1pFloat2Float2(float2 in) {
+    return log1p(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testLog1pFloat3Float3(float3 in) {
+    return log1p(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testLog1pFloat4Float4(float4 in) {
+    return log1p(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLog1pRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLog1pRelaxed.rs
index 6660366..3136d9e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLog1pRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestLog1p.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog2.java b/tests/tests/renderscript/src/android/renderscript/cts/TestLog2.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog2.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestLog2.java
index 850f283..92a4985 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLog2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLog2.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestLog2 extends RSBaseCompute {
+public class TestLog2 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestLog2 script;
-    private ScriptC_GeneratedTestLog2Relaxed scriptRelaxed;
+    private ScriptC_TestLog2 script;
+    private ScriptC_TestLog2Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestLog2(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestLog2Relaxed(mRS);
+        script = new ScriptC_TestLog2(mRS);
+        scriptRelaxed = new ScriptC_TestLog2Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkLog2FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9950067ec147dc6bl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x390bea9a53d34bfl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testLog2FloatFloat(inV, out);
-            verifyResultsLog2FloatFloat(inV, out, false);
+            script.forEach_testLog2FloatFloat(in, out);
+            verifyResultsLog2FloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog2FloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testLog2FloatFloat(inV, out);
-            verifyResultsLog2FloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testLog2FloatFloat(in, out);
+            verifyResultsLog2FloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog2FloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsLog2FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog2FloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog2(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkLog2Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x52d99ec8c48141b7l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc0703946284a72a3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testLog2Float2Float2(inV, out);
-            verifyResultsLog2Float2Float2(inV, out, false);
+            script.forEach_testLog2Float2Float2(in, out);
+            verifyResultsLog2Float2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testLog2Float2Float2(inV, out);
-            verifyResultsLog2Float2Float2(inV, out, true);
+            scriptRelaxed.forEach_testLog2Float2Float2(in, out);
+            verifyResultsLog2Float2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsLog2Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog2Float2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog2(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkLog2Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x52db67e3ba9c6295l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc07043e78751083dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testLog2Float3Float3(inV, out);
-            verifyResultsLog2Float3Float3(inV, out, false);
+            script.forEach_testLog2Float3Float3(in, out);
+            verifyResultsLog2Float3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog2Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testLog2Float3Float3(inV, out);
-            verifyResultsLog2Float3Float3(inV, out, true);
+            scriptRelaxed.forEach_testLog2Float3Float3(in, out);
+            verifyResultsLog2Float3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog2Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsLog2Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog2Float3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog2(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkLog2Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x52dd30feb0b78373l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc0704e88e6579dd7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testLog2Float4Float4(inV, out);
-            verifyResultsLog2Float4Float4(inV, out, false);
+            script.forEach_testLog2Float4Float4(in, out);
+            verifyResultsLog2Float4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog2Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testLog2Float4Float4(inV, out);
-            verifyResultsLog2Float4Float4(inV, out, true);
+            scriptRelaxed.forEach_testLog2Float4Float4(in, out);
+            verifyResultsLog2Float4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLog2Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsLog2Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLog2Float4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLog2(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLog2.rs
similarity index 70%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLog2.rs
index d7e22fa..4cf8ef2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLog2.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testLog2FloatFloat(float in) {
+    return log2(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testLog2Float2Float2(float2 in) {
+    return log2(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testLog2Float3Float3(float3 in) {
+    return log2(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testLog2Float4Float4(float4 in) {
+    return log2(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLog2Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLog2Relaxed.rs
index 6660366..e79f105 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLog2Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestLog2.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLogRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLogRelaxed.rs
index 6660366..3fed787 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLogRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestLog.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogb.java b/tests/tests/renderscript/src/android/renderscript/cts/TestLogb.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogb.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestLogb.java
index bf4abe0..8679aa0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestLogb.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLogb.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestLogb extends RSBaseCompute {
+public class TestLogb extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestLogb script;
-    private ScriptC_GeneratedTestLogbRelaxed scriptRelaxed;
+    private ScriptC_TestLogb script;
+    private ScriptC_TestLogbRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestLogb(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestLogbRelaxed(mRS);
+        script = new ScriptC_TestLogb(mRS);
+        scriptRelaxed = new ScriptC_TestLogbRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkLogbFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xab2603feada6157bl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfe06d66b21ce47efl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testLogbFloatFloat(inV, out);
-            verifyResultsLogbFloatFloat(inV, out, false);
+            script.forEach_testLogbFloatFloat(in, out);
+            verifyResultsLogbFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogbFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testLogbFloatFloat(inV, out);
-            verifyResultsLogbFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testLogbFloatFloat(in, out);
+            verifyResultsLogbFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogbFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsLogbFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLogbFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLogb(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkLogbFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x256d8fbaf90b6647l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbf61cdc2dc1e0853l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testLogbFloat2Float2(inV, out);
-            verifyResultsLogbFloat2Float2(inV, out, false);
+            script.forEach_testLogbFloat2Float2(in, out);
+            verifyResultsLogbFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogbFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testLogbFloat2Float2(inV, out);
-            verifyResultsLogbFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testLogbFloat2Float2(in, out);
+            verifyResultsLogbFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogbFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsLogbFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLogbFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLogb(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkLogbFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x256f58d5ef268725l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbf61d8643b249dedl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testLogbFloat3Float3(inV, out);
-            verifyResultsLogbFloat3Float3(inV, out, false);
+            script.forEach_testLogbFloat3Float3(in, out);
+            verifyResultsLogbFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogbFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testLogbFloat3Float3(inV, out);
-            verifyResultsLogbFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testLogbFloat3Float3(in, out);
+            verifyResultsLogbFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogbFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsLogbFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLogbFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLogb(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkLogbFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x257121f0e541a803l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbf61e3059a2b3387l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testLogbFloat4Float4(inV, out);
-            verifyResultsLogbFloat4Float4(inV, out, false);
+            script.forEach_testLogbFloat4Float4(in, out);
+            verifyResultsLogbFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogbFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testLogbFloat4Float4(inV, out);
-            verifyResultsLogbFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testLogbFloat4Float4(in, out);
+            verifyResultsLogbFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLogbFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsLogbFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsLogbFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeLogb(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLogb.rs
similarity index 70%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLogb.rs
index d7e22fa..8317a22 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLogb.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testLogbFloatFloat(float in) {
+    return logb(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testLogbFloat2Float2(float2 in) {
+    return logb(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testLogbFloat3Float3(float3 in) {
+    return logb(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testLogbFloat4Float4(float4 in) {
+    return logb(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestLogbRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestLogbRelaxed.rs
index 6660366..bcf84b7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLogbRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestLogb.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.java b/tests/tests/renderscript/src/android/renderscript/cts/TestMad.java
similarity index 64%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.java
copy to tests/tests/renderscript/src/android/renderscript/cts/TestMad.java
index 006562f..0ac029c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestHypot.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMad.java
@@ -22,61 +22,68 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestHypot extends RSBaseCompute {
+public class TestMad extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestHypot script;
-    private ScriptC_GeneratedTestHypotRelaxed scriptRelaxed;
+    private ScriptC_TestMad script;
+    private ScriptC_TestMadRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestHypot(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestHypotRelaxed(mRS);
+        script = new ScriptC_TestMad(mRS);
+        scriptRelaxed = new ScriptC_TestMadRelaxed(mRS);
     }
 
-    public class ArgumentsFloatFloatFloat {
+    public class ArgumentsFloatFloatFloatFloat {
         public float inA;
         public float inB;
+        public float inC;
         public Target.Floaty out;
     }
 
-    private void checkHypotFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7deb65e7738c74c4l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7deb65e7738c74c5l, false);
+    private void checkMadFloatFloatFloatFloat() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb3b9b8429c37eacl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb3b9b8429c37eadl, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb3b9b8429c37eael, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testHypotFloatFloatFloat(inA, out);
-            verifyResultsHypotFloatFloatFloat(inA, inB, out, false);
+            script.set_gAllocInC(inC);
+            script.forEach_testMadFloatFloatFloatFloat(inA, out);
+            verifyResultsMadFloatFloatFloatFloat(inA, inB, inC, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloatFloatFloat: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloatFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloatFloatFloat(inA, out);
-            verifyResultsHypotFloatFloatFloat(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.forEach_testMadFloatFloatFloatFloat(inA, out);
+            verifyResultsMadFloatFloatFloatFloat(inA, inB, inC, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloatFloatFloat: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloatFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsMadFloatFloatFloatFloat(Allocation inA, Allocation inB, Allocation inC, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 1];
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
         inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 1];
+        inC.copyTo(arrayInC);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
-                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inA = arrayInA[i];
                 args.inB = arrayInB[i];
+                args.inC = arrayInC[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeHypot(args, target);
+                CoreMathVerifier.computeMad(args, target);
                 // Validate the outputs.
                 boolean valid = true;
                 if (!args.out.couldBe(arrayOut[i * 1 + j])) {
@@ -92,6 +99,10 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inB, Float.floatToRawIntBits(args.inB), args.inB));
                     message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
                     message.append("\n");
@@ -102,50 +113,56 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloatFloatFloat" +
+                    assertTrue("Incorrect output for checkMadFloatFloatFloatFloat" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    private void checkHypotFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x14f3c91a62f71c46l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x14f3c91a62f71c47l, false);
+    private void checkMadFloat2Float2Float2Float2() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x44d6ec3d0f2030a4l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x44d6ec3d0f2030a5l, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x44d6ec3d0f2030a6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testHypotFloat2Float2Float2(inA, out);
-            verifyResultsHypotFloat2Float2Float2(inA, inB, out, false);
+            script.set_gAllocInC(inC);
+            script.forEach_testMadFloat2Float2Float2Float2(inA, out);
+            verifyResultsMadFloat2Float2Float2Float2(inA, inB, inC, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat2Float2Float2: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat2Float2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloat2Float2Float2(inA, out);
-            verifyResultsHypotFloat2Float2Float2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.forEach_testMadFloat2Float2Float2Float2(inA, out);
+            verifyResultsMadFloat2Float2Float2Float2(inA, inB, inC, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat2Float2Float2: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat2Float2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsMadFloat2Float2Float2Float2(Allocation inA, Allocation inB, Allocation inC, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 2];
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 2];
         inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 2];
+        inC.copyTo(arrayInC);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
-                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inA = arrayInA[i * 2 + j];
                 args.inB = arrayInB[i * 2 + j];
+                args.inC = arrayInC[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeHypot(args, target);
+                CoreMathVerifier.computeMad(args, target);
                 // Validate the outputs.
                 boolean valid = true;
                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
@@ -161,6 +178,10 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inB, Float.floatToRawIntBits(args.inB), args.inB));
                     message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
                     message.append("\n");
@@ -171,50 +192,56 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloat2Float2Float2" +
+                    assertTrue("Incorrect output for checkMadFloat2Float2Float2Float2" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    private void checkHypotFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6958a73a64d51de7l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6958a73a64d51de8l, false);
+    private void checkMadFloat3Float3Float3Float3() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1a508fd7e1876a40l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1a508fd7e1876a41l, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1a508fd7e1876a42l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testHypotFloat3Float3Float3(inA, out);
-            verifyResultsHypotFloat3Float3Float3(inA, inB, out, false);
+            script.set_gAllocInC(inC);
+            script.forEach_testMadFloat3Float3Float3Float3(inA, out);
+            verifyResultsMadFloat3Float3Float3Float3(inA, inB, inC, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat3Float3Float3: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat3Float3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloat3Float3Float3(inA, out);
-            verifyResultsHypotFloat3Float3Float3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.forEach_testMadFloat3Float3Float3Float3(inA, out);
+            verifyResultsMadFloat3Float3Float3Float3(inA, inB, inC, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat3Float3Float3: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat3Float3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsMadFloat3Float3Float3Float3(Allocation inA, Allocation inB, Allocation inC, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
         inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 4];
+        inC.copyTo(arrayInC);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
-                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inA = arrayInA[i * 4 + j];
                 args.inB = arrayInB[i * 4 + j];
+                args.inC = arrayInC[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeHypot(args, target);
+                CoreMathVerifier.computeMad(args, target);
                 // Validate the outputs.
                 boolean valid = true;
                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
@@ -230,6 +257,10 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inB, Float.floatToRawIntBits(args.inB), args.inB));
                     message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
                     message.append("\n");
@@ -240,50 +271,56 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloat3Float3Float3" +
+                    assertTrue("Incorrect output for checkMadFloat3Float3Float3Float3" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    private void checkHypotFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbdbd855a66b31f88l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbdbd855a66b31f89l, false);
+    private void checkMadFloat4Float4Float4Float4() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xefca3372b3eea3dcl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xefca3372b3eea3ddl, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xefca3372b3eea3del, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testHypotFloat4Float4Float4(inA, out);
-            verifyResultsHypotFloat4Float4Float4(inA, inB, out, false);
+            script.set_gAllocInC(inC);
+            script.forEach_testMadFloat4Float4Float4Float4(inA, out);
+            verifyResultsMadFloat4Float4Float4Float4(inA, inB, inC, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat4Float4Float4: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat4Float4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testHypotFloat4Float4Float4(inA, out);
-            verifyResultsHypotFloat4Float4Float4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.forEach_testMadFloat4Float4Float4Float4(inA, out);
+            verifyResultsMadFloat4Float4Float4Float4(inA, inB, inC, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testHypotFloat4Float4Float4: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMadFloat4Float4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsHypotFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsMadFloat4Float4Float4Float4(Allocation inA, Allocation inB, Allocation inC, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
         inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 4];
+        inC.copyTo(arrayInC);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
-                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inA = arrayInA[i * 4 + j];
                 args.inB = arrayInB[i * 4 + j];
+                args.inC = arrayInC[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeHypot(args, target);
+                CoreMathVerifier.computeMad(args, target);
                 // Validate the outputs.
                 boolean valid = true;
                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
@@ -299,6 +336,10 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inB, Float.floatToRawIntBits(args.inB), args.inB));
                     message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
                     message.append("\n");
@@ -309,17 +350,17 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloat4Float4Float4" +
+                    assertTrue("Incorrect output for checkMadFloat4Float4Float4Float4" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    public void testHypot() {
-        checkHypotFloatFloatFloat();
-        checkHypotFloat2Float2Float2();
-        checkHypotFloat3Float3Float3();
-        checkHypotFloat4Float4Float4();
+    public void testMad() {
+        checkMadFloatFloatFloatFloat();
+        checkMadFloat2Float2Float2Float2();
+        checkMadFloat3Float3Float3Float3();
+        checkMadFloat4Float4Float4Float4();
     }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestMad.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestMad.rs
new file mode 100644
index 0000000..bcf908b
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMad.rs
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocInB;
+rs_allocation gAllocInC;
+
+float __attribute__((kernel)) testMadFloatFloatFloatFloat(float inA, unsigned int x) {
+    float inB = rsGetElementAt_float(gAllocInB, x);
+    float inC = rsGetElementAt_float(gAllocInC, x);
+    return mad(inA, inB, inC);
+}
+
+float2 __attribute__((kernel)) testMadFloat2Float2Float2Float2(float2 inA, unsigned int x) {
+    float2 inB = rsGetElementAt_float2(gAllocInB, x);
+    float2 inC = rsGetElementAt_float2(gAllocInC, x);
+    return mad(inA, inB, inC);
+}
+
+float3 __attribute__((kernel)) testMadFloat3Float3Float3Float3(float3 inA, unsigned int x) {
+    float3 inB = rsGetElementAt_float3(gAllocInB, x);
+    float3 inC = rsGetElementAt_float3(gAllocInC, x);
+    return mad(inA, inB, inC);
+}
+
+float4 __attribute__((kernel)) testMadFloat4Float4Float4Float4(float4 inA, unsigned int x) {
+    float4 inB = rsGetElementAt_float4(gAllocInB, x);
+    float4 inC = rsGetElementAt_float4(gAllocInC, x);
+    return mad(inA, inB, inC);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestMadRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestMadRelaxed.rs
index 6660366..acec458 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMadRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestMad.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMax.java b/tests/tests/renderscript/src/android/renderscript/cts/TestMax.java
similarity index 67%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMax.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestMax.java
index 1961200..e52ef48 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMax.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMax.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestMax extends RSBaseCompute {
+public class TestMax extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestMax script;
-    private ScriptC_GeneratedTestMaxRelaxed scriptRelaxed;
+    private ScriptC_TestMax script;
+    private ScriptC_TestMaxRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestMax(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestMaxRelaxed(mRS);
+        script = new ScriptC_TestMax(mRS);
+        scriptRelaxed = new ScriptC_TestMaxRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inA;
-        public float inB;
+        public float in;
+        public float in1;
         public Target.Floaty out;
     }
 
     private void checkMaxFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2952d868c2162460l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2952d868c2162461l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfb01ed3804837dddl, false);
+        Allocation in1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2952d868c2162450l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxFloatFloatFloat(inA, out);
-            verifyResultsMaxFloatFloatFloat(inA, inB, out, false);
+            script.set_gAllocIn1(in1);
+            script.forEach_testMaxFloatFloatFloat(in, out);
+            verifyResultsMaxFloatFloatFloat(in, in1, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxFloatFloatFloat(inA, out);
-            verifyResultsMaxFloatFloatFloat(inA, inB, out, true);
+            scriptRelaxed.set_gAllocIn1(in1);
+            scriptRelaxed.forEach_testMaxFloatFloatFloat(in, out);
+            verifyResultsMaxFloatFloatFloat(in, in1, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxFloatFloatFloat(Allocation in, Allocation in1, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
+        float[] arrayIn1 = new float[INPUTSIZE * 1];
+        in1.copyTo(arrayIn1);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.in = arrayIn[i];
+                args.in1 = arrayIn1[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMax(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input in1: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.in1, Float.floatToRawIntBits(args.in1), args.in1));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkMaxFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc6031e7536addadal, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc6031e7536addadbl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x63dc5a02b9d46a4bl, false);
+        Allocation in1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc6031e7536addacal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxFloat2Float2Float2(inA, out);
-            verifyResultsMaxFloat2Float2Float2(inA, inB, out, false);
+            script.set_gAllocIn1(in1);
+            script.forEach_testMaxFloat2Float2Float2(in, out);
+            verifyResultsMaxFloat2Float2Float2(in, in1, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxFloat2Float2Float2(inA, out);
-            verifyResultsMaxFloat2Float2Float2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocIn1(in1);
+            scriptRelaxed.forEach_testMaxFloat2Float2Float2(in, out);
+            verifyResultsMaxFloat2Float2Float2(in, in1, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxFloat2Float2Float2(Allocation in, Allocation in1, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
+        float[] arrayIn1 = new float[INPUTSIZE * 2];
+        in1.copyTo(arrayIn1);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
+                args.in1 = arrayIn1[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMax(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input in1: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.in1, Float.floatToRawIntBits(args.in1), args.in1));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkMaxFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1a67fc95388bdc7bl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1a67fc95388bdc7cl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb92c17bc0744bdael, false);
+        Allocation in1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1a67fc95388bdc6bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxFloat3Float3Float3(inA, out);
-            verifyResultsMaxFloat3Float3Float3(inA, inB, out, false);
+            script.set_gAllocIn1(in1);
+            script.forEach_testMaxFloat3Float3Float3(in, out);
+            verifyResultsMaxFloat3Float3Float3(in, in1, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxFloat3Float3Float3(inA, out);
-            verifyResultsMaxFloat3Float3Float3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocIn1(in1);
+            scriptRelaxed.forEach_testMaxFloat3Float3Float3(in, out);
+            verifyResultsMaxFloat3Float3Float3(in, in1, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxFloat3Float3Float3(Allocation in, Allocation in1, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
+        float[] arrayIn1 = new float[INPUTSIZE * 4];
+        in1.copyTo(arrayIn1);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
+                args.in1 = arrayIn1[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMax(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input in1: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.in1, Float.floatToRawIntBits(args.in1), args.in1));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkMaxFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6eccdab53a69de1cl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6eccdab53a69de1dl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe7bd57554b51111l, false);
+        Allocation in1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6eccdab53a69de0cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxFloat4Float4Float4(inA, out);
-            verifyResultsMaxFloat4Float4Float4(inA, inB, out, false);
+            script.set_gAllocIn1(in1);
+            script.forEach_testMaxFloat4Float4Float4(in, out);
+            verifyResultsMaxFloat4Float4Float4(in, in1, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxFloat4Float4Float4(inA, out);
-            verifyResultsMaxFloat4Float4Float4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocIn1(in1);
+            scriptRelaxed.forEach_testMaxFloat4Float4Float4(in, out);
+            verifyResultsMaxFloat4Float4Float4(in, in1, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxFloat4Float4Float4(Allocation in, Allocation in1, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
+        float[] arrayIn1 = new float[INPUTSIZE * 4];
+        in1.copyTo(arrayIn1);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
+                args.in1 = arrayIn1[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMax(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input in1: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.in1, Float.floatToRawIntBits(args.in1), args.in1));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -317,45 +317,45 @@
     }
 
     public class ArgumentsCharCharChar {
-        public byte inA;
-        public byte inB;
+        public byte inV1;
+        public byte inV2;
         public byte out;
     }
 
     private void checkMaxCharCharChar() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x5f77cf3cb6405876l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x5f77cf3cb6405877l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x91fcf329ccedf8al, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x91fcf329ccedf8bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxCharCharChar(inA, out);
-            verifyResultsMaxCharCharChar(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxCharCharChar(inV1, out);
+            verifyResultsMaxCharCharChar(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxCharCharChar: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxCharCharChar(inA, out);
-            verifyResultsMaxCharCharChar(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxCharCharChar(inV1, out);
+            verifyResultsMaxCharCharChar(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxCharCharChar: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxCharCharChar(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxCharCharChar(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharCharChar args = new ArgumentsCharCharChar();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -365,11 +365,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -388,39 +388,39 @@
     }
 
     private void checkMaxChar2Char2Char2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x94dd090a19e42804l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x94dd090a19e42805l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x12084b25952bc64l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x12084b25952bc65l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxChar2Char2Char2(inA, out);
-            verifyResultsMaxChar2Char2Char2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxChar2Char2Char2(inV1, out);
+            verifyResultsMaxChar2Char2Char2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxChar2Char2Char2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxChar2Char2Char2(inA, out);
-            verifyResultsMaxChar2Char2Char2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxChar2Char2Char2(inV1, out);
+            verifyResultsMaxChar2Char2Char2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxChar2Char2Char2: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxChar2Char2Char2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxChar2Char2Char2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharCharChar args = new ArgumentsCharCharChar();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -430,11 +430,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -453,39 +453,39 @@
     }
 
     private void checkMaxChar3Char3Char3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xba9188f3788338d3l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xba9188f3788338d4l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x567200e53e0a8f29l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x567200e53e0a8f2al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxChar3Char3Char3(inA, out);
-            verifyResultsMaxChar3Char3Char3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxChar3Char3Char3(inV1, out);
+            verifyResultsMaxChar3Char3Char3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxChar3Char3Char3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxChar3Char3Char3(inA, out);
-            verifyResultsMaxChar3Char3Char3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxChar3Char3Char3(inV1, out);
+            verifyResultsMaxChar3Char3Char3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxChar3Char3Char3: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxChar3Char3Char3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxChar3Char3Char3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharCharChar args = new ArgumentsCharCharChar();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -495,11 +495,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -518,39 +518,39 @@
     }
 
     private void checkMaxChar4Char4Char4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xe04608dcd72249a2l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xe04608dcd72249a3l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xabc37d1822c261eel, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xabc37d1822c261efl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxChar4Char4Char4(inA, out);
-            verifyResultsMaxChar4Char4Char4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxChar4Char4Char4(inV1, out);
+            verifyResultsMaxChar4Char4Char4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxChar4Char4Char4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxChar4Char4Char4(inA, out);
-            verifyResultsMaxChar4Char4Char4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxChar4Char4Char4(inV1, out);
+            verifyResultsMaxChar4Char4Char4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxChar4Char4Char4: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxChar4Char4Char4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxChar4Char4Char4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharCharChar args = new ArgumentsCharCharChar();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -560,11 +560,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -583,45 +583,45 @@
     }
 
     public class ArgumentsUcharUcharUchar {
-        public byte inA;
-        public byte inB;
+        public byte inV1;
+        public byte inV2;
         public byte out;
     }
 
     private void checkMaxUcharUcharUchar() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x800f9948853a162dl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x800f9948853a162el, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x829ebf2e60c1bd47l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x829ebf2e60c1bd48l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUcharUcharUchar(inA, out);
-            verifyResultsMaxUcharUcharUchar(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUcharUcharUchar(inV1, out);
+            verifyResultsMaxUcharUcharUchar(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUcharUcharUchar: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUcharUcharUchar(inA, out);
-            verifyResultsMaxUcharUcharUchar(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUcharUcharUchar(inV1, out);
+            verifyResultsMaxUcharUcharUchar(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUcharUcharUchar: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUcharUcharUchar(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUcharUcharUchar(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsUcharUcharUchar args = new ArgumentsUcharUcharUchar();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -631,11 +631,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -654,39 +654,39 @@
     }
 
     private void checkMaxUchar2Uchar2Uchar2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xd31d5735b7e9a9dbl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xd31d5735b7e9a9dcl, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x75eda605e43f8b81l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x75eda605e43f8b82l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUchar2Uchar2Uchar2(inA, out);
-            verifyResultsMaxUchar2Uchar2Uchar2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUchar2Uchar2Uchar2(inV1, out);
+            verifyResultsMaxUchar2Uchar2Uchar2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUchar2Uchar2Uchar2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUchar2Uchar2Uchar2(inA, out);
-            verifyResultsMaxUchar2Uchar2Uchar2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUchar2Uchar2Uchar2(inV1, out);
+            verifyResultsMaxUchar2Uchar2Uchar2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUchar2Uchar2Uchar2: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUchar2Uchar2Uchar2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUchar2Uchar2Uchar2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsUcharUcharUchar args = new ArgumentsUcharUcharUchar();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -696,11 +696,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -719,39 +719,39 @@
     }
 
     private void checkMaxUchar3Uchar3Uchar3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x27823555b9c7ab7cl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x27823555b9c7ab7dl, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xa2def5663489d18cl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xa2def5663489d18dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUchar3Uchar3Uchar3(inA, out);
-            verifyResultsMaxUchar3Uchar3Uchar3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUchar3Uchar3Uchar3(inV1, out);
+            verifyResultsMaxUchar3Uchar3Uchar3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUchar3Uchar3Uchar3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUchar3Uchar3Uchar3(inA, out);
-            verifyResultsMaxUchar3Uchar3Uchar3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUchar3Uchar3Uchar3(inV1, out);
+            verifyResultsMaxUchar3Uchar3Uchar3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUchar3Uchar3Uchar3: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUchar3Uchar3Uchar3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUchar3Uchar3Uchar3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsUcharUcharUchar args = new ArgumentsUcharUcharUchar();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -761,11 +761,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -784,39 +784,39 @@
     }
 
     private void checkMaxUchar4Uchar4Uchar4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7be71375bba5ad1dl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7be71375bba5ad1el, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xcfd044c684d41797l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xcfd044c684d41798l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUchar4Uchar4Uchar4(inA, out);
-            verifyResultsMaxUchar4Uchar4Uchar4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUchar4Uchar4Uchar4(inV1, out);
+            verifyResultsMaxUchar4Uchar4Uchar4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUchar4Uchar4Uchar4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUchar4Uchar4Uchar4(inA, out);
-            verifyResultsMaxUchar4Uchar4Uchar4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUchar4Uchar4Uchar4(inV1, out);
+            verifyResultsMaxUchar4Uchar4Uchar4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUchar4Uchar4Uchar4: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUchar4Uchar4Uchar4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUchar4Uchar4Uchar4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsUcharUcharUchar args = new ArgumentsUcharUcharUchar();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -826,11 +826,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -849,45 +849,45 @@
     }
 
     public class ArgumentsShortShortShort {
-        public short inA;
-        public short inB;
+        public short inV1;
+        public short inV2;
         public short out;
     }
 
     private void checkMaxShortShortShort() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x920335e143b57294l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x920335e143b57295l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x868a0cd65f7a4294l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x868a0cd65f7a4295l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxShortShortShort(inA, out);
-            verifyResultsMaxShortShortShort(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxShortShortShort(inV1, out);
+            verifyResultsMaxShortShortShort(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxShortShortShort: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxShortShortShort(inA, out);
-            verifyResultsMaxShortShortShort(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxShortShortShort(inV1, out);
+            verifyResultsMaxShortShortShort(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxShortShortShort: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxShortShortShort(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxShortShortShort(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortShortShort args = new ArgumentsShortShortShort();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -897,11 +897,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -920,39 +920,39 @@
     }
 
     private void checkMaxShort2Short2Short2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x42e9d46b56ecb9del, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x42e9d46b56ecb9dfl, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x3d46ae0799c33c02l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x3d46ae0799c33c03l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxShort2Short2Short2(inA, out);
-            verifyResultsMaxShort2Short2Short2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxShort2Short2Short2(inV1, out);
+            verifyResultsMaxShort2Short2Short2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxShort2Short2Short2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxShort2Short2Short2(inA, out);
-            verifyResultsMaxShort2Short2Short2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxShort2Short2Short2(inV1, out);
+            verifyResultsMaxShort2Short2Short2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxShort2Short2Short2: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxShort2Short2Short2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxShort2Short2Short2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortShortShort args = new ArgumentsShortShortShort();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -962,11 +962,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -985,39 +985,39 @@
     }
 
     private void checkMaxShort3Short3Short3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x974eb28b58cabb7fl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x974eb28b58cabb80l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x6a37fd67ea0d820dl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x6a37fd67ea0d820el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxShort3Short3Short3(inA, out);
-            verifyResultsMaxShort3Short3Short3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxShort3Short3Short3(inV1, out);
+            verifyResultsMaxShort3Short3Short3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxShort3Short3Short3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxShort3Short3Short3(inA, out);
-            verifyResultsMaxShort3Short3Short3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxShort3Short3Short3(inV1, out);
+            verifyResultsMaxShort3Short3Short3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxShort3Short3Short3: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxShort3Short3Short3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxShort3Short3Short3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortShortShort args = new ArgumentsShortShortShort();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1027,11 +1027,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1050,39 +1050,39 @@
     }
 
     private void checkMaxShort4Short4Short4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xebb390ab5aa8bd20l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xebb390ab5aa8bd21l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x97294cc83a57c818l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x97294cc83a57c819l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxShort4Short4Short4(inA, out);
-            verifyResultsMaxShort4Short4Short4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxShort4Short4Short4(inV1, out);
+            verifyResultsMaxShort4Short4Short4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxShort4Short4Short4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxShort4Short4Short4(inA, out);
-            verifyResultsMaxShort4Short4Short4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxShort4Short4Short4(inV1, out);
+            verifyResultsMaxShort4Short4Short4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxShort4Short4Short4: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxShort4Short4Short4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxShort4Short4Short4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortShortShort args = new ArgumentsShortShortShort();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1092,11 +1092,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1115,45 +1115,45 @@
     }
 
     public class ArgumentsUshortUshortUshort {
-        public short inA;
-        public short inB;
+        public short inV1;
+        public short inV2;
         public short out;
     }
 
     private void checkMaxUshortUshortUshort() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x8f869c73b947704bl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x8f869c73b947704cl, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x1b9c47701effe051l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x1b9c47701effe052l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUshortUshortUshort(inA, out);
-            verifyResultsMaxUshortUshortUshort(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUshortUshortUshort(inV1, out);
+            verifyResultsMaxUshortUshortUshort(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUshortUshortUshort: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUshortUshortUshort(inA, out);
-            verifyResultsMaxUshortUshortUshort(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUshortUshortUshort(inV1, out);
+            verifyResultsMaxUshortUshortUshort(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUshortUshortUshort: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUshortUshortUshort(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUshortUshortUshort(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsUshortUshortUshort args = new ArgumentsUshortUshortUshort();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1163,11 +1163,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1186,39 +1186,39 @@
     }
 
     private void checkMaxUshort2Ushort2Ushort2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xbe3c50e6150b1f95l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xbe3c50e6150b1f96l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xf42196a588de51bfl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xf42196a588de51c0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUshort2Ushort2Ushort2(inA, out);
-            verifyResultsMaxUshort2Ushort2Ushort2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUshort2Ushort2Ushort2(inV1, out);
+            verifyResultsMaxUshort2Ushort2Ushort2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUshort2Ushort2Ushort2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUshort2Ushort2Ushort2(inA, out);
-            verifyResultsMaxUshort2Ushort2Ushort2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUshort2Ushort2Ushort2(inV1, out);
+            verifyResultsMaxUshort2Ushort2Ushort2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUshort2Ushort2Ushort2: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUshort2Ushort2Ushort2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUshort2Ushort2Ushort2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsUshortUshortUshort args = new ArgumentsUshortUshortUshort();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1228,11 +1228,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1251,39 +1251,39 @@
     }
 
     private void checkMaxUshort3Ushort3Ushort3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x3e2be9df5df0112cl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x3e2be9df5df0112dl, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x71604884c752e61cl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x71604884c752e61dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUshort3Ushort3Ushort3(inA, out);
-            verifyResultsMaxUshort3Ushort3Ushort3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUshort3Ushort3Ushort3(inV1, out);
+            verifyResultsMaxUshort3Ushort3Ushort3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUshort3Ushort3Ushort3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUshort3Ushort3Ushort3(inA, out);
-            verifyResultsMaxUshort3Ushort3Ushort3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUshort3Ushort3Ushort3(inV1, out);
+            verifyResultsMaxUshort3Ushort3Ushort3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUshort3Ushort3Ushort3: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUshort3Ushort3Ushort3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUshort3Ushort3Ushort3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsUshortUshortUshort args = new ArgumentsUshortUshortUshort();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1293,11 +1293,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1316,39 +1316,39 @@
     }
 
     private void checkMaxUshort4Ushort4Ushort4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xbe1b82d8a6d502c3l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xbe1b82d8a6d502c4l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xee9efa6405c77a79l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xee9efa6405c77a7al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUshort4Ushort4Ushort4(inA, out);
-            verifyResultsMaxUshort4Ushort4Ushort4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUshort4Ushort4Ushort4(inV1, out);
+            verifyResultsMaxUshort4Ushort4Ushort4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUshort4Ushort4Ushort4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUshort4Ushort4Ushort4(inA, out);
-            verifyResultsMaxUshort4Ushort4Ushort4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUshort4Ushort4Ushort4(inV1, out);
+            verifyResultsMaxUshort4Ushort4Ushort4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUshort4Ushort4Ushort4: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUshort4Ushort4Ushort4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUshort4Ushort4Ushort4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsUshortUshortUshort args = new ArgumentsUshortUshortUshort();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1358,11 +1358,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1381,45 +1381,45 @@
     }
 
     public class ArgumentsIntIntInt {
-        public int inA;
-        public int inB;
+        public int inV1;
+        public int inV2;
         public int out;
     }
 
     private void checkMaxIntIntInt() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x773d0d60e43d0fa9l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x773d0d60e43d0faal, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x7413f465641a51bl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x7413f465641a51cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxIntIntInt(inA, out);
-            verifyResultsMaxIntIntInt(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxIntIntInt(inV1, out);
+            verifyResultsMaxIntIntInt(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxIntIntInt: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxIntIntInt(inA, out);
-            verifyResultsMaxIntIntInt(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxIntIntInt(inV1, out);
+            verifyResultsMaxIntIntInt(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxIntIntInt: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxIntIntInt(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxIntIntInt(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntIntInt args = new ArgumentsIntIntInt();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1429,11 +1429,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1452,39 +1452,39 @@
     }
 
     private void checkMaxInt2Int2Int2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x32815a01bb9dccd7l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x32815a01bb9dccd8l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x7bba1e4a83816bd5l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x7bba1e4a83816bd6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxInt2Int2Int2(inA, out);
-            verifyResultsMaxInt2Int2Int2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxInt2Int2Int2(inV1, out);
+            verifyResultsMaxInt2Int2Int2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxInt2Int2Int2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxInt2Int2Int2(inA, out);
-            verifyResultsMaxInt2Int2Int2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxInt2Int2Int2(inV1, out);
+            verifyResultsMaxInt2Int2Int2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxInt2Int2Int2: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxInt2Int2Int2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxInt2Int2Int2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntIntInt args = new ArgumentsIntIntInt();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1494,11 +1494,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1517,39 +1517,39 @@
     }
 
     private void checkMaxInt3Int3Int3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x3f66ddfc867314c0l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x3f66ddfc867314c1l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xa647496a95547ff8l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xa647496a95547ff9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxInt3Int3Int3(inA, out);
-            verifyResultsMaxInt3Int3Int3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxInt3Int3Int3(inV1, out);
+            verifyResultsMaxInt3Int3Int3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxInt3Int3Int3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxInt3Int3Int3(inA, out);
-            verifyResultsMaxInt3Int3Int3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxInt3Int3Int3(inV1, out);
+            verifyResultsMaxInt3Int3Int3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxInt3Int3Int3: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxInt3Int3Int3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxInt3Int3Int3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntIntInt args = new ArgumentsIntIntInt();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1559,11 +1559,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1582,39 +1582,39 @@
     }
 
     private void checkMaxInt4Int4Int4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x4c4c61f751485ca9l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x4c4c61f751485caal, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xd0d4748aa727941bl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xd0d4748aa727941cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxInt4Int4Int4(inA, out);
-            verifyResultsMaxInt4Int4Int4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxInt4Int4Int4(inV1, out);
+            verifyResultsMaxInt4Int4Int4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxInt4Int4Int4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxInt4Int4Int4(inA, out);
-            verifyResultsMaxInt4Int4Int4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxInt4Int4Int4(inV1, out);
+            verifyResultsMaxInt4Int4Int4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxInt4Int4Int4: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxInt4Int4Int4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxInt4Int4Int4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntIntInt args = new ArgumentsIntIntInt();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1624,11 +1624,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1647,45 +1647,45 @@
     }
 
     public class ArgumentsUintUintUint {
-        public int inA;
-        public int inB;
+        public int inV1;
+        public int inV2;
         public int out;
     }
 
     private void checkMaxUintUintUint() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xcd24e58385f73e36l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xcd24e58385f73e37l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x75328d17808776cal, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x75328d17808776cbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUintUintUint(inA, out);
-            verifyResultsMaxUintUintUint(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUintUintUint(inV1, out);
+            verifyResultsMaxUintUintUint(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUintUintUint: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUintUintUint(inA, out);
-            verifyResultsMaxUintUintUint(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUintUintUint(inV1, out);
+            verifyResultsMaxUintUintUint(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUintUintUint: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUintUintUint(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUintUintUint(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsUintUintUint args = new ArgumentsUintUintUint();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1695,11 +1695,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1718,39 +1718,39 @@
     }
 
     private void checkMaxUint2Uint2Uint2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xbd5747860e84d6c4l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xbd5747860e84d6c5l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xcda90384705016a4l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xcda90384705016a5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUint2Uint2Uint2(inA, out);
-            verifyResultsMaxUint2Uint2Uint2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUint2Uint2Uint2(inV1, out);
+            verifyResultsMaxUint2Uint2Uint2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUint2Uint2Uint2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUint2Uint2Uint2(inA, out);
-            verifyResultsMaxUint2Uint2Uint2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUint2Uint2Uint2(inV1, out);
+            verifyResultsMaxUint2Uint2Uint2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUint2Uint2Uint2: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUint2Uint2Uint2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUint2Uint2Uint2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsUintUintUint args = new ArgumentsUintUintUint();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1760,11 +1760,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1783,39 +1783,39 @@
     }
 
     private void checkMaxUint3Uint3Uint3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe30bc76f6d23e793l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe30bc76f6d23e794l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x22fa7fb75507e969l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x22fa7fb75507e96al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUint3Uint3Uint3(inA, out);
-            verifyResultsMaxUint3Uint3Uint3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUint3Uint3Uint3(inV1, out);
+            verifyResultsMaxUint3Uint3Uint3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUint3Uint3Uint3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUint3Uint3Uint3(inA, out);
-            verifyResultsMaxUint3Uint3Uint3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUint3Uint3Uint3(inV1, out);
+            verifyResultsMaxUint3Uint3Uint3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUint3Uint3Uint3: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUint3Uint3Uint3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUint3Uint3Uint3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsUintUintUint args = new ArgumentsUintUintUint();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1825,11 +1825,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1848,39 +1848,39 @@
     }
 
     private void checkMaxUint4Uint4Uint4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x8c04758cbc2f862l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x8c04758cbc2f863l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x784bfbea39bfbc2el, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x784bfbea39bfbc2fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUint4Uint4Uint4(inA, out);
-            verifyResultsMaxUint4Uint4Uint4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUint4Uint4Uint4(inV1, out);
+            verifyResultsMaxUint4Uint4Uint4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUint4Uint4Uint4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUint4Uint4Uint4(inA, out);
-            verifyResultsMaxUint4Uint4Uint4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUint4Uint4Uint4(inV1, out);
+            verifyResultsMaxUint4Uint4Uint4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUint4Uint4Uint4: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUint4Uint4Uint4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUint4Uint4Uint4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsUintUintUint args = new ArgumentsUintUintUint();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1890,11 +1890,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1913,45 +1913,45 @@
     }
 
     public class ArgumentsLongLongLong {
-        public long inA;
-        public long inB;
+        public long inV1;
+        public long inV2;
         public long out;
     }
 
     private void checkMaxLongLongLong() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x542587285eceb84l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x542587285eceb85l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0xe224db3c7ecb92e4l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0xe224db3c7ecb92e5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxLongLongLong(inA, out);
-            verifyResultsMaxLongLongLong(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxLongLongLong(inV1, out);
+            verifyResultsMaxLongLongLong(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxLongLongLong: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxLongLongLong(inA, out);
-            verifyResultsMaxLongLongLong(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxLongLongLong(inV1, out);
+            verifyResultsMaxLongLongLong(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxLongLongLong: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxLongLongLong(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxLongLongLong(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsLongLongLong args = new ArgumentsLongLongLong();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -1961,11 +1961,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1984,39 +1984,39 @@
     }
 
     private void checkMaxLong2Long2Long2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xc5c0bac4c249c9dal, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xc5c0bac4c249c9dbl, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x375f5f0ca264eb56l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x375f5f0ca264eb57l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxLong2Long2Long2(inA, out);
-            verifyResultsMaxLong2Long2Long2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxLong2Long2Long2(inV1, out);
+            verifyResultsMaxLong2Long2Long2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxLong2Long2Long2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxLong2Long2Long2(inA, out);
-            verifyResultsMaxLong2Long2Long2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxLong2Long2Long2(inV1, out);
+            verifyResultsMaxLong2Long2Long2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxLong2Long2Long2: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxLong2Long2Long2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxLong2Long2Long2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsLongLongLong args = new ArgumentsLongLongLong();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -2026,11 +2026,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -2049,39 +2049,39 @@
     }
 
     private void checkMaxLong3Long3Long3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xeb753aae20e8daa9l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xeb753aae20e8daaal, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x8cb0db3f871cbe1bl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x8cb0db3f871cbe1cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxLong3Long3Long3(inA, out);
-            verifyResultsMaxLong3Long3Long3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxLong3Long3Long3(inV1, out);
+            verifyResultsMaxLong3Long3Long3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxLong3Long3Long3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxLong3Long3Long3(inA, out);
-            verifyResultsMaxLong3Long3Long3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxLong3Long3Long3(inV1, out);
+            verifyResultsMaxLong3Long3Long3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxLong3Long3Long3: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxLong3Long3Long3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxLong3Long3Long3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsLongLongLong args = new ArgumentsLongLongLong();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -2091,11 +2091,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -2114,39 +2114,39 @@
     }
 
     private void checkMaxLong4Long4Long4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x1129ba977f87eb78l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x1129ba977f87eb79l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xe20257726bd490e0l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xe20257726bd490e1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxLong4Long4Long4(inA, out);
-            verifyResultsMaxLong4Long4Long4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxLong4Long4Long4(inV1, out);
+            verifyResultsMaxLong4Long4Long4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxLong4Long4Long4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxLong4Long4Long4(inA, out);
-            verifyResultsMaxLong4Long4Long4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxLong4Long4Long4(inV1, out);
+            verifyResultsMaxLong4Long4Long4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxLong4Long4Long4: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxLong4Long4Long4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxLong4Long4Long4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsLongLongLong args = new ArgumentsLongLongLong();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -2156,11 +2156,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -2179,45 +2179,45 @@
     }
 
     public class ArgumentsUlongUlongUlong {
-        public long inA;
-        public long inB;
+        public long inV1;
+        public long inV2;
         public long out;
     }
 
     private void checkMaxUlongUlongUlong() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x8d1ad8f38f18baafl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x8d1ad8f38f18bab0l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0xb38270e909275f1dl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0xb38270e909275f1el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUlongUlongUlong(inA, out);
-            verifyResultsMaxUlongUlongUlong(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUlongUlongUlong(inV1, out);
+            verifyResultsMaxUlongUlongUlong(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUlongUlongUlong: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUlongUlongUlong(inA, out);
-            verifyResultsMaxUlongUlongUlong(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUlongUlongUlong(inV1, out);
+            verifyResultsMaxUlongUlongUlong(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUlongUlongUlong: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUlongUlongUlong(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUlongUlongUlong(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsUlongUlongUlong args = new ArgumentsUlongUlongUlong();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -2227,11 +2227,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -2250,39 +2250,39 @@
     }
 
     private void checkMaxUlong2Ulong2Ulong2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x6e2049a55946bc65l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x6e2049a55946bc66l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x7f6c5ec5fee1a8afl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x7f6c5ec5fee1a8b0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUlong2Ulong2Ulong2(inA, out);
-            verifyResultsMaxUlong2Ulong2Ulong2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUlong2Ulong2Ulong2(inV1, out);
+            verifyResultsMaxUlong2Ulong2Ulong2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUlong2Ulong2Ulong2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUlong2Ulong2Ulong2(inA, out);
-            verifyResultsMaxUlong2Ulong2Ulong2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUlong2Ulong2Ulong2(inV1, out);
+            verifyResultsMaxUlong2Ulong2Ulong2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUlong2Ulong2Ulong2: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUlong2Ulong2Ulong2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUlong2Ulong2Ulong2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsUlongUlongUlong args = new ArgumentsUlongUlongUlong();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -2292,11 +2292,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -2315,39 +2315,39 @@
     }
 
     private void checkMaxUlong3Ulong3Ulong3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xc28527c55b24be06l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xc28527c55b24be07l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xac5dae264f2beebal, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xac5dae264f2beebbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUlong3Ulong3Ulong3(inA, out);
-            verifyResultsMaxUlong3Ulong3Ulong3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUlong3Ulong3Ulong3(inV1, out);
+            verifyResultsMaxUlong3Ulong3Ulong3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUlong3Ulong3Ulong3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUlong3Ulong3Ulong3(inA, out);
-            verifyResultsMaxUlong3Ulong3Ulong3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUlong3Ulong3Ulong3(inV1, out);
+            verifyResultsMaxUlong3Ulong3Ulong3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUlong3Ulong3Ulong3: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUlong3Ulong3Ulong3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUlong3Ulong3Ulong3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsUlongUlongUlong args = new ArgumentsUlongUlongUlong();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -2357,11 +2357,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -2380,39 +2380,39 @@
     }
 
     private void checkMaxUlong4Ulong4Ulong4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x16ea05e55d02bfa7l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x16ea05e55d02bfa8l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xd94efd869f7634c5l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xd94efd869f7634c6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMaxUlong4Ulong4Ulong4(inA, out);
-            verifyResultsMaxUlong4Ulong4Ulong4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMaxUlong4Ulong4Ulong4(inV1, out);
+            verifyResultsMaxUlong4Ulong4Ulong4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUlong4Ulong4Ulong4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxUlong4Ulong4Ulong4(inA, out);
-            verifyResultsMaxUlong4Ulong4Ulong4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMaxUlong4Ulong4Ulong4(inV1, out);
+            verifyResultsMaxUlong4Ulong4Ulong4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxUlong4Ulong4Ulong4: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxUlong4Ulong4Ulong4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMaxUlong4Ulong4Ulong4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsUlongUlongUlong args = new ArgumentsUlongUlongUlong();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMax(args);
                 // Validate the outputs.
@@ -2422,11 +2422,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestMax.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestMax.rs
new file mode 100644
index 0000000..dff7927
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMax.rs
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocIn1;
+
+float __attribute__((kernel)) testMaxFloatFloatFloat(float in, unsigned int x) {
+    float in1 = rsGetElementAt_float(gAllocIn1, x);
+    return max(in, in1);
+}
+
+float2 __attribute__((kernel)) testMaxFloat2Float2Float2(float2 in, unsigned int x) {
+    float2 in1 = rsGetElementAt_float2(gAllocIn1, x);
+    return max(in, in1);
+}
+
+float3 __attribute__((kernel)) testMaxFloat3Float3Float3(float3 in, unsigned int x) {
+    float3 in1 = rsGetElementAt_float3(gAllocIn1, x);
+    return max(in, in1);
+}
+
+float4 __attribute__((kernel)) testMaxFloat4Float4Float4(float4 in, unsigned int x) {
+    float4 in1 = rsGetElementAt_float4(gAllocIn1, x);
+    return max(in, in1);
+}
+rs_allocation gAllocInV2;
+
+char __attribute__((kernel)) testMaxCharCharChar(char inV1, unsigned int x) {
+    char inV2 = rsGetElementAt_char(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+char2 __attribute__((kernel)) testMaxChar2Char2Char2(char2 inV1, unsigned int x) {
+    char2 inV2 = rsGetElementAt_char2(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+char3 __attribute__((kernel)) testMaxChar3Char3Char3(char3 inV1, unsigned int x) {
+    char3 inV2 = rsGetElementAt_char3(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+char4 __attribute__((kernel)) testMaxChar4Char4Char4(char4 inV1, unsigned int x) {
+    char4 inV2 = rsGetElementAt_char4(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+uchar __attribute__((kernel)) testMaxUcharUcharUchar(uchar inV1, unsigned int x) {
+    uchar inV2 = rsGetElementAt_uchar(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+uchar2 __attribute__((kernel)) testMaxUchar2Uchar2Uchar2(uchar2 inV1, unsigned int x) {
+    uchar2 inV2 = rsGetElementAt_uchar2(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+uchar3 __attribute__((kernel)) testMaxUchar3Uchar3Uchar3(uchar3 inV1, unsigned int x) {
+    uchar3 inV2 = rsGetElementAt_uchar3(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+uchar4 __attribute__((kernel)) testMaxUchar4Uchar4Uchar4(uchar4 inV1, unsigned int x) {
+    uchar4 inV2 = rsGetElementAt_uchar4(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+short __attribute__((kernel)) testMaxShortShortShort(short inV1, unsigned int x) {
+    short inV2 = rsGetElementAt_short(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+short2 __attribute__((kernel)) testMaxShort2Short2Short2(short2 inV1, unsigned int x) {
+    short2 inV2 = rsGetElementAt_short2(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+short3 __attribute__((kernel)) testMaxShort3Short3Short3(short3 inV1, unsigned int x) {
+    short3 inV2 = rsGetElementAt_short3(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+short4 __attribute__((kernel)) testMaxShort4Short4Short4(short4 inV1, unsigned int x) {
+    short4 inV2 = rsGetElementAt_short4(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+ushort __attribute__((kernel)) testMaxUshortUshortUshort(ushort inV1, unsigned int x) {
+    ushort inV2 = rsGetElementAt_ushort(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+ushort2 __attribute__((kernel)) testMaxUshort2Ushort2Ushort2(ushort2 inV1, unsigned int x) {
+    ushort2 inV2 = rsGetElementAt_ushort2(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+ushort3 __attribute__((kernel)) testMaxUshort3Ushort3Ushort3(ushort3 inV1, unsigned int x) {
+    ushort3 inV2 = rsGetElementAt_ushort3(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+ushort4 __attribute__((kernel)) testMaxUshort4Ushort4Ushort4(ushort4 inV1, unsigned int x) {
+    ushort4 inV2 = rsGetElementAt_ushort4(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+int __attribute__((kernel)) testMaxIntIntInt(int inV1, unsigned int x) {
+    int inV2 = rsGetElementAt_int(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+int2 __attribute__((kernel)) testMaxInt2Int2Int2(int2 inV1, unsigned int x) {
+    int2 inV2 = rsGetElementAt_int2(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+int3 __attribute__((kernel)) testMaxInt3Int3Int3(int3 inV1, unsigned int x) {
+    int3 inV2 = rsGetElementAt_int3(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+int4 __attribute__((kernel)) testMaxInt4Int4Int4(int4 inV1, unsigned int x) {
+    int4 inV2 = rsGetElementAt_int4(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+uint __attribute__((kernel)) testMaxUintUintUint(uint inV1, unsigned int x) {
+    uint inV2 = rsGetElementAt_uint(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+uint2 __attribute__((kernel)) testMaxUint2Uint2Uint2(uint2 inV1, unsigned int x) {
+    uint2 inV2 = rsGetElementAt_uint2(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+uint3 __attribute__((kernel)) testMaxUint3Uint3Uint3(uint3 inV1, unsigned int x) {
+    uint3 inV2 = rsGetElementAt_uint3(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+uint4 __attribute__((kernel)) testMaxUint4Uint4Uint4(uint4 inV1, unsigned int x) {
+    uint4 inV2 = rsGetElementAt_uint4(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+long __attribute__((kernel)) testMaxLongLongLong(long inV1, unsigned int x) {
+    long inV2 = rsGetElementAt_long(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+long2 __attribute__((kernel)) testMaxLong2Long2Long2(long2 inV1, unsigned int x) {
+    long2 inV2 = rsGetElementAt_long2(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+long3 __attribute__((kernel)) testMaxLong3Long3Long3(long3 inV1, unsigned int x) {
+    long3 inV2 = rsGetElementAt_long3(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+long4 __attribute__((kernel)) testMaxLong4Long4Long4(long4 inV1, unsigned int x) {
+    long4 inV2 = rsGetElementAt_long4(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+ulong __attribute__((kernel)) testMaxUlongUlongUlong(ulong inV1, unsigned int x) {
+    ulong inV2 = rsGetElementAt_ulong(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+ulong2 __attribute__((kernel)) testMaxUlong2Ulong2Ulong2(ulong2 inV1, unsigned int x) {
+    ulong2 inV2 = rsGetElementAt_ulong2(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+ulong3 __attribute__((kernel)) testMaxUlong3Ulong3Ulong3(ulong3 inV1, unsigned int x) {
+    ulong3 inV2 = rsGetElementAt_ulong3(gAllocInV2, x);
+    return max(inV1, inV2);
+}
+
+ulong4 __attribute__((kernel)) testMaxUlong4Ulong4Ulong4(ulong4 inV1, unsigned int x) {
+    ulong4 inV2 = rsGetElementAt_ulong4(gAllocInV2, x);
+    return max(inV1, inV2);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestMaxRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestMaxRelaxed.rs
index 6660366..fb0319b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMaxRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestMax.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMin.java b/tests/tests/renderscript/src/android/renderscript/cts/TestMin.java
similarity index 67%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMin.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestMin.java
index 46a888e..a04ef55 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMin.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestMin extends RSBaseCompute {
+public class TestMin extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestMin script;
-    private ScriptC_GeneratedTestMinRelaxed scriptRelaxed;
+    private ScriptC_TestMin script;
+    private ScriptC_TestMinRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestMin(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestMinRelaxed(mRS);
+        script = new ScriptC_TestMin(mRS);
+        scriptRelaxed = new ScriptC_TestMinRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inA;
-        public float inB;
+        public float in;
+        public float in1;
         public Target.Floaty out;
     }
 
     private void checkMinFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbdad0b097121573el, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbdad0b097121573fl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x816f2fe273bf4977l, false);
+        Allocation in1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbdad0b097121572el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinFloatFloatFloat(inA, out);
-            verifyResultsMinFloatFloatFloat(inA, inB, out, false);
+            script.set_gAllocIn1(in1);
+            script.forEach_testMinFloatFloatFloat(in, out);
+            verifyResultsMinFloatFloatFloat(in, in1, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinFloatFloatFloat(inA, out);
-            verifyResultsMinFloatFloatFloat(inA, inB, out, true);
+            scriptRelaxed.set_gAllocIn1(in1);
+            scriptRelaxed.forEach_testMinFloatFloatFloat(in, out);
+            verifyResultsMinFloatFloatFloat(in, in1, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsMinFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinFloatFloatFloat(Allocation in, Allocation in1, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
+        float[] arrayIn1 = new float[INPUTSIZE * 1];
+        in1.copyTo(arrayIn1);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.in = arrayIn[i];
+                args.in1 = arrayIn1[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMin(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input in1: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.in1, Float.floatToRawIntBits(args.in1), args.in1));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkMinFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2f1cc4b149b4e454l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2f1cc4b149b4e455l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe354049301b6cfb9l, false);
+        Allocation in1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2f1cc4b149b4e444l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinFloat2Float2Float2(inA, out);
-            verifyResultsMinFloat2Float2Float2(inA, inB, out, false);
+            script.set_gAllocIn1(in1);
+            script.forEach_testMinFloat2Float2Float2(in, out);
+            verifyResultsMinFloat2Float2Float2(in, in1, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinFloat2Float2Float2(inA, out);
-            verifyResultsMinFloat2Float2Float2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocIn1(in1);
+            scriptRelaxed.forEach_testMinFloat2Float2Float2(in, out);
+            verifyResultsMinFloat2Float2Float2(in, in1, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsMinFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinFloat2Float2Float2(Allocation in, Allocation in1, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
+        float[] arrayIn1 = new float[INPUTSIZE * 2];
+        in1.copyTo(arrayIn1);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
+                args.in1 = arrayIn1[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMin(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input in1: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.in1, Float.floatToRawIntBits(args.in1), args.in1));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkMinFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8381a2d14b92e5f5l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8381a2d14b92e5f6l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x38a3c24c4f27231cl, false);
+        Allocation in1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8381a2d14b92e5e5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinFloat3Float3Float3(inA, out);
-            verifyResultsMinFloat3Float3Float3(inA, inB, out, false);
+            script.set_gAllocIn1(in1);
+            script.forEach_testMinFloat3Float3Float3(in, out);
+            verifyResultsMinFloat3Float3Float3(in, in1, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinFloat3Float3Float3(inA, out);
-            verifyResultsMinFloat3Float3Float3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocIn1(in1);
+            scriptRelaxed.forEach_testMinFloat3Float3Float3(in, out);
+            verifyResultsMinFloat3Float3Float3(in, in1, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsMinFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinFloat3Float3Float3(Allocation in, Allocation in1, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
+        float[] arrayIn1 = new float[INPUTSIZE * 4];
+        in1.copyTo(arrayIn1);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
+                args.in1 = arrayIn1[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMin(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input in1: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.in1, Float.floatToRawIntBits(args.in1), args.in1));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkMinFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd7e680f14d70e796l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd7e680f14d70e797l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8df380059c97767fl, false);
+        Allocation in1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd7e680f14d70e786l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinFloat4Float4Float4(inA, out);
-            verifyResultsMinFloat4Float4Float4(inA, inB, out, false);
+            script.set_gAllocIn1(in1);
+            script.forEach_testMinFloat4Float4Float4(in, out);
+            verifyResultsMinFloat4Float4Float4(in, in1, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinFloat4Float4Float4(inA, out);
-            verifyResultsMinFloat4Float4Float4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocIn1(in1);
+            scriptRelaxed.forEach_testMinFloat4Float4Float4(in, out);
+            verifyResultsMinFloat4Float4Float4(in, in1, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsMinFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinFloat4Float4Float4(Allocation in, Allocation in1, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
+        float[] arrayIn1 = new float[INPUTSIZE * 4];
+        in1.copyTo(arrayIn1);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
+                args.in1 = arrayIn1[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMin(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input in1: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.in1, Float.floatToRawIntBits(args.in1), args.in1));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -317,45 +317,45 @@
     }
 
     public class ArgumentsCharCharChar {
-        public byte inA;
-        public byte inB;
+        public byte inV1;
+        public byte inV2;
         public byte out;
     }
 
     private void checkMinCharCharChar() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x78bd3bd20e8196e0l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x78bd3bd20e8196e1l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x47c90c486fc45b58l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x47c90c486fc45b59l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinCharCharChar(inA, out);
-            verifyResultsMinCharCharChar(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinCharCharChar(inV1, out);
+            verifyResultsMinCharCharChar(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinCharCharChar: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinCharCharChar(inA, out);
-            verifyResultsMinCharCharChar(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinCharCharChar(inV1, out);
+            verifyResultsMinCharCharChar(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinCharCharChar: " + e.toString());
         }
     }
 
-    private void verifyResultsMinCharCharChar(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinCharCharChar(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharCharChar args = new ArgumentsCharCharChar();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -365,11 +365,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -388,39 +388,39 @@
     }
 
     private void checkMinChar2Char2Char2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x29373baac8ef5ae2l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x29373baac8ef5ae3l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xec4705afc03447ael, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xec4705afc03447afl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinChar2Char2Char2(inA, out);
-            verifyResultsMinChar2Char2Char2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinChar2Char2Char2(inV1, out);
+            verifyResultsMinChar2Char2Char2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinChar2Char2Char2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinChar2Char2Char2(inA, out);
-            verifyResultsMinChar2Char2Char2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinChar2Char2Char2(inV1, out);
+            verifyResultsMinChar2Char2Char2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinChar2Char2Char2: " + e.toString());
         }
     }
 
-    private void verifyResultsMinChar2Char2Char2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinChar2Char2Char2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharCharChar args = new ArgumentsCharCharChar();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -430,11 +430,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -453,39 +453,39 @@
     }
 
     private void checkMinChar3Char3Char3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x4eebbb94278e6bb1l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x4eebbb94278e6bb2l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x419881e2a4ec1a73l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x419881e2a4ec1a74l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinChar3Char3Char3(inA, out);
-            verifyResultsMinChar3Char3Char3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinChar3Char3Char3(inV1, out);
+            verifyResultsMinChar3Char3Char3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinChar3Char3Char3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinChar3Char3Char3(inA, out);
-            verifyResultsMinChar3Char3Char3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinChar3Char3Char3(inV1, out);
+            verifyResultsMinChar3Char3Char3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinChar3Char3Char3: " + e.toString());
         }
     }
 
-    private void verifyResultsMinChar3Char3Char3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinChar3Char3Char3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharCharChar args = new ArgumentsCharCharChar();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -495,11 +495,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -518,39 +518,39 @@
     }
 
     private void checkMinChar4Char4Char4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x74a03b7d862d7c80l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x74a03b7d862d7c81l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x96e9fe1589a3ed38l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x96e9fe1589a3ed39l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinChar4Char4Char4(inA, out);
-            verifyResultsMinChar4Char4Char4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinChar4Char4Char4(inV1, out);
+            verifyResultsMinChar4Char4Char4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinChar4Char4Char4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinChar4Char4Char4(inA, out);
-            verifyResultsMinChar4Char4Char4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinChar4Char4Char4(inV1, out);
+            verifyResultsMinChar4Char4Char4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinChar4Char4Char4: " + e.toString());
         }
     }
 
-    private void verifyResultsMinChar4Char4Char4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinChar4Char4Char4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsCharCharChar args = new ArgumentsCharCharChar();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -560,11 +560,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -583,45 +583,45 @@
     }
 
     public class ArgumentsUcharUcharUchar {
-        public byte inA;
-        public byte inB;
+        public byte inV1;
+        public byte inV2;
         public byte out;
     }
 
     private void checkMinUcharUcharUchar() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x1469cbe93445490bl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x1469cbe93445490cl, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x6dc5402bc7a34891l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x6dc5402bc7a34892l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUcharUcharUchar(inA, out);
-            verifyResultsMinUcharUcharUchar(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUcharUcharUchar(inV1, out);
+            verifyResultsMinUcharUcharUchar(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUcharUcharUchar: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUcharUcharUchar(inA, out);
-            verifyResultsMinUcharUcharUchar(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUcharUcharUchar(inV1, out);
+            verifyResultsMinUcharUcharUchar(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUcharUcharUchar: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUcharUcharUchar(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUcharUcharUchar(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsUcharUcharUchar args = new ArgumentsUcharUcharUchar();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -631,11 +631,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -654,39 +654,39 @@
     }
 
     private void checkMinUchar2Uchar2Uchar2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x3c36fd71caf0b355l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x3c36fd71caf0b356l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x1d3c921d166e22ffl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x1d3c921d166e2300l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUchar2Uchar2Uchar2(inA, out);
-            verifyResultsMinUchar2Uchar2Uchar2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUchar2Uchar2Uchar2(inV1, out);
+            verifyResultsMinUchar2Uchar2Uchar2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUchar2Uchar2Uchar2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUchar2Uchar2Uchar2(inA, out);
-            verifyResultsMinUchar2Uchar2Uchar2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUchar2Uchar2Uchar2(inV1, out);
+            verifyResultsMinUchar2Uchar2Uchar2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUchar2Uchar2Uchar2: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUchar2Uchar2Uchar2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUchar2Uchar2Uchar2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsUcharUcharUchar args = new ArgumentsUcharUcharUchar();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -696,11 +696,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -719,39 +719,39 @@
     }
 
     private void checkMinUchar3Uchar3Uchar3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x909bdb91ccceb4f6l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x909bdb91ccceb4f7l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x4a2de17d66b8690al, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x4a2de17d66b8690bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUchar3Uchar3Uchar3(inA, out);
-            verifyResultsMinUchar3Uchar3Uchar3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUchar3Uchar3Uchar3(inV1, out);
+            verifyResultsMinUchar3Uchar3Uchar3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUchar3Uchar3Uchar3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUchar3Uchar3Uchar3(inA, out);
-            verifyResultsMinUchar3Uchar3Uchar3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUchar3Uchar3Uchar3(inV1, out);
+            verifyResultsMinUchar3Uchar3Uchar3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUchar3Uchar3Uchar3: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUchar3Uchar3Uchar3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUchar3Uchar3Uchar3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsUcharUcharUchar args = new ArgumentsUcharUcharUchar();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -761,11 +761,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -784,39 +784,39 @@
     }
 
     private void checkMinUchar4Uchar4Uchar4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xe500b9b1ceacb697l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xe500b9b1ceacb698l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x771f30ddb702af15l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x771f30ddb702af16l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUchar4Uchar4Uchar4(inA, out);
-            verifyResultsMinUchar4Uchar4Uchar4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUchar4Uchar4Uchar4(inV1, out);
+            verifyResultsMinUchar4Uchar4Uchar4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUchar4Uchar4Uchar4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUchar4Uchar4Uchar4(inA, out);
-            verifyResultsMinUchar4Uchar4Uchar4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUchar4Uchar4Uchar4(inV1, out);
+            verifyResultsMinUchar4Uchar4Uchar4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUchar4Uchar4Uchar4: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUchar4Uchar4Uchar4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        byte[] arrayInA = new byte[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        byte[] arrayInB = new byte[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUchar4Uchar4Uchar4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        byte[] arrayInV1 = new byte[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        byte[] arrayInV2 = new byte[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsUcharUcharUchar args = new ArgumentsUcharUcharUchar();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -826,11 +826,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -849,45 +849,45 @@
     }
 
     public class ArgumentsShortShortShort {
-        public short inA;
-        public short inB;
+        public short inV1;
+        public short inV2;
         public short out;
     }
 
     private void checkMinShortShortShort() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x265d6881f2c0a572l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x265d6881f2c0a573l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x71b08dd3c65bcddel, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x71b08dd3c65bcddfl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinShortShortShort(inA, out);
-            verifyResultsMinShortShortShort(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinShortShortShort(inV1, out);
+            verifyResultsMinShortShortShort(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinShortShortShort: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinShortShortShort(inA, out);
-            verifyResultsMinShortShortShort(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinShortShortShort(inV1, out);
+            verifyResultsMinShortShortShort(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinShortShortShort: " + e.toString());
         }
     }
 
-    private void verifyResultsMinShortShortShort(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinShortShortShort(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortShortShort args = new ArgumentsShortShortShort();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -897,11 +897,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -920,39 +920,39 @@
     }
 
     private void checkMinShort2Short2Short2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xac037aa769f3c358l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xac037aa769f3c359l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xe4959a1ecbf1d380l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xe4959a1ecbf1d381l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinShort2Short2Short2(inA, out);
-            verifyResultsMinShort2Short2Short2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinShort2Short2Short2(inV1, out);
+            verifyResultsMinShort2Short2Short2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinShort2Short2Short2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinShort2Short2Short2(inA, out);
-            verifyResultsMinShort2Short2Short2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinShort2Short2Short2(inV1, out);
+            verifyResultsMinShort2Short2Short2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinShort2Short2Short2: " + e.toString());
         }
     }
 
-    private void verifyResultsMinShort2Short2Short2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinShort2Short2Short2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortShortShort args = new ArgumentsShortShortShort();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -962,11 +962,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -985,39 +985,39 @@
     }
 
     private void checkMinShort3Short3Short3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x6858c76bd1c4f9l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x6858c76bd1c4fal, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x1186e97f1c3c198bl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x1186e97f1c3c198cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinShort3Short3Short3(inA, out);
-            verifyResultsMinShort3Short3Short3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinShort3Short3Short3(inV1, out);
+            verifyResultsMinShort3Short3Short3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinShort3Short3Short3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinShort3Short3Short3(inA, out);
-            verifyResultsMinShort3Short3Short3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinShort3Short3Short3(inV1, out);
+            verifyResultsMinShort3Short3Short3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinShort3Short3Short3: " + e.toString());
         }
     }
 
-    private void verifyResultsMinShort3Short3Short3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinShort3Short3Short3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortShortShort args = new ArgumentsShortShortShort();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1027,11 +1027,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1050,39 +1050,39 @@
     }
 
     private void checkMinShort4Short4Short4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x54cd36e76dafc69al, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x54cd36e76dafc69bl, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x3e7838df6c865f96l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x3e7838df6c865f97l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinShort4Short4Short4(inA, out);
-            verifyResultsMinShort4Short4Short4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinShort4Short4Short4(inV1, out);
+            verifyResultsMinShort4Short4Short4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinShort4Short4Short4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinShort4Short4Short4(inA, out);
-            verifyResultsMinShort4Short4Short4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinShort4Short4Short4(inV1, out);
+            verifyResultsMinShort4Short4Short4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinShort4Short4Short4: " + e.toString());
         }
     }
 
-    private void verifyResultsMinShort4Short4Short4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinShort4Short4Short4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsShortShortShort args = new ArgumentsShortShortShort();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1092,11 +1092,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1115,45 +1115,45 @@
     }
 
     public class ArgumentsUshortUshortUshort {
-        public short inA;
-        public short inB;
+        public short inV1;
+        public short inV2;
         public short out;
     }
 
     private void checkMinUshortUshortUshort() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xf8a042afcc4e79c5l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xf8a042afcc4e79c6l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xc2eb3387512e77cfl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xc2eb3387512e77d0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUshortUshortUshort(inA, out);
-            verifyResultsMinUshortUshortUshort(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUshortUshortUshort(inV1, out);
+            verifyResultsMinUshortUshortUshort(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUshortUshortUshort: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUshortUshortUshort(inA, out);
-            verifyResultsMinUshortUshortUshort(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUshortUshortUshort(inV1, out);
+            verifyResultsMinUshortUshortUshort(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUshortUshortUshort: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUshortUshortUshort(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUshortUshortUshort(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsUshortUshortUshort args = new ArgumentsUshortUshortUshort();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1163,11 +1163,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1186,39 +1186,39 @@
     }
 
     private void checkMinUshort2Ushort2Ushort2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x2743846f878f4ca3l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x2743846f878f4ca4l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x98573ebbc511e319l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x98573ebbc511e31al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUshort2Ushort2Ushort2(inA, out);
-            verifyResultsMinUshort2Ushort2Ushort2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUshort2Ushort2Ushort2(inV1, out);
+            verifyResultsMinUshort2Ushort2Ushort2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUshort2Ushort2Ushort2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUshort2Ushort2Ushort2(inA, out);
-            verifyResultsMinUshort2Ushort2Ushort2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUshort2Ushort2Ushort2(inV1, out);
+            verifyResultsMinUshort2Ushort2Ushort2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUshort2Ushort2Ushort2: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUshort2Ushort2Ushort2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUshort2Ushort2Ushort2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsUshortUshortUshort args = new ArgumentsUshortUshortUshort();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1228,11 +1228,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1251,39 +1251,39 @@
     }
 
     private void checkMinUshort3Ushort3Ushort3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xa7331d68d0743e3al, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xa7331d68d0743e3bl, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x1595f09b03867776l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x1595f09b03867777l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUshort3Ushort3Ushort3(inA, out);
-            verifyResultsMinUshort3Ushort3Ushort3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUshort3Ushort3Ushort3(inV1, out);
+            verifyResultsMinUshort3Ushort3Ushort3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUshort3Ushort3Ushort3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUshort3Ushort3Ushort3(inA, out);
-            verifyResultsMinUshort3Ushort3Ushort3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUshort3Ushort3Ushort3(inV1, out);
+            verifyResultsMinUshort3Ushort3Ushort3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUshort3Ushort3Ushort3: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUshort3Ushort3Ushort3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUshort3Ushort3Ushort3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsUshortUshortUshort args = new ArgumentsUshortUshortUshort();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1293,11 +1293,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1316,39 +1316,39 @@
     }
 
     private void checkMinUshort4Ushort4Ushort4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x2722b66219592fd1l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x2722b66219592fd2l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x92d4a27a41fb0bd3l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x92d4a27a41fb0bd4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUshort4Ushort4Ushort4(inA, out);
-            verifyResultsMinUshort4Ushort4Ushort4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUshort4Ushort4Ushort4(inV1, out);
+            verifyResultsMinUshort4Ushort4Ushort4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUshort4Ushort4Ushort4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUshort4Ushort4Ushort4(inA, out);
-            verifyResultsMinUshort4Ushort4Ushort4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUshort4Ushort4Ushort4(inV1, out);
+            verifyResultsMinUshort4Ushort4Ushort4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUshort4Ushort4Ushort4: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUshort4Ushort4Ushort4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        short[] arrayInA = new short[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        short[] arrayInB = new short[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUshort4Ushort4Ushort4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        short[] arrayInV1 = new short[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        short[] arrayInV2 = new short[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         short[] arrayOut = new short[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsUshortUshortUshort args = new ArgumentsUshortUshortUshort();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1358,11 +1358,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1381,45 +1381,45 @@
     }
 
     public class ArgumentsIntIntInt {
-        public int inA;
-        public int inB;
+        public int inV1;
+        public int inV2;
         public int out;
     }
 
     private void checkMinIntIntInt() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xfb5d72ade703dfd7l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xfb5d72ade703dfd8l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x38b24335cda69cd5l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x38b24335cda69cd6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinIntIntInt(inA, out);
-            verifyResultsMinIntIntInt(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinIntIntInt(inV1, out);
+            verifyResultsMinIntIntInt(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinIntIntInt: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinIntIntInt(inA, out);
-            verifyResultsMinIntIntInt(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinIntIntInt(inV1, out);
+            verifyResultsMinIntIntInt(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinIntIntInt: " + e.toString());
         }
     }
 
-    private void verifyResultsMinIntIntInt(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinIntIntInt(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntIntInt args = new ArgumentsIntIntInt();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1429,11 +1429,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1452,39 +1452,39 @@
     }
 
     private void checkMinInt2Int2Int2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x4bc6c69713df0b41l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x4bc6c69713df0b42l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xba635b605676e7a3l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xba635b605676e7a4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinInt2Int2Int2(inA, out);
-            verifyResultsMinInt2Int2Int2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinInt2Int2Int2(inV1, out);
+            verifyResultsMinInt2Int2Int2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinInt2Int2Int2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinInt2Int2Int2(inA, out);
-            verifyResultsMinInt2Int2Int2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinInt2Int2Int2(inV1, out);
+            verifyResultsMinInt2Int2Int2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinInt2Int2Int2: " + e.toString());
         }
     }
 
-    private void verifyResultsMinInt2Int2Int2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinInt2Int2Int2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntIntInt args = new ArgumentsIntIntInt();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1494,11 +1494,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1517,39 +1517,39 @@
     }
 
     private void checkMinInt3Int3Int3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x58ac4a91deb4532al, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x58ac4a91deb4532bl, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xe4f086806849fbc6l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xe4f086806849fbc7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinInt3Int3Int3(inA, out);
-            verifyResultsMinInt3Int3Int3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinInt3Int3Int3(inV1, out);
+            verifyResultsMinInt3Int3Int3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinInt3Int3Int3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinInt3Int3Int3(inA, out);
-            verifyResultsMinInt3Int3Int3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinInt3Int3Int3(inV1, out);
+            verifyResultsMinInt3Int3Int3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinInt3Int3Int3: " + e.toString());
         }
     }
 
-    private void verifyResultsMinInt3Int3Int3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinInt3Int3Int3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntIntInt args = new ArgumentsIntIntInt();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1559,11 +1559,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1582,39 +1582,39 @@
     }
 
     private void checkMinInt4Int4Int4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x6591ce8ca9899b13l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x6591ce8ca9899b14l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xf7db1a07a1d0fe9l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xf7db1a07a1d0feal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinInt4Int4Int4(inA, out);
-            verifyResultsMinInt4Int4Int4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinInt4Int4Int4(inV1, out);
+            verifyResultsMinInt4Int4Int4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinInt4Int4Int4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinInt4Int4Int4(inA, out);
-            verifyResultsMinInt4Int4Int4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinInt4Int4Int4(inV1, out);
+            verifyResultsMinInt4Int4Int4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinInt4Int4Int4: " + e.toString());
         }
     }
 
-    private void verifyResultsMinInt4Int4Int4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinInt4Int4Int4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsIntIntInt args = new ArgumentsIntIntInt();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1624,11 +1624,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1647,45 +1647,45 @@
     }
 
     public class ArgumentsUintUintUint {
-        public int inA;
-        public int inB;
+        public int inV1;
+        public int inV2;
         public int out;
     }
 
     private void checkMinUintUintUint() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xe66a5218de387ca0l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xe66a5218de387ca1l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xb3dbca2d537cf298l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xb3dbca2d537cf299l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUintUintUint(inA, out);
-            verifyResultsMinUintUintUint(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUintUintUint(inV1, out);
+            verifyResultsMinUintUintUint(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUintUintUint: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUintUintUint(inA, out);
-            verifyResultsMinUintUintUint(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUintUintUint(inV1, out);
+            verifyResultsMinUintUintUint(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUintUintUint: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUintUintUint(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUintUintUint(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsUintUintUint args = new ArgumentsUintUintUint();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1695,11 +1695,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1718,39 +1718,39 @@
     }
 
     private void checkMinUint2Uint2Uint2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x51b17a26bd9009a2l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x51b17a26bd9009a3l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xb8cf8481d731a1eel, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xb8cf8481d731a1efl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUint2Uint2Uint2(inA, out);
-            verifyResultsMinUint2Uint2Uint2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUint2Uint2Uint2(inV1, out);
+            verifyResultsMinUint2Uint2Uint2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUint2Uint2Uint2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUint2Uint2Uint2(inA, out);
-            verifyResultsMinUint2Uint2Uint2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUint2Uint2Uint2(inV1, out);
+            verifyResultsMinUint2Uint2Uint2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUint2Uint2Uint2: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUint2Uint2Uint2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUint2Uint2Uint2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsUintUintUint args = new ArgumentsUintUintUint();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1760,11 +1760,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1783,39 +1783,39 @@
     }
 
     private void checkMinUint3Uint3Uint3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x7765fa101c2f1a71l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x7765fa101c2f1a72l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe2100b4bbe974b3l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe2100b4bbe974b4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUint3Uint3Uint3(inA, out);
-            verifyResultsMinUint3Uint3Uint3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUint3Uint3Uint3(inV1, out);
+            verifyResultsMinUint3Uint3Uint3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUint3Uint3Uint3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUint3Uint3Uint3(inA, out);
-            verifyResultsMinUint3Uint3Uint3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUint3Uint3Uint3(inV1, out);
+            verifyResultsMinUint3Uint3Uint3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUint3Uint3Uint3: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUint3Uint3Uint3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUint3Uint3Uint3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsUintUintUint args = new ArgumentsUintUintUint();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1825,11 +1825,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1848,39 +1848,39 @@
     }
 
     private void checkMinUint4Uint4Uint4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x9d1a79f97ace2b40l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x9d1a79f97ace2b41l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x63727ce7a0a14778l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x63727ce7a0a14779l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUint4Uint4Uint4(inA, out);
-            verifyResultsMinUint4Uint4Uint4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUint4Uint4Uint4(inV1, out);
+            verifyResultsMinUint4Uint4Uint4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUint4Uint4Uint4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUint4Uint4Uint4(inA, out);
-            verifyResultsMinUint4Uint4Uint4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUint4Uint4Uint4(inV1, out);
+            verifyResultsMinUint4Uint4Uint4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUint4Uint4Uint4: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUint4Uint4Uint4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        int[] arrayInA = new int[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        int[] arrayInB = new int[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUint4Uint4Uint4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        int[] arrayInV1 = new int[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        int[] arrayInV2 = new int[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         int[] arrayOut = new int[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsUintUintUint args = new ArgumentsUintUintUint();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1890,11 +1890,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -1913,45 +1913,45 @@
     }
 
     public class ArgumentsLongLongLong {
-        public long inA;
-        public long inB;
+        public long inV1;
+        public long inV2;
         public long out;
     }
 
     private void checkMinLongLongLong() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x1e87c507de2e29eel, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x1e87c507de2e29efl, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x20ce185251c10eb2l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x20ce185251c10eb3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinLongLongLong(inA, out);
-            verifyResultsMinLongLongLong(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinLongLongLong(inV1, out);
+            verifyResultsMinLongLongLong(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinLongLongLong: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinLongLongLong(inA, out);
-            verifyResultsMinLongLongLong(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinLongLongLong(inV1, out);
+            verifyResultsMinLongLongLong(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinLongLongLong: " + e.toString());
         }
     }
 
-    private void verifyResultsMinLongLongLong(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinLongLongLong(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsLongLongLong args = new ArgumentsLongLongLong();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -1961,11 +1961,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -1984,39 +1984,39 @@
     }
 
     private void checkMinLong2Long2Long2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x5a1aed657154fcb8l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x5a1aed657154fcb9l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x2285e00a094676a0l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x2285e00a094676a1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinLong2Long2Long2(inA, out);
-            verifyResultsMinLong2Long2Long2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinLong2Long2Long2(inV1, out);
+            verifyResultsMinLong2Long2Long2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinLong2Long2Long2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinLong2Long2Long2(inA, out);
-            verifyResultsMinLong2Long2Long2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinLong2Long2Long2(inV1, out);
+            verifyResultsMinLong2Long2Long2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinLong2Long2Long2: " + e.toString());
         }
     }
 
-    private void verifyResultsMinLong2Long2Long2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinLong2Long2Long2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsLongLongLong args = new ArgumentsLongLongLong();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -2026,11 +2026,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -2049,39 +2049,39 @@
     }
 
     private void checkMinLong3Long3Long3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x7fcf6d4ecff40d87l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x7fcf6d4ecff40d88l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x77d75c3cedfe4965l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x77d75c3cedfe4966l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinLong3Long3Long3(inA, out);
-            verifyResultsMinLong3Long3Long3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinLong3Long3Long3(inV1, out);
+            verifyResultsMinLong3Long3Long3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinLong3Long3Long3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinLong3Long3Long3(inA, out);
-            verifyResultsMinLong3Long3Long3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinLong3Long3Long3(inV1, out);
+            verifyResultsMinLong3Long3Long3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinLong3Long3Long3: " + e.toString());
         }
     }
 
-    private void verifyResultsMinLong3Long3Long3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinLong3Long3Long3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsLongLongLong args = new ArgumentsLongLongLong();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -2091,11 +2091,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -2114,39 +2114,39 @@
     }
 
     private void checkMinLong4Long4Long4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xa583ed382e931e56l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xa583ed382e931e57l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xcd28d86fd2b61c2al, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xcd28d86fd2b61c2bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinLong4Long4Long4(inA, out);
-            verifyResultsMinLong4Long4Long4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinLong4Long4Long4(inV1, out);
+            verifyResultsMinLong4Long4Long4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinLong4Long4Long4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinLong4Long4Long4(inA, out);
-            verifyResultsMinLong4Long4Long4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinLong4Long4Long4(inV1, out);
+            verifyResultsMinLong4Long4Long4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinLong4Long4Long4: " + e.toString());
         }
     }
 
-    private void verifyResultsMinLong4Long4Long4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinLong4Long4Long4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsLongLongLong args = new ArgumentsLongLongLong();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -2156,11 +2156,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("%d", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("%d", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("%d", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("%d", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("%d", args.out));
@@ -2179,45 +2179,45 @@
     }
 
     public class ArgumentsUlongUlongUlong {
-        public long inA;
-        public long inB;
+        public long inV1;
+        public long inV2;
         public long out;
     }
 
     private void checkMinUlongUlongUlong() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x21750b943e23ed8dl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x21750b943e23ed8el, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x9ea8f1e67008ea67l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x9ea8f1e67008ea68l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUlongUlongUlong(inA, out);
-            verifyResultsMinUlongUlongUlong(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUlongUlongUlong(inV1, out);
+            verifyResultsMinUlongUlongUlong(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUlongUlongUlong: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUlongUlongUlong(inA, out);
-            verifyResultsMinUlongUlongUlong(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUlongUlongUlong(inV1, out);
+            verifyResultsMinUlongUlongUlong(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUlongUlongUlong: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUlongUlongUlong(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUlongUlongUlong(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 1];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 1];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsUlongUlongUlong args = new ArgumentsUlongUlongUlong();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inV1 = arrayInV1[i];
+                args.inV2 = arrayInV2[i];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -2227,11 +2227,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -2250,39 +2250,39 @@
     }
 
     private void checkMinUlong2Ulong2Ulong2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xd739efe16c4dc5dfl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xd739efe16c4dc5e0l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x26bb4add3110402dl, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x26bb4add3110402el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUlong2Ulong2Ulong2(inA, out);
-            verifyResultsMinUlong2Ulong2Ulong2(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUlong2Ulong2Ulong2(inV1, out);
+            verifyResultsMinUlong2Ulong2Ulong2(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUlong2Ulong2Ulong2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUlong2Ulong2Ulong2(inA, out);
-            verifyResultsMinUlong2Ulong2Ulong2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUlong2Ulong2Ulong2(inV1, out);
+            verifyResultsMinUlong2Ulong2Ulong2(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUlong2Ulong2Ulong2: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUlong2Ulong2Ulong2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUlong2Ulong2Ulong2(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 2];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 2];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsUlongUlongUlong args = new ArgumentsUlongUlongUlong();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inV1 = arrayInV1[i * 2 + j];
+                args.inV2 = arrayInV2[i * 2 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -2292,11 +2292,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -2315,39 +2315,39 @@
     }
 
     private void checkMinUlong3Ulong3Ulong3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x2b9ece016e2bc780l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x2b9ece016e2bc781l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x53ac9a3d815a8638l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x53ac9a3d815a8639l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUlong3Ulong3Ulong3(inA, out);
-            verifyResultsMinUlong3Ulong3Ulong3(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUlong3Ulong3Ulong3(inV1, out);
+            verifyResultsMinUlong3Ulong3Ulong3(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUlong3Ulong3Ulong3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUlong3Ulong3Ulong3(inA, out);
-            verifyResultsMinUlong3Ulong3Ulong3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUlong3Ulong3Ulong3(inV1, out);
+            verifyResultsMinUlong3Ulong3Ulong3(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUlong3Ulong3Ulong3: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUlong3Ulong3Ulong3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUlong3Ulong3Ulong3(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsUlongUlongUlong args = new ArgumentsUlongUlongUlong();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -2357,11 +2357,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
@@ -2380,39 +2380,39 @@
     }
 
     private void checkMinUlong4Ulong4Ulong4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x8003ac217009c921l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x8003ac217009c922l, false);
+        Allocation inV1 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x809de99dd1a4cc43l, false);
+        Allocation inV2 = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x809de99dd1a4cc44l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testMinUlong4Ulong4Ulong4(inA, out);
-            verifyResultsMinUlong4Ulong4Ulong4(inA, inB, out, false);
+            script.set_gAllocInV2(inV2);
+            script.forEach_testMinUlong4Ulong4Ulong4(inV1, out);
+            verifyResultsMinUlong4Ulong4Ulong4(inV1, inV2, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUlong4Ulong4Ulong4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinUlong4Ulong4Ulong4(inA, out);
-            verifyResultsMinUlong4Ulong4Ulong4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInV2(inV2);
+            scriptRelaxed.forEach_testMinUlong4Ulong4Ulong4(inV1, out);
+            verifyResultsMinUlong4Ulong4Ulong4(inV1, inV2, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinUlong4Ulong4Ulong4: " + e.toString());
         }
     }
 
-    private void verifyResultsMinUlong4Ulong4Ulong4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        long[] arrayInA = new long[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        long[] arrayInB = new long[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsMinUlong4Ulong4Ulong4(Allocation inV1, Allocation inV2, Allocation out, boolean relaxed) {
+        long[] arrayInV1 = new long[INPUTSIZE * 4];
+        inV1.copyTo(arrayInV1);
+        long[] arrayInV2 = new long[INPUTSIZE * 4];
+        inV2.copyTo(arrayInV2);
         long[] arrayOut = new long[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsUlongUlongUlong args = new ArgumentsUlongUlongUlong();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inV1 = arrayInV1[i * 4 + j];
+                args.inV2 = arrayInV2[i * 4 + j];
                 // Figure out what the outputs should have been.
                 CoreMathVerifier.computeMin(args);
                 // Validate the outputs.
@@ -2422,11 +2422,11 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    message.append(String.format("0x%x", args.inA));
+                    message.append("Input inV1: ");
+                    message.append(String.format("0x%x", args.inV1));
                     message.append("\n");
-                    message.append("Input inB: ");
-                    message.append(String.format("0x%x", args.inB));
+                    message.append("Input inV2: ");
+                    message.append(String.format("0x%x", args.inV2));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(String.format("0x%x", args.out));
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestMin.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestMin.rs
new file mode 100644
index 0000000..29a9aeb
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMin.rs
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocIn1;
+
+float __attribute__((kernel)) testMinFloatFloatFloat(float in, unsigned int x) {
+    float in1 = rsGetElementAt_float(gAllocIn1, x);
+    return min(in, in1);
+}
+
+float2 __attribute__((kernel)) testMinFloat2Float2Float2(float2 in, unsigned int x) {
+    float2 in1 = rsGetElementAt_float2(gAllocIn1, x);
+    return min(in, in1);
+}
+
+float3 __attribute__((kernel)) testMinFloat3Float3Float3(float3 in, unsigned int x) {
+    float3 in1 = rsGetElementAt_float3(gAllocIn1, x);
+    return min(in, in1);
+}
+
+float4 __attribute__((kernel)) testMinFloat4Float4Float4(float4 in, unsigned int x) {
+    float4 in1 = rsGetElementAt_float4(gAllocIn1, x);
+    return min(in, in1);
+}
+rs_allocation gAllocInV2;
+
+char __attribute__((kernel)) testMinCharCharChar(char inV1, unsigned int x) {
+    char inV2 = rsGetElementAt_char(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+char2 __attribute__((kernel)) testMinChar2Char2Char2(char2 inV1, unsigned int x) {
+    char2 inV2 = rsGetElementAt_char2(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+char3 __attribute__((kernel)) testMinChar3Char3Char3(char3 inV1, unsigned int x) {
+    char3 inV2 = rsGetElementAt_char3(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+char4 __attribute__((kernel)) testMinChar4Char4Char4(char4 inV1, unsigned int x) {
+    char4 inV2 = rsGetElementAt_char4(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+uchar __attribute__((kernel)) testMinUcharUcharUchar(uchar inV1, unsigned int x) {
+    uchar inV2 = rsGetElementAt_uchar(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+uchar2 __attribute__((kernel)) testMinUchar2Uchar2Uchar2(uchar2 inV1, unsigned int x) {
+    uchar2 inV2 = rsGetElementAt_uchar2(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+uchar3 __attribute__((kernel)) testMinUchar3Uchar3Uchar3(uchar3 inV1, unsigned int x) {
+    uchar3 inV2 = rsGetElementAt_uchar3(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+uchar4 __attribute__((kernel)) testMinUchar4Uchar4Uchar4(uchar4 inV1, unsigned int x) {
+    uchar4 inV2 = rsGetElementAt_uchar4(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+short __attribute__((kernel)) testMinShortShortShort(short inV1, unsigned int x) {
+    short inV2 = rsGetElementAt_short(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+short2 __attribute__((kernel)) testMinShort2Short2Short2(short2 inV1, unsigned int x) {
+    short2 inV2 = rsGetElementAt_short2(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+short3 __attribute__((kernel)) testMinShort3Short3Short3(short3 inV1, unsigned int x) {
+    short3 inV2 = rsGetElementAt_short3(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+short4 __attribute__((kernel)) testMinShort4Short4Short4(short4 inV1, unsigned int x) {
+    short4 inV2 = rsGetElementAt_short4(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+ushort __attribute__((kernel)) testMinUshortUshortUshort(ushort inV1, unsigned int x) {
+    ushort inV2 = rsGetElementAt_ushort(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+ushort2 __attribute__((kernel)) testMinUshort2Ushort2Ushort2(ushort2 inV1, unsigned int x) {
+    ushort2 inV2 = rsGetElementAt_ushort2(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+ushort3 __attribute__((kernel)) testMinUshort3Ushort3Ushort3(ushort3 inV1, unsigned int x) {
+    ushort3 inV2 = rsGetElementAt_ushort3(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+ushort4 __attribute__((kernel)) testMinUshort4Ushort4Ushort4(ushort4 inV1, unsigned int x) {
+    ushort4 inV2 = rsGetElementAt_ushort4(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+int __attribute__((kernel)) testMinIntIntInt(int inV1, unsigned int x) {
+    int inV2 = rsGetElementAt_int(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+int2 __attribute__((kernel)) testMinInt2Int2Int2(int2 inV1, unsigned int x) {
+    int2 inV2 = rsGetElementAt_int2(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+int3 __attribute__((kernel)) testMinInt3Int3Int3(int3 inV1, unsigned int x) {
+    int3 inV2 = rsGetElementAt_int3(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+int4 __attribute__((kernel)) testMinInt4Int4Int4(int4 inV1, unsigned int x) {
+    int4 inV2 = rsGetElementAt_int4(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+uint __attribute__((kernel)) testMinUintUintUint(uint inV1, unsigned int x) {
+    uint inV2 = rsGetElementAt_uint(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+uint2 __attribute__((kernel)) testMinUint2Uint2Uint2(uint2 inV1, unsigned int x) {
+    uint2 inV2 = rsGetElementAt_uint2(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+uint3 __attribute__((kernel)) testMinUint3Uint3Uint3(uint3 inV1, unsigned int x) {
+    uint3 inV2 = rsGetElementAt_uint3(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+uint4 __attribute__((kernel)) testMinUint4Uint4Uint4(uint4 inV1, unsigned int x) {
+    uint4 inV2 = rsGetElementAt_uint4(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+long __attribute__((kernel)) testMinLongLongLong(long inV1, unsigned int x) {
+    long inV2 = rsGetElementAt_long(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+long2 __attribute__((kernel)) testMinLong2Long2Long2(long2 inV1, unsigned int x) {
+    long2 inV2 = rsGetElementAt_long2(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+long3 __attribute__((kernel)) testMinLong3Long3Long3(long3 inV1, unsigned int x) {
+    long3 inV2 = rsGetElementAt_long3(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+long4 __attribute__((kernel)) testMinLong4Long4Long4(long4 inV1, unsigned int x) {
+    long4 inV2 = rsGetElementAt_long4(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+ulong __attribute__((kernel)) testMinUlongUlongUlong(ulong inV1, unsigned int x) {
+    ulong inV2 = rsGetElementAt_ulong(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+ulong2 __attribute__((kernel)) testMinUlong2Ulong2Ulong2(ulong2 inV1, unsigned int x) {
+    ulong2 inV2 = rsGetElementAt_ulong2(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+ulong3 __attribute__((kernel)) testMinUlong3Ulong3Ulong3(ulong3 inV1, unsigned int x) {
+    ulong3 inV2 = rsGetElementAt_ulong3(gAllocInV2, x);
+    return min(inV1, inV2);
+}
+
+ulong4 __attribute__((kernel)) testMinUlong4Ulong4Ulong4(ulong4 inV1, unsigned int x) {
+    ulong4 inV2 = rsGetElementAt_ulong4(gAllocInV2, x);
+    return min(inV1, inV2);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestMinRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestMinRelaxed.rs
index 6660366..29a4d89 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMinRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestMin.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMix.java b/tests/tests/renderscript/src/android/renderscript/cts/TestMix.java
similarity index 84%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMix.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestMix.java
index 9853a0c..3500e41 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMix.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMix.java
@@ -22,56 +22,56 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestMix extends RSBaseCompute {
+public class TestMix extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestMix script;
-    private ScriptC_GeneratedTestMixRelaxed scriptRelaxed;
+    private ScriptC_TestMix script;
+    private ScriptC_TestMixRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestMix(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestMixRelaxed(mRS);
+        script = new ScriptC_TestMix(mRS);
+        scriptRelaxed = new ScriptC_TestMixRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloatFloat {
         public float inStart;
         public float inStop;
-        public float inFraction;
+        public float inAmount;
         public Target.Floaty out;
     }
 
     private void checkMixFloatFloatFloatFloat() {
         Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9f4beff6471d6db1l, false);
         Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6ede0b88b4422e8fl, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6d2f014ec6a51d9fl, false);
+        Allocation inAmount = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc1c14e5d52dc3fe5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInStop(inStop);
-            script.set_gAllocInFraction(inFraction);
+            script.set_gAllocInAmount(inAmount);
             script.forEach_testMixFloatFloatFloatFloat(inStart, out);
-            verifyResultsMixFloatFloatFloatFloat(inStart, inStop, inFraction, out, false);
+            verifyResultsMixFloatFloatFloatFloat(inStart, inStop, inAmount, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloatFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             scriptRelaxed.set_gAllocInStop(inStop);
-            scriptRelaxed.set_gAllocInFraction(inFraction);
+            scriptRelaxed.set_gAllocInAmount(inAmount);
             scriptRelaxed.forEach_testMixFloatFloatFloatFloat(inStart, out);
-            verifyResultsMixFloatFloatFloatFloat(inStart, inStop, inFraction, out, true);
+            verifyResultsMixFloatFloatFloatFloat(inStart, inStop, inAmount, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloatFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsMixFloatFloatFloatFloat(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
+    private void verifyResultsMixFloatFloatFloatFloat(Allocation inStart, Allocation inStop, Allocation inAmount, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 1];
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 1];
         inStop.copyTo(arrayInStop);
-        float[] arrayInFraction = new float[INPUTSIZE * 1];
-        inFraction.copyTo(arrayInFraction);
+        float[] arrayInAmount = new float[INPUTSIZE * 1];
+        inAmount.copyTo(arrayInAmount);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -80,7 +80,7 @@
                 ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inStart = arrayInStart[i];
                 args.inStop = arrayInStop[i];
-                args.inFraction = arrayInFraction[i];
+                args.inAmount = arrayInAmount[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMix(args, target);
@@ -99,9 +99,9 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inStop, Float.floatToRawIntBits(args.inStop), args.inStop));
                     message.append("\n");
-                    message.append("Input inFraction: ");
+                    message.append("Input inAmount: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inFraction, Float.floatToRawIntBits(args.inFraction), args.inFraction));
+                            args.inAmount, Float.floatToRawIntBits(args.inAmount), args.inAmount));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -123,34 +123,34 @@
     private void checkMixFloat2Float2Float2Float2() {
         Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x45502e8f0a2d9ce9l, false);
         Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xba2b8a035395e837l, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe56bef3c621e0ac7l, false);
+        Allocation inAmount = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa477d20616942e4dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInStop(inStop);
-            script.set_gAllocInFraction(inFraction);
+            script.set_gAllocInAmount(inAmount);
             script.forEach_testMixFloat2Float2Float2Float2(inStart, out);
-            verifyResultsMixFloat2Float2Float2Float2(inStart, inStop, inFraction, out, false);
+            verifyResultsMixFloat2Float2Float2Float2(inStart, inStop, inAmount, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat2Float2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             scriptRelaxed.set_gAllocInStop(inStop);
-            scriptRelaxed.set_gAllocInFraction(inFraction);
+            scriptRelaxed.set_gAllocInAmount(inAmount);
             scriptRelaxed.forEach_testMixFloat2Float2Float2Float2(inStart, out);
-            verifyResultsMixFloat2Float2Float2Float2(inStart, inStop, inFraction, out, true);
+            verifyResultsMixFloat2Float2Float2Float2(inStart, inStop, inAmount, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat2Float2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsMixFloat2Float2Float2Float2(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
+    private void verifyResultsMixFloat2Float2Float2Float2(Allocation inStart, Allocation inStop, Allocation inAmount, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 2];
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 2];
         inStop.copyTo(arrayInStop);
-        float[] arrayInFraction = new float[INPUTSIZE * 2];
-        inFraction.copyTo(arrayInFraction);
+        float[] arrayInAmount = new float[INPUTSIZE * 2];
+        inAmount.copyTo(arrayInAmount);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -159,7 +159,7 @@
                 ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inStart = arrayInStart[i * 2 + j];
                 args.inStop = arrayInStop[i * 2 + j];
-                args.inFraction = arrayInFraction[i * 2 + j];
+                args.inAmount = arrayInAmount[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMix(args, target);
@@ -178,9 +178,9 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inStop, Float.floatToRawIntBits(args.inStop), args.inStop));
                     message.append("\n");
-                    message.append("Input inFraction: ");
+                    message.append("Input inAmount: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inFraction, Float.floatToRawIntBits(args.inFraction), args.inFraction));
+                            args.inAmount, Float.floatToRawIntBits(args.inAmount), args.inAmount));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -202,34 +202,34 @@
     private void checkMixFloat3Float3Float3Float3() {
         Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xeb4701726b009c5l, false);
         Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9b21f6b3249ee4cbl, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf15862eab0d4f51bl, false);
+        Allocation inAmount = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x784ed3e2e07c7741l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInStop(inStop);
-            script.set_gAllocInFraction(inFraction);
+            script.set_gAllocInAmount(inAmount);
             script.forEach_testMixFloat3Float3Float3Float3(inStart, out);
-            verifyResultsMixFloat3Float3Float3Float3(inStart, inStop, inFraction, out, false);
+            verifyResultsMixFloat3Float3Float3Float3(inStart, inStop, inAmount, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat3Float3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             scriptRelaxed.set_gAllocInStop(inStop);
-            scriptRelaxed.set_gAllocInFraction(inFraction);
+            scriptRelaxed.set_gAllocInAmount(inAmount);
             scriptRelaxed.forEach_testMixFloat3Float3Float3Float3(inStart, out);
-            verifyResultsMixFloat3Float3Float3Float3(inStart, inStop, inFraction, out, true);
+            verifyResultsMixFloat3Float3Float3Float3(inStart, inStop, inAmount, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat3Float3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsMixFloat3Float3Float3Float3(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
+    private void verifyResultsMixFloat3Float3Float3Float3(Allocation inStart, Allocation inStop, Allocation inAmount, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 4];
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 4];
         inStop.copyTo(arrayInStop);
-        float[] arrayInFraction = new float[INPUTSIZE * 4];
-        inFraction.copyTo(arrayInFraction);
+        float[] arrayInAmount = new float[INPUTSIZE * 4];
+        inAmount.copyTo(arrayInAmount);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -238,7 +238,7 @@
                 ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inStart = arrayInStart[i * 4 + j];
                 args.inStop = arrayInStop[i * 4 + j];
-                args.inFraction = arrayInFraction[i * 4 + j];
+                args.inAmount = arrayInAmount[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMix(args, target);
@@ -257,9 +257,9 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inStop, Float.floatToRawIntBits(args.inStop), args.inStop));
                     message.append("\n");
-                    message.append("Input inFraction: ");
+                    message.append("Input inAmount: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inFraction, Float.floatToRawIntBits(args.inFraction), args.inFraction));
+                            args.inAmount, Float.floatToRawIntBits(args.inAmount), args.inAmount));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -281,34 +281,34 @@
     private void checkMixFloat4Float4Float4Float4() {
         Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd818b19f433276a1l, false);
         Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7c186362f5a7e15fl, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfd44d698ff8bdf6fl, false);
+        Allocation inAmount = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4c25d5bfaa64c035l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInStop(inStop);
-            script.set_gAllocInFraction(inFraction);
+            script.set_gAllocInAmount(inAmount);
             script.forEach_testMixFloat4Float4Float4Float4(inStart, out);
-            verifyResultsMixFloat4Float4Float4Float4(inStart, inStop, inFraction, out, false);
+            verifyResultsMixFloat4Float4Float4Float4(inStart, inStop, inAmount, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat4Float4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             scriptRelaxed.set_gAllocInStop(inStop);
-            scriptRelaxed.set_gAllocInFraction(inFraction);
+            scriptRelaxed.set_gAllocInAmount(inAmount);
             scriptRelaxed.forEach_testMixFloat4Float4Float4Float4(inStart, out);
-            verifyResultsMixFloat4Float4Float4Float4(inStart, inStop, inFraction, out, true);
+            verifyResultsMixFloat4Float4Float4Float4(inStart, inStop, inAmount, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat4Float4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsMixFloat4Float4Float4Float4(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
+    private void verifyResultsMixFloat4Float4Float4Float4(Allocation inStart, Allocation inStop, Allocation inAmount, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 4];
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 4];
         inStop.copyTo(arrayInStop);
-        float[] arrayInFraction = new float[INPUTSIZE * 4];
-        inFraction.copyTo(arrayInFraction);
+        float[] arrayInAmount = new float[INPUTSIZE * 4];
+        inAmount.copyTo(arrayInAmount);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -317,7 +317,7 @@
                 ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inStart = arrayInStart[i * 4 + j];
                 args.inStop = arrayInStop[i * 4 + j];
-                args.inFraction = arrayInFraction[i * 4 + j];
+                args.inAmount = arrayInAmount[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMix(args, target);
@@ -336,9 +336,9 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inStop, Float.floatToRawIntBits(args.inStop), args.inStop));
                     message.append("\n");
-                    message.append("Input inFraction: ");
+                    message.append("Input inAmount: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inFraction, Float.floatToRawIntBits(args.inFraction), args.inFraction));
+                            args.inAmount, Float.floatToRawIntBits(args.inAmount), args.inAmount));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -360,34 +360,34 @@
     private void checkMixFloat2Float2FloatFloat2() {
         Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf811b2d52bd1d7c3l, false);
         Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x17a127e13c8dd1c5l, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe0b7d03e92afd1f5l, false);
+        Allocation inAmount = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xaaf909cdbd2a10ebl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInStop(inStop);
-            script.set_gAllocInFraction(inFraction);
+            script.set_gAllocInAmount(inAmount);
             script.forEach_testMixFloat2Float2FloatFloat2(inStart, out);
-            verifyResultsMixFloat2Float2FloatFloat2(inStart, inStop, inFraction, out, false);
+            verifyResultsMixFloat2Float2FloatFloat2(inStart, inStop, inAmount, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat2Float2FloatFloat2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             scriptRelaxed.set_gAllocInStop(inStop);
-            scriptRelaxed.set_gAllocInFraction(inFraction);
+            scriptRelaxed.set_gAllocInAmount(inAmount);
             scriptRelaxed.forEach_testMixFloat2Float2FloatFloat2(inStart, out);
-            verifyResultsMixFloat2Float2FloatFloat2(inStart, inStop, inFraction, out, true);
+            verifyResultsMixFloat2Float2FloatFloat2(inStart, inStop, inAmount, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat2Float2FloatFloat2: " + e.toString());
         }
     }
 
-    private void verifyResultsMixFloat2Float2FloatFloat2(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
+    private void verifyResultsMixFloat2Float2FloatFloat2(Allocation inStart, Allocation inStop, Allocation inAmount, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 2];
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 2];
         inStop.copyTo(arrayInStop);
-        float[] arrayInFraction = new float[INPUTSIZE * 1];
-        inFraction.copyTo(arrayInFraction);
+        float[] arrayInAmount = new float[INPUTSIZE * 1];
+        inAmount.copyTo(arrayInAmount);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -396,7 +396,7 @@
                 ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inStart = arrayInStart[i * 2 + j];
                 args.inStop = arrayInStop[i * 2 + j];
-                args.inFraction = arrayInFraction[i];
+                args.inAmount = arrayInAmount[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMix(args, target);
@@ -415,9 +415,9 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inStop, Float.floatToRawIntBits(args.inStop), args.inStop));
                     message.append("\n");
-                    message.append("Input inFraction: ");
+                    message.append("Input inAmount: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inFraction, Float.floatToRawIntBits(args.inFraction), args.inFraction));
+                            args.inAmount, Float.floatToRawIntBits(args.inAmount), args.inAmount));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -439,34 +439,34 @@
     private void checkMixFloat3Float3FloatFloat3() {
         Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xae7aff441b20fa80l, false);
         Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe64a4d60d6f4de7cl, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x21bd09bbd131a27cl, false);
+        Allocation inAmount = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4ea8e06fef74e6aal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInStop(inStop);
-            script.set_gAllocInFraction(inFraction);
+            script.set_gAllocInAmount(inAmount);
             script.forEach_testMixFloat3Float3FloatFloat3(inStart, out);
-            verifyResultsMixFloat3Float3FloatFloat3(inStart, inStop, inFraction, out, false);
+            verifyResultsMixFloat3Float3FloatFloat3(inStart, inStop, inAmount, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat3Float3FloatFloat3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             scriptRelaxed.set_gAllocInStop(inStop);
-            scriptRelaxed.set_gAllocInFraction(inFraction);
+            scriptRelaxed.set_gAllocInAmount(inAmount);
             scriptRelaxed.forEach_testMixFloat3Float3FloatFloat3(inStart, out);
-            verifyResultsMixFloat3Float3FloatFloat3(inStart, inStop, inFraction, out, true);
+            verifyResultsMixFloat3Float3FloatFloat3(inStart, inStop, inAmount, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat3Float3FloatFloat3: " + e.toString());
         }
     }
 
-    private void verifyResultsMixFloat3Float3FloatFloat3(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
+    private void verifyResultsMixFloat3Float3FloatFloat3(Allocation inStart, Allocation inStop, Allocation inAmount, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 4];
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 4];
         inStop.copyTo(arrayInStop);
-        float[] arrayInFraction = new float[INPUTSIZE * 1];
-        inFraction.copyTo(arrayInFraction);
+        float[] arrayInAmount = new float[INPUTSIZE * 1];
+        inAmount.copyTo(arrayInAmount);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -475,7 +475,7 @@
                 ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inStart = arrayInStart[i * 4 + j];
                 args.inStop = arrayInStop[i * 4 + j];
-                args.inFraction = arrayInFraction[i];
+                args.inAmount = arrayInAmount[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMix(args, target);
@@ -494,9 +494,9 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inStop, Float.floatToRawIntBits(args.inStop), args.inStop));
                     message.append("\n");
-                    message.append("Input inFraction: ");
+                    message.append("Input inAmount: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inFraction, Float.floatToRawIntBits(args.inFraction), args.inFraction));
+                            args.inAmount, Float.floatToRawIntBits(args.inAmount), args.inAmount));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -518,34 +518,34 @@
     private void checkMixFloat4Float4FloatFloat4() {
         Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x64e44bb30a701d3dl, false);
         Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb4f372e0715beb33l, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x62c243390fb37303l, false);
+        Allocation inAmount = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf258b71221bfbc69l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInStop(inStop);
-            script.set_gAllocInFraction(inFraction);
+            script.set_gAllocInAmount(inAmount);
             script.forEach_testMixFloat4Float4FloatFloat4(inStart, out);
-            verifyResultsMixFloat4Float4FloatFloat4(inStart, inStop, inFraction, out, false);
+            verifyResultsMixFloat4Float4FloatFloat4(inStart, inStop, inAmount, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat4Float4FloatFloat4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             scriptRelaxed.set_gAllocInStop(inStop);
-            scriptRelaxed.set_gAllocInFraction(inFraction);
+            scriptRelaxed.set_gAllocInAmount(inAmount);
             scriptRelaxed.forEach_testMixFloat4Float4FloatFloat4(inStart, out);
-            verifyResultsMixFloat4Float4FloatFloat4(inStart, inStop, inFraction, out, true);
+            verifyResultsMixFloat4Float4FloatFloat4(inStart, inStop, inAmount, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMixFloat4Float4FloatFloat4: " + e.toString());
         }
     }
 
-    private void verifyResultsMixFloat4Float4FloatFloat4(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
+    private void verifyResultsMixFloat4Float4FloatFloat4(Allocation inStart, Allocation inStop, Allocation inAmount, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 4];
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 4];
         inStop.copyTo(arrayInStop);
-        float[] arrayInFraction = new float[INPUTSIZE * 1];
-        inFraction.copyTo(arrayInFraction);
+        float[] arrayInAmount = new float[INPUTSIZE * 1];
+        inAmount.copyTo(arrayInAmount);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -554,7 +554,7 @@
                 ArgumentsFloatFloatFloatFloat args = new ArgumentsFloatFloatFloatFloat();
                 args.inStart = arrayInStart[i * 4 + j];
                 args.inStop = arrayInStop[i * 4 + j];
-                args.inFraction = arrayInFraction[i];
+                args.inAmount = arrayInAmount[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMix(args, target);
@@ -573,9 +573,9 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inStop, Float.floatToRawIntBits(args.inStop), args.inStop));
                     message.append("\n");
-                    message.append("Input inFraction: ");
+                    message.append("Input inAmount: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inFraction, Float.floatToRawIntBits(args.inFraction), args.inFraction));
+                            args.inAmount, Float.floatToRawIntBits(args.inAmount), args.inAmount));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMix.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestMix.rs
similarity index 70%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMix.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestMix.rs
index bb4e2dc..c2ebcb3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestMix.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMix.rs
@@ -20,46 +20,46 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 rs_allocation gAllocInStop;
-rs_allocation gAllocInFraction;
+rs_allocation gAllocInAmount;
 
 float __attribute__((kernel)) testMixFloatFloatFloatFloat(float inStart, unsigned int x) {
     float inStop = rsGetElementAt_float(gAllocInStop, x);
-    float inFraction = rsGetElementAt_float(gAllocInFraction, x);
-    return mix(inStart, inStop, inFraction);
+    float inAmount = rsGetElementAt_float(gAllocInAmount, x);
+    return mix(inStart, inStop, inAmount);
 }
 
 float2 __attribute__((kernel)) testMixFloat2Float2Float2Float2(float2 inStart, unsigned int x) {
     float2 inStop = rsGetElementAt_float2(gAllocInStop, x);
-    float2 inFraction = rsGetElementAt_float2(gAllocInFraction, x);
-    return mix(inStart, inStop, inFraction);
+    float2 inAmount = rsGetElementAt_float2(gAllocInAmount, x);
+    return mix(inStart, inStop, inAmount);
 }
 
 float3 __attribute__((kernel)) testMixFloat3Float3Float3Float3(float3 inStart, unsigned int x) {
     float3 inStop = rsGetElementAt_float3(gAllocInStop, x);
-    float3 inFraction = rsGetElementAt_float3(gAllocInFraction, x);
-    return mix(inStart, inStop, inFraction);
+    float3 inAmount = rsGetElementAt_float3(gAllocInAmount, x);
+    return mix(inStart, inStop, inAmount);
 }
 
 float4 __attribute__((kernel)) testMixFloat4Float4Float4Float4(float4 inStart, unsigned int x) {
     float4 inStop = rsGetElementAt_float4(gAllocInStop, x);
-    float4 inFraction = rsGetElementAt_float4(gAllocInFraction, x);
-    return mix(inStart, inStop, inFraction);
+    float4 inAmount = rsGetElementAt_float4(gAllocInAmount, x);
+    return mix(inStart, inStop, inAmount);
 }
 
 float2 __attribute__((kernel)) testMixFloat2Float2FloatFloat2(float2 inStart, unsigned int x) {
     float2 inStop = rsGetElementAt_float2(gAllocInStop, x);
-    float inFraction = rsGetElementAt_float(gAllocInFraction, x);
-    return mix(inStart, inStop, inFraction);
+    float inAmount = rsGetElementAt_float(gAllocInAmount, x);
+    return mix(inStart, inStop, inAmount);
 }
 
 float3 __attribute__((kernel)) testMixFloat3Float3FloatFloat3(float3 inStart, unsigned int x) {
     float3 inStop = rsGetElementAt_float3(gAllocInStop, x);
-    float inFraction = rsGetElementAt_float(gAllocInFraction, x);
-    return mix(inStart, inStop, inFraction);
+    float inAmount = rsGetElementAt_float(gAllocInAmount, x);
+    return mix(inStart, inStop, inAmount);
 }
 
 float4 __attribute__((kernel)) testMixFloat4Float4FloatFloat4(float4 inStart, unsigned int x) {
     float4 inStop = rsGetElementAt_float4(gAllocInStop, x);
-    float inFraction = rsGetElementAt_float(gAllocInFraction, x);
-    return mix(inStart, inStop, inFraction);
+    float inAmount = rsGetElementAt_float(gAllocInAmount, x);
+    return mix(inStart, inStop, inAmount);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestMixRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestMixRelaxed.rs
index 6660366..6b59e70 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestMixRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestMix.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestModf.java b/tests/tests/renderscript/src/android/renderscript/cts/TestModf.java
similarity index 61%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestModf.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestModf.java
index a5d5d4c..25d7765 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestModf.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestModf.java
@@ -22,64 +22,64 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestModf extends RSBaseCompute {
+public class TestModf extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestModf script;
-    private ScriptC_GeneratedTestModfRelaxed scriptRelaxed;
+    private ScriptC_TestModf script;
+    private ScriptC_TestModfRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestModf(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestModfRelaxed(mRS);
+        script = new ScriptC_TestModf(mRS);
+        scriptRelaxed = new ScriptC_TestModfRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inV;
-        public Target.Floaty outIntegralPart;
+        public float inX;
+        public Target.Floaty outIret;
         public Target.Floaty out;
     }
 
     private void checkModfFloatFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd655dc05ccaef45l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd655dc05ccaef47l, false);
         try {
-            Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
+            Allocation outIret = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocOutIntegralPart(outIntegralPart);
-            script.forEach_testModfFloatFloatFloat(inV, out);
-            verifyResultsModfFloatFloatFloat(inV, outIntegralPart, out, false);
+            script.set_gAllocOutIret(outIret);
+            script.forEach_testModfFloatFloatFloat(inX, out);
+            verifyResultsModfFloatFloatFloat(inX, outIret, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testModfFloatFloatFloat: " + e.toString());
         }
         try {
-            Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
+            Allocation outIret = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutIntegralPart(outIntegralPart);
-            scriptRelaxed.forEach_testModfFloatFloatFloat(inV, out);
-            verifyResultsModfFloatFloatFloat(inV, outIntegralPart, out, true);
+            scriptRelaxed.set_gAllocOutIret(outIret);
+            scriptRelaxed.forEach_testModfFloatFloatFloat(inX, out);
+            verifyResultsModfFloatFloatFloat(inX, outIret, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testModfFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsModfFloatFloatFloat(Allocation inV, Allocation outIntegralPart, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
-        float[] arrayOutIntegralPart = new float[INPUTSIZE * 1];
-        outIntegralPart.copyTo(arrayOutIntegralPart);
+    private void verifyResultsModfFloatFloatFloat(Allocation inX, Allocation outIret, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        float[] arrayOutIret = new float[INPUTSIZE * 1];
+        outIret.copyTo(arrayOutIret);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inV = arrayInV[i];
+                args.inX = arrayInX[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeModf(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 1 + j])) {
+                if (!args.outIret.couldBe(arrayOutIret[i * 1 + j])) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 1 + j])) {
@@ -87,17 +87,17 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Expected output outIntegralPart: ");
-                    message.append(args.outIntegralPart.toString());
+                    message.append("Expected output outIret: ");
+                    message.append(args.outIret.toString());
                     message.append("\n");
-                    message.append("Actual   output outIntegralPart: ");
+                    message.append("Actual   output outIret: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutIntegralPart[i * 1 + j], Float.floatToRawIntBits(arrayOutIntegralPart[i * 1 + j]), arrayOutIntegralPart[i * 1 + j]));
-                    if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 1 + j])) {
+                            arrayOutIret[i * 1 + j], Float.floatToRawIntBits(arrayOutIret[i * 1 + j]), arrayOutIret[i * 1 + j]));
+                    if (!args.outIret.couldBe(arrayOutIret[i * 1 + j])) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -119,45 +119,45 @@
     }
 
     private void checkModfFloat2Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2a1dc519fa16305fl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2a1dc519fa163061l, false);
         try {
-            Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            Allocation outIret = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocOutIntegralPart(outIntegralPart);
-            script.forEach_testModfFloat2Float2Float2(inV, out);
-            verifyResultsModfFloat2Float2Float2(inV, outIntegralPart, out, false);
+            script.set_gAllocOutIret(outIret);
+            script.forEach_testModfFloat2Float2Float2(inX, out);
+            verifyResultsModfFloat2Float2Float2(inX, outIret, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testModfFloat2Float2Float2: " + e.toString());
         }
         try {
-            Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            Allocation outIret = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutIntegralPart(outIntegralPart);
-            scriptRelaxed.forEach_testModfFloat2Float2Float2(inV, out);
-            verifyResultsModfFloat2Float2Float2(inV, outIntegralPart, out, true);
+            scriptRelaxed.set_gAllocOutIret(outIret);
+            scriptRelaxed.forEach_testModfFloat2Float2Float2(inX, out);
+            verifyResultsModfFloat2Float2Float2(inX, outIret, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testModfFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsModfFloat2Float2Float2(Allocation inV, Allocation outIntegralPart, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
-        float[] arrayOutIntegralPart = new float[INPUTSIZE * 2];
-        outIntegralPart.copyTo(arrayOutIntegralPart);
+    private void verifyResultsModfFloat2Float2Float2(Allocation inX, Allocation outIret, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayOutIret = new float[INPUTSIZE * 2];
+        outIret.copyTo(arrayOutIret);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeModf(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 2 + j])) {
+                if (!args.outIret.couldBe(arrayOutIret[i * 2 + j])) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
@@ -165,17 +165,17 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Expected output outIntegralPart: ");
-                    message.append(args.outIntegralPart.toString());
+                    message.append("Expected output outIret: ");
+                    message.append(args.outIret.toString());
                     message.append("\n");
-                    message.append("Actual   output outIntegralPart: ");
+                    message.append("Actual   output outIret: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutIntegralPart[i * 2 + j], Float.floatToRawIntBits(arrayOutIntegralPart[i * 2 + j]), arrayOutIntegralPart[i * 2 + j]));
-                    if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 2 + j])) {
+                            arrayOutIret[i * 2 + j], Float.floatToRawIntBits(arrayOutIret[i * 2 + j]), arrayOutIret[i * 2 + j]));
+                    if (!args.outIret.couldBe(arrayOutIret[i * 2 + j])) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -197,45 +197,45 @@
     }
 
     private void checkModfFloat3Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7e82a339fbf43200l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7e82a339fbf43202l, false);
         try {
-            Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            Allocation outIret = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocOutIntegralPart(outIntegralPart);
-            script.forEach_testModfFloat3Float3Float3(inV, out);
-            verifyResultsModfFloat3Float3Float3(inV, outIntegralPart, out, false);
+            script.set_gAllocOutIret(outIret);
+            script.forEach_testModfFloat3Float3Float3(inX, out);
+            verifyResultsModfFloat3Float3Float3(inX, outIret, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testModfFloat3Float3Float3: " + e.toString());
         }
         try {
-            Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            Allocation outIret = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutIntegralPart(outIntegralPart);
-            scriptRelaxed.forEach_testModfFloat3Float3Float3(inV, out);
-            verifyResultsModfFloat3Float3Float3(inV, outIntegralPart, out, true);
+            scriptRelaxed.set_gAllocOutIret(outIret);
+            scriptRelaxed.forEach_testModfFloat3Float3Float3(inX, out);
+            verifyResultsModfFloat3Float3Float3(inX, outIret, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testModfFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsModfFloat3Float3Float3(Allocation inV, Allocation outIntegralPart, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
-        float[] arrayOutIntegralPart = new float[INPUTSIZE * 4];
-        outIntegralPart.copyTo(arrayOutIntegralPart);
+    private void verifyResultsModfFloat3Float3Float3(Allocation inX, Allocation outIret, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayOutIret = new float[INPUTSIZE * 4];
+        outIret.copyTo(arrayOutIret);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeModf(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 4 + j])) {
+                if (!args.outIret.couldBe(arrayOutIret[i * 4 + j])) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
@@ -243,17 +243,17 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Expected output outIntegralPart: ");
-                    message.append(args.outIntegralPart.toString());
+                    message.append("Expected output outIret: ");
+                    message.append(args.outIret.toString());
                     message.append("\n");
-                    message.append("Actual   output outIntegralPart: ");
+                    message.append("Actual   output outIret: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutIntegralPart[i * 4 + j], Float.floatToRawIntBits(arrayOutIntegralPart[i * 4 + j]), arrayOutIntegralPart[i * 4 + j]));
-                    if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 4 + j])) {
+                            arrayOutIret[i * 4 + j], Float.floatToRawIntBits(arrayOutIret[i * 4 + j]), arrayOutIret[i * 4 + j]));
+                    if (!args.outIret.couldBe(arrayOutIret[i * 4 + j])) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -275,45 +275,45 @@
     }
 
     private void checkModfFloat4Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd2e78159fdd233a1l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd2e78159fdd233a3l, false);
         try {
-            Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            Allocation outIret = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocOutIntegralPart(outIntegralPart);
-            script.forEach_testModfFloat4Float4Float4(inV, out);
-            verifyResultsModfFloat4Float4Float4(inV, outIntegralPart, out, false);
+            script.set_gAllocOutIret(outIret);
+            script.forEach_testModfFloat4Float4Float4(inX, out);
+            verifyResultsModfFloat4Float4Float4(inX, outIret, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testModfFloat4Float4Float4: " + e.toString());
         }
         try {
-            Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            Allocation outIret = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutIntegralPart(outIntegralPart);
-            scriptRelaxed.forEach_testModfFloat4Float4Float4(inV, out);
-            verifyResultsModfFloat4Float4Float4(inV, outIntegralPart, out, true);
+            scriptRelaxed.set_gAllocOutIret(outIret);
+            scriptRelaxed.forEach_testModfFloat4Float4Float4(inX, out);
+            verifyResultsModfFloat4Float4Float4(inX, outIret, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testModfFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsModfFloat4Float4Float4(Allocation inV, Allocation outIntegralPart, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
-        float[] arrayOutIntegralPart = new float[INPUTSIZE * 4];
-        outIntegralPart.copyTo(arrayOutIntegralPart);
+    private void verifyResultsModfFloat4Float4Float4(Allocation inX, Allocation outIret, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayOutIret = new float[INPUTSIZE * 4];
+        outIret.copyTo(arrayOutIret);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeModf(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 4 + j])) {
+                if (!args.outIret.couldBe(arrayOutIret[i * 4 + j])) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
@@ -321,17 +321,17 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Expected output outIntegralPart: ");
-                    message.append(args.outIntegralPart.toString());
+                    message.append("Expected output outIret: ");
+                    message.append(args.outIret.toString());
                     message.append("\n");
-                    message.append("Actual   output outIntegralPart: ");
+                    message.append("Actual   output outIret: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutIntegralPart[i * 4 + j], Float.floatToRawIntBits(arrayOutIntegralPart[i * 4 + j]), arrayOutIntegralPart[i * 4 + j]));
-                    if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 4 + j])) {
+                            arrayOutIret[i * 4 + j], Float.floatToRawIntBits(arrayOutIret[i * 4 + j]), arrayOutIret[i * 4 + j]));
+                    if (!args.outIret.couldBe(arrayOutIret[i * 4 + j])) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestModf.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestModf.rs
new file mode 100644
index 0000000..be10983
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestModf.rs
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocOutIret;
+
+float __attribute__((kernel)) testModfFloatFloatFloat(float inX, unsigned int x) {
+    float outIret = 0;
+    float out = modf(inX, &outIret);
+    rsSetElementAt_float(gAllocOutIret, outIret, x);
+    return out;
+}
+
+float2 __attribute__((kernel)) testModfFloat2Float2Float2(float2 inX, unsigned int x) {
+    float2 outIret = 0;
+    float2 out = modf(inX, &outIret);
+    rsSetElementAt_float2(gAllocOutIret, outIret, x);
+    return out;
+}
+
+float3 __attribute__((kernel)) testModfFloat3Float3Float3(float3 inX, unsigned int x) {
+    float3 outIret = 0;
+    float3 out = modf(inX, &outIret);
+    rsSetElementAt_float3(gAllocOutIret, outIret, x);
+    return out;
+}
+
+float4 __attribute__((kernel)) testModfFloat4Float4Float4(float4 inX, unsigned int x) {
+    float4 outIret = 0;
+    float4 out = modf(inX, &outIret);
+    rsSetElementAt_float4(gAllocOutIret, outIret, x);
+    return out;
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestModfRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestModfRelaxed.rs
index 6660366..4c9cd9a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestModfRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestModf.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNan.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNan.java
similarity index 78%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNan.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNan.java
index 29bbab7..1be946d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNan.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNan extends RSBaseCompute {
+public class TestNan extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNan script;
-    private ScriptC_GeneratedTestNanRelaxed scriptRelaxed;
+    private ScriptC_TestNan script;
+    private ScriptC_TestNanRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNan(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNanRelaxed(mRS);
+        script = new ScriptC_TestNan(mRS);
+        scriptRelaxed = new ScriptC_TestNanRelaxed(mRS);
     }
 
     public class ArgumentsUintFloat {
-        public int inV;
+        public int in;
         public Target.Floaty out;
     }
 
     private void checkNanUintFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xbc42cb366a8a10d2l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x757e939c0e627774l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNanUintFloat(inV, out);
-            verifyResultsNanUintFloat(inV, out, false);
+            script.forEach_testNanUintFloat(in, out);
+            verifyResultsNanUintFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNanUintFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNanUintFloat(inV, out);
-            verifyResultsNanUintFloat(inV, out, true);
+            scriptRelaxed.forEach_testNanUintFloat(in, out);
+            verifyResultsNanUintFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNanUintFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNanUintFloat(Allocation inV, Allocation out, boolean relaxed) {
-        int[] arrayInV = new int[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNanUintFloat(Allocation in, Allocation out, boolean relaxed) {
+        int[] arrayIn = new int[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsUintFloat args = new ArgumentsUintFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNan(args, target);
@@ -77,8 +77,8 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    message.append(String.format("0x%x", args.inV));
+                    message.append("Input in: ");
+                    message.append(String.format("0x%x", args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNan.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNan.rs
similarity index 90%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNan.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNan.rs
index 0e9ab96..bb434d6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNan.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNan.rs
@@ -20,6 +20,6 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNanUintFloat(uint inV) {
-    return nan(inV);
+float __attribute__((kernel)) testNanUintFloat(uint in) {
+    return nan(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNanRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNanRelaxed.rs
index 6660366..fc7b9eb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNanRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNan.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcos.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcos.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.java
index 68ef91f..430cf59 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeAcos extends RSBaseCompute {
+public class TestNativeAcos extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeAcos script;
-    private ScriptC_GeneratedTestNativeAcosRelaxed scriptRelaxed;
+    private ScriptC_TestNativeAcos script;
+    private ScriptC_TestNativeAcosRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeAcos(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeAcosRelaxed(mRS);
+        script = new ScriptC_TestNativeAcos(mRS);
+        scriptRelaxed = new ScriptC_TestNativeAcosRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcos.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcos.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosRelaxed.rs
index 6660366..01a9de2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeAcos.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcosh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.java
similarity index 79%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcosh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.java
index d39f4bc..d4a840a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeAcosh extends RSBaseCompute {
+public class TestNativeAcosh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeAcosh script;
-    private ScriptC_GeneratedTestNativeAcoshRelaxed scriptRelaxed;
+    private ScriptC_TestNativeAcosh script;
+    private ScriptC_TestNativeAcoshRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeAcosh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeAcoshRelaxed(mRS);
+        script = new ScriptC_TestNativeAcosh(mRS);
+        scriptRelaxed = new ScriptC_TestNativeAcoshRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeAcoshFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x97c6a2f89e417fcal, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x332857238c9c505cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeAcoshFloatFloat(inV, out);
-            verifyResultsNativeAcoshFloatFloat(inV, out, false);
+            script.forEach_testNativeAcoshFloatFloat(in, out);
+            verifyResultsNativeAcoshFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAcoshFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAcoshFloatFloat(inV, out);
-            verifyResultsNativeAcoshFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeAcoshFloatFloat(in, out);
+            verifyResultsNativeAcoshFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAcoshFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAcoshFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAcoshFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAcosh(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeAcoshFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3989caf5cb8e3adel, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7e5c81be4638e398l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeAcoshFloat2Float2(inV, out);
-            verifyResultsNativeAcoshFloat2Float2(inV, out, false);
+            script.forEach_testNativeAcoshFloat2Float2(in, out);
+            verifyResultsNativeAcoshFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAcoshFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAcoshFloat2Float2(inV, out);
-            verifyResultsNativeAcoshFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeAcoshFloat2Float2(in, out);
+            verifyResultsNativeAcoshFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAcoshFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAcoshFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAcoshFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAcosh(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeAcoshFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x398b9410c1a95bbcl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7e5c8c5fa53f7932l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeAcoshFloat3Float3(inV, out);
-            verifyResultsNativeAcoshFloat3Float3(inV, out, false);
+            script.forEach_testNativeAcoshFloat3Float3(in, out);
+            verifyResultsNativeAcoshFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAcoshFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAcoshFloat3Float3(inV, out);
-            verifyResultsNativeAcoshFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeAcoshFloat3Float3(in, out);
+            verifyResultsNativeAcoshFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAcoshFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAcoshFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAcoshFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAcosh(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeAcoshFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x398d5d2bb7c47c9al, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7e5c970104460eccl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeAcoshFloat4Float4(inV, out);
-            verifyResultsNativeAcoshFloat4Float4(inV, out, false);
+            script.forEach_testNativeAcoshFloat4Float4(in, out);
+            verifyResultsNativeAcoshFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAcoshFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAcoshFloat4Float4(inV, out);
-            verifyResultsNativeAcoshFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeAcoshFloat4Float4(in, out);
+            verifyResultsNativeAcoshFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAcoshFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAcoshFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAcoshFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAcosh(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcosh.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.rs
similarity index 87%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcosh.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.rs
index 9e48292..370f4ed 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcosh.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeAcoshFloatFloat(float inV) {
-    return native_acosh(inV);
+float __attribute__((kernel)) testNativeAcoshFloatFloat(float in) {
+    return native_acosh(in);
 }
 
-float2 __attribute__((kernel)) testNativeAcoshFloat2Float2(float2 inV) {
-    return native_acosh(inV);
+float2 __attribute__((kernel)) testNativeAcoshFloat2Float2(float2 in) {
+    return native_acosh(in);
 }
 
-float3 __attribute__((kernel)) testNativeAcoshFloat3Float3(float3 inV) {
-    return native_acosh(inV);
+float3 __attribute__((kernel)) testNativeAcoshFloat3Float3(float3 in) {
+    return native_acosh(in);
 }
 
-float4 __attribute__((kernel)) testNativeAcoshFloat4Float4(float4 inV) {
-    return native_acosh(inV);
+float4 __attribute__((kernel)) testNativeAcoshFloat4Float4(float4 in) {
+    return native_acosh(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcoshRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcoshRelaxed.rs
index 6660366..9ea7b88 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcoshRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeAcosh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcospi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcospi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.java
index c08a500..187b787 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeAcospi extends RSBaseCompute {
+public class TestNativeAcospi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeAcospi script;
-    private ScriptC_GeneratedTestNativeAcospiRelaxed scriptRelaxed;
+    private ScriptC_TestNativeAcospi script;
+    private ScriptC_TestNativeAcospiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeAcospi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeAcospiRelaxed(mRS);
+        script = new ScriptC_TestNativeAcospi(mRS);
+        scriptRelaxed = new ScriptC_TestNativeAcospiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcospi.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAcospi.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospiRelaxed.rs
index 6660366..ff6025e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeAcospi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsin.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsin.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.java
index 87d980a..b9f61a6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeAsin extends RSBaseCompute {
+public class TestNativeAsin extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeAsin script;
-    private ScriptC_GeneratedTestNativeAsinRelaxed scriptRelaxed;
+    private ScriptC_TestNativeAsin script;
+    private ScriptC_TestNativeAsinRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeAsin(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeAsinRelaxed(mRS);
+        script = new ScriptC_TestNativeAsin(mRS);
+        scriptRelaxed = new ScriptC_TestNativeAsinRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsin.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsin.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinRelaxed.rs
index 6660366..9d04b24 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeAsin.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.java
similarity index 79%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.java
index b60600b..f8382a8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeAsinh extends RSBaseCompute {
+public class TestNativeAsinh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeAsinh script;
-    private ScriptC_GeneratedTestNativeAsinhRelaxed scriptRelaxed;
+    private ScriptC_TestNativeAsinh script;
+    private ScriptC_TestNativeAsinhRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeAsinh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeAsinhRelaxed(mRS);
+        script = new ScriptC_TestNativeAsinh(mRS);
+        scriptRelaxed = new ScriptC_TestNativeAsinhRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeAsinhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbd2e22f24b5b925bl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbcf52a7cb45b6e8fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeAsinhFloatFloat(inV, out);
-            verifyResultsNativeAsinhFloatFloat(inV, out, false);
+            script.forEach_testNativeAsinhFloatFloat(in, out);
+            verifyResultsNativeAsinhFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAsinhFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAsinhFloatFloat(inV, out);
-            verifyResultsNativeAsinhFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeAsinhFloatFloat(in, out);
+            verifyResultsNativeAsinhFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAsinhFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAsinhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAsinhFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAsinh(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeAsinhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x62151d490cde5427l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc6bf00ae599a01f3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeAsinhFloat2Float2(inV, out);
-            verifyResultsNativeAsinhFloat2Float2(inV, out, false);
+            script.forEach_testNativeAsinhFloat2Float2(in, out);
+            verifyResultsNativeAsinhFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAsinhFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAsinhFloat2Float2(inV, out);
-            verifyResultsNativeAsinhFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeAsinhFloat2Float2(in, out);
+            verifyResultsNativeAsinhFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAsinhFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAsinhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAsinhFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAsinh(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeAsinhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6216e66402f97505l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc6bf0b4fb8a0978dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeAsinhFloat3Float3(inV, out);
-            verifyResultsNativeAsinhFloat3Float3(inV, out, false);
+            script.forEach_testNativeAsinhFloat3Float3(in, out);
+            verifyResultsNativeAsinhFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAsinhFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAsinhFloat3Float3(inV, out);
-            verifyResultsNativeAsinhFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeAsinhFloat3Float3(in, out);
+            verifyResultsNativeAsinhFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAsinhFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAsinhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAsinhFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAsinh(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeAsinhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6218af7ef91495e3l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc6bf15f117a72d27l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeAsinhFloat4Float4(inV, out);
-            verifyResultsNativeAsinhFloat4Float4(inV, out, false);
+            script.forEach_testNativeAsinhFloat4Float4(in, out);
+            verifyResultsNativeAsinhFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAsinhFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAsinhFloat4Float4(inV, out);
-            verifyResultsNativeAsinhFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeAsinhFloat4Float4(in, out);
+            verifyResultsNativeAsinhFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAsinhFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAsinhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAsinhFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAsinh(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinh.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.rs
similarity index 87%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinh.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.rs
index 8e9ac3c..2c40a7a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinh.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeAsinhFloatFloat(float inV) {
-    return native_asinh(inV);
+float __attribute__((kernel)) testNativeAsinhFloatFloat(float in) {
+    return native_asinh(in);
 }
 
-float2 __attribute__((kernel)) testNativeAsinhFloat2Float2(float2 inV) {
-    return native_asinh(inV);
+float2 __attribute__((kernel)) testNativeAsinhFloat2Float2(float2 in) {
+    return native_asinh(in);
 }
 
-float3 __attribute__((kernel)) testNativeAsinhFloat3Float3(float3 inV) {
-    return native_asinh(inV);
+float3 __attribute__((kernel)) testNativeAsinhFloat3Float3(float3 in) {
+    return native_asinh(in);
 }
 
-float4 __attribute__((kernel)) testNativeAsinhFloat4Float4(float4 inV) {
-    return native_asinh(inV);
+float4 __attribute__((kernel)) testNativeAsinhFloat4Float4(float4 in) {
+    return native_asinh(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinhRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinhRelaxed.rs
index 6660366..1155084 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinhRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeAsinh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinpi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.java
index 1e2d2ac..e0029b7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeAsinpi extends RSBaseCompute {
+public class TestNativeAsinpi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeAsinpi script;
-    private ScriptC_GeneratedTestNativeAsinpiRelaxed scriptRelaxed;
+    private ScriptC_TestNativeAsinpi script;
+    private ScriptC_TestNativeAsinpiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeAsinpi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeAsinpiRelaxed(mRS);
+        script = new ScriptC_TestNativeAsinpi(mRS);
+        scriptRelaxed = new ScriptC_TestNativeAsinpiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinpi.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAsinpi.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpiRelaxed.rs
index 6660366..83a97d3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeAsinpi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.java
index 827c84b..26225c5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeAtan extends RSBaseCompute {
+public class TestNativeAtan extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeAtan script;
-    private ScriptC_GeneratedTestNativeAtanRelaxed scriptRelaxed;
+    private ScriptC_TestNativeAtan script;
+    private ScriptC_TestNativeAtanRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeAtan(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeAtanRelaxed(mRS);
+        script = new ScriptC_TestNativeAtan(mRS);
+        scriptRelaxed = new ScriptC_TestNativeAtanRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.java
similarity index 65%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.java
index ebcfc9a..c33523c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeAtan2 extends RSBaseCompute {
+public class TestNativeAtan2 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeAtan2 script;
-    private ScriptC_GeneratedTestNativeAtan2Relaxed scriptRelaxed;
+    private ScriptC_TestNativeAtan2 script;
+    private ScriptC_TestNativeAtan2Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeAtan2(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeAtan2Relaxed(mRS);
+        script = new ScriptC_TestNativeAtan2(mRS);
+        scriptRelaxed = new ScriptC_TestNativeAtan2Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inNumerator;
-        public float inDenominator;
+        public float inY;
+        public float inX;
         public Target.Floaty out;
     }
 
     private void checkNativeAtan2FloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2139aa61fb6dcb4fl, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf6634dcb634c16d0l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4ecf7d3b9e2a276fl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4ecf7d3b9e2a276el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testNativeAtan2FloatFloatFloat(inNumerator, out);
-            verifyResultsNativeAtan2FloatFloatFloat(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testNativeAtan2FloatFloatFloat(inY, out);
+            verifyResultsNativeAtan2FloatFloatFloat(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2FloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testNativeAtan2FloatFloatFloat(inNumerator, out);
-            verifyResultsNativeAtan2FloatFloatFloat(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testNativeAtan2FloatFloatFloat(inY, out);
+            verifyResultsNativeAtan2FloatFloatFloat(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2FloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtan2FloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 1];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 1];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsNativeAtan2FloatFloatFloat(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i];
-                args.inDenominator = arrayInDenominator[i];
+                args.inY = arrayInY[i];
+                args.inX = arrayInX[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtan2(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkNativeAtan2Float2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x989e0b0cd0059da7l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4a617fa4dfda5468l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3c2d1a09d1c2a8c7l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3c2d1a09d1c2a8c6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testNativeAtan2Float2Float2Float2(inNumerator, out);
-            verifyResultsNativeAtan2Float2Float2Float2(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testNativeAtan2Float2Float2Float2(inY, out);
+            verifyResultsNativeAtan2Float2Float2Float2(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2Float2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testNativeAtan2Float2Float2Float2(inNumerator, out);
-            verifyResultsNativeAtan2Float2Float2Float2(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testNativeAtan2Float2Float2Float2(inY, out);
+            verifyResultsNativeAtan2Float2Float2Float2(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2Float2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtan2Float2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 2];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 2];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsNativeAtan2Float2Float2Float2(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 2 + j];
-                args.inDenominator = arrayInDenominator[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtan2(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkNativeAtan2Float3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x742cb44672d189a8l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x13c5c0edb2b5e7a1l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9091f829d3a0aa68l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9091f829d3a0aa67l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testNativeAtan2Float3Float3Float3(inNumerator, out);
-            verifyResultsNativeAtan2Float3Float3Float3(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testNativeAtan2Float3Float3Float3(inY, out);
+            verifyResultsNativeAtan2Float3Float3Float3(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2Float3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testNativeAtan2Float3Float3Float3(inNumerator, out);
-            verifyResultsNativeAtan2Float3Float3Float3(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testNativeAtan2Float3Float3Float3(inY, out);
+            verifyResultsNativeAtan2Float3Float3Float3(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2Float3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtan2Float3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsNativeAtan2Float3Float3Float3(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtan2(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkNativeAtan2Float4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4fbb5d80159d75a9l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdd2a023685917adal, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe4f6d649d57eac09l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe4f6d649d57eac08l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testNativeAtan2Float4Float4Float4(inNumerator, out);
-            verifyResultsNativeAtan2Float4Float4Float4(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testNativeAtan2Float4Float4Float4(inY, out);
+            verifyResultsNativeAtan2Float4Float4Float4(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2Float4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testNativeAtan2Float4Float4Float4(inNumerator, out);
-            verifyResultsNativeAtan2Float4Float4Float4(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testNativeAtan2Float4Float4Float4(inY, out);
+            verifyResultsNativeAtan2Float4Float4Float4(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2Float4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtan2Float4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsNativeAtan2Float4Float4Float4(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtan2(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.rs
similarity index 60%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.rs
index 0443b0f..3ab222c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInDenominator;
+rs_allocation gAllocInX;
 
-float __attribute__((kernel)) testNativeAtan2FloatFloatFloat(float inNumerator, unsigned int x) {
-    float inDenominator = rsGetElementAt_float(gAllocInDenominator, x);
-    return native_atan2(inNumerator, inDenominator);
+float __attribute__((kernel)) testNativeAtan2FloatFloatFloat(float inY, unsigned int x) {
+    float inX = rsGetElementAt_float(gAllocInX, x);
+    return native_atan2(inY, inX);
 }
 
-float2 __attribute__((kernel)) testNativeAtan2Float2Float2Float2(float2 inNumerator, unsigned int x) {
-    float2 inDenominator = rsGetElementAt_float2(gAllocInDenominator, x);
-    return native_atan2(inNumerator, inDenominator);
+float2 __attribute__((kernel)) testNativeAtan2Float2Float2Float2(float2 inY, unsigned int x) {
+    float2 inX = rsGetElementAt_float2(gAllocInX, x);
+    return native_atan2(inY, inX);
 }
 
-float3 __attribute__((kernel)) testNativeAtan2Float3Float3Float3(float3 inNumerator, unsigned int x) {
-    float3 inDenominator = rsGetElementAt_float3(gAllocInDenominator, x);
-    return native_atan2(inNumerator, inDenominator);
+float3 __attribute__((kernel)) testNativeAtan2Float3Float3Float3(float3 inY, unsigned int x) {
+    float3 inX = rsGetElementAt_float3(gAllocInX, x);
+    return native_atan2(inY, inX);
 }
 
-float4 __attribute__((kernel)) testNativeAtan2Float4Float4Float4(float4 inNumerator, unsigned int x) {
-    float4 inDenominator = rsGetElementAt_float4(gAllocInDenominator, x);
-    return native_atan2(inNumerator, inDenominator);
+float4 __attribute__((kernel)) testNativeAtan2Float4Float4Float4(float4 inY, unsigned int x) {
+    float4 inX = rsGetElementAt_float4(gAllocInX, x);
+    return native_atan2(inY, inX);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2Relaxed.rs
index 6660366..40e8b3e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeAtan2.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2pi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.java
similarity index 66%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2pi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.java
index 03a7e87..dd62b78 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtan2pi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeAtan2pi extends RSBaseCompute {
+public class TestNativeAtan2pi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeAtan2pi script;
-    private ScriptC_GeneratedTestNativeAtan2piRelaxed scriptRelaxed;
+    private ScriptC_TestNativeAtan2pi script;
+    private ScriptC_TestNativeAtan2piRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeAtan2pi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeAtan2piRelaxed(mRS);
+        script = new ScriptC_TestNativeAtan2pi(mRS);
+        scriptRelaxed = new ScriptC_TestNativeAtan2piRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inNumerator;
-        public float inDenominator;
+        public float inY;
+        public float inX;
         public Target.Floaty out;
     }
 
     private void checkNativeAtan2piFloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc2172a04694fc108l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd63229f70853dc01l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x39c4f8fd35fc5dc8l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x39c4f8fd35fc5dc7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testNativeAtan2piFloatFloatFloat(inNumerator, out);
-            verifyResultsNativeAtan2piFloatFloatFloat(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testNativeAtan2piFloatFloatFloat(inY, out);
+            verifyResultsNativeAtan2piFloatFloatFloat(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2piFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testNativeAtan2piFloatFloatFloat(inNumerator, out);
-            verifyResultsNativeAtan2piFloatFloatFloat(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testNativeAtan2piFloatFloatFloat(inY, out);
+            verifyResultsNativeAtan2piFloatFloatFloat(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2piFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtan2piFloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 1];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 1];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsNativeAtan2piFloatFloatFloat(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i];
-                args.inDenominator = arrayInDenominator[i];
+                args.inY = arrayInY[i];
+                args.inX = arrayInX[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtan2pi(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkNativeAtan2piFloat2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x305d06618853bce2l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4cc6c68c0c19e58bl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6aff980c8d47a3e2l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6aff980c8d47a3e1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testNativeAtan2piFloat2Float2Float2(inNumerator, out);
-            verifyResultsNativeAtan2piFloat2Float2Float2(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testNativeAtan2piFloat2Float2Float2(inY, out);
+            verifyResultsNativeAtan2piFloat2Float2Float2(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2piFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testNativeAtan2piFloat2Float2Float2(inNumerator, out);
-            verifyResultsNativeAtan2piFloat2Float2Float2(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testNativeAtan2piFloat2Float2Float2(inY, out);
+            verifyResultsNativeAtan2piFloat2Float2Float2(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2piFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtan2piFloat2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 2];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 2];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsNativeAtan2piFloat2Float2Float2(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 2 + j];
-                args.inDenominator = arrayInDenominator[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtan2pi(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkNativeAtan2piFloat3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbebaf9b2b1fa8e3l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x162b07d4def578c4l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbf64762c8f25a583l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbf64762c8f25a582l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testNativeAtan2piFloat3Float3Float3(inNumerator, out);
-            verifyResultsNativeAtan2piFloat3Float3Float3(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testNativeAtan2piFloat3Float3Float3(inY, out);
+            verifyResultsNativeAtan2piFloat3Float3Float3(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2piFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testNativeAtan2piFloat3Float3Float3(inNumerator, out);
-            verifyResultsNativeAtan2piFloat3Float3Float3(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testNativeAtan2piFloat3Float3Float3(inY, out);
+            verifyResultsNativeAtan2piFloat3Float3Float3(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2piFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtan2piFloat3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsNativeAtan2piFloat3Float3Float3(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtan2pi(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkNativeAtan2piFloat4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe77a58d4cdeb94e4l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdf8f491db1d10bfdl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x13c9544c9103a724l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x13c9544c9103a723l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testNativeAtan2piFloat4Float4Float4(inNumerator, out);
-            verifyResultsNativeAtan2piFloat4Float4Float4(inNumerator, inDenominator, out, false);
+            script.set_gAllocInX(inX);
+            script.forEach_testNativeAtan2piFloat4Float4Float4(inY, out);
+            verifyResultsNativeAtan2piFloat4Float4Float4(inY, inX, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2piFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testNativeAtan2piFloat4Float4Float4(inNumerator, out);
-            verifyResultsNativeAtan2piFloat4Float4Float4(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInX(inX);
+            scriptRelaxed.forEach_testNativeAtan2piFloat4Float4Float4(inY, out);
+            verifyResultsNativeAtan2piFloat4Float4Float4(inY, inX, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtan2piFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtan2piFloat4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsNativeAtan2piFloat4Float4Float4(Allocation inY, Allocation inX, Allocation out, boolean relaxed) {
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtan2pi(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.rs
new file mode 100644
index 0000000..ea3e3f9
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.rs
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocInX;
+
+float __attribute__((kernel)) testNativeAtan2piFloatFloatFloat(float inY, unsigned int x) {
+    float inX = rsGetElementAt_float(gAllocInX, x);
+    return native_atan2pi(inY, inX);
+}
+
+float2 __attribute__((kernel)) testNativeAtan2piFloat2Float2Float2(float2 inY, unsigned int x) {
+    float2 inX = rsGetElementAt_float2(gAllocInX, x);
+    return native_atan2pi(inY, inX);
+}
+
+float3 __attribute__((kernel)) testNativeAtan2piFloat3Float3Float3(float3 inY, unsigned int x) {
+    float3 inX = rsGetElementAt_float3(gAllocInX, x);
+    return native_atan2pi(inY, inX);
+}
+
+float4 __attribute__((kernel)) testNativeAtan2piFloat4Float4Float4(float4 inY, unsigned int x) {
+    float4 inX = rsGetElementAt_float4(gAllocInX, x);
+    return native_atan2pi(inY, inX);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2piRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2piRelaxed.rs
index 6660366..e301936 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2piRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeAtan2pi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanRelaxed.rs
index 6660366..083f168 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeAtan.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.java
similarity index 79%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.java
index db2f189..6161483 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeAtanh extends RSBaseCompute {
+public class TestNativeAtanh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeAtanh script;
-    private ScriptC_GeneratedTestNativeAtanhRelaxed scriptRelaxed;
+    private ScriptC_TestNativeAtanh script;
+    private ScriptC_TestNativeAtanhRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeAtanh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeAtanhRelaxed(mRS);
+        script = new ScriptC_TestNativeAtanh(mRS);
+        scriptRelaxed = new ScriptC_TestNativeAtanhRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float inIn;
         public Target.Floaty out;
     }
 
     private void checkNativeAtanhFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x46ba02a2e7004d04l, -1, 1);
+        Allocation inIn = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe13e715ccd0cedebl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeAtanhFloatFloat(inV, out);
-            verifyResultsNativeAtanhFloatFloat(inV, out, false);
+            script.forEach_testNativeAtanhFloatFloat(inIn, out);
+            verifyResultsNativeAtanhFloatFloat(inIn, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtanhFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAtanhFloatFloat(inV, out);
-            verifyResultsNativeAtanhFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeAtanhFloatFloat(inIn, out);
+            verifyResultsNativeAtanhFloatFloat(inIn, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtanhFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtanhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAtanhFloatFloat(Allocation inIn, Allocation out, boolean relaxed) {
+        float[] arrayInIn = new float[INPUTSIZE * 1];
+        inIn.copyTo(arrayInIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.inIn = arrayInIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtanh(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inIn: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inIn, Float.floatToRawIntBits(args.inIn), args.inIn));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeAtanhFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd557bfdd35a682c8l, -1, 1);
+        Allocation inIn = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd5bd3a2802f7f5d7l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeAtanhFloat2Float2(inV, out);
-            verifyResultsNativeAtanhFloat2Float2(inV, out, false);
+            script.forEach_testNativeAtanhFloat2Float2(inIn, out);
+            verifyResultsNativeAtanhFloat2Float2(inIn, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtanhFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAtanhFloat2Float2(inV, out);
-            verifyResultsNativeAtanhFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeAtanhFloat2Float2(inIn, out);
+            verifyResultsNativeAtanhFloat2Float2(inIn, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtanhFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtanhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAtanhFloat2Float2(Allocation inIn, Allocation out, boolean relaxed) {
+        float[] arrayInIn = new float[INPUTSIZE * 2];
+        inIn.copyTo(arrayInIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.inIn = arrayInIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtanh(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inIn: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inIn, Float.floatToRawIntBits(args.inIn), args.inIn));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeAtanhFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd55988f82bc1a3a6l, -1, 1);
+        Allocation inIn = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd60a01af59867b21l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeAtanhFloat3Float3(inV, out);
-            verifyResultsNativeAtanhFloat3Float3(inV, out, false);
+            script.forEach_testNativeAtanhFloat3Float3(inIn, out);
+            verifyResultsNativeAtanhFloat3Float3(inIn, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtanhFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAtanhFloat3Float3(inV, out);
-            verifyResultsNativeAtanhFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeAtanhFloat3Float3(inIn, out);
+            verifyResultsNativeAtanhFloat3Float3(inIn, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtanhFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtanhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAtanhFloat3Float3(Allocation inIn, Allocation out, boolean relaxed) {
+        float[] arrayInIn = new float[INPUTSIZE * 4];
+        inIn.copyTo(arrayInIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.inIn = arrayInIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtanh(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inIn: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inIn, Float.floatToRawIntBits(args.inIn), args.inIn));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeAtanhFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd55b521321dcc484l, -1, 1);
+        Allocation inIn = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd656c936b015006bl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeAtanhFloat4Float4(inV, out);
-            verifyResultsNativeAtanhFloat4Float4(inV, out, false);
+            script.forEach_testNativeAtanhFloat4Float4(inIn, out);
+            verifyResultsNativeAtanhFloat4Float4(inIn, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtanhFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeAtanhFloat4Float4(inV, out);
-            verifyResultsNativeAtanhFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeAtanhFloat4Float4(inIn, out);
+            verifyResultsNativeAtanhFloat4Float4(inIn, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeAtanhFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeAtanhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeAtanhFloat4Float4(Allocation inIn, Allocation out, boolean relaxed) {
+        float[] arrayInIn = new float[INPUTSIZE * 4];
+        inIn.copyTo(arrayInIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.inIn = arrayInIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeAtanh(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inIn: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inIn, Float.floatToRawIntBits(args.inIn), args.inIn));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanh.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.rs
similarity index 86%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanh.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.rs
index 7c20382..de772e7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanh.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeAtanhFloatFloat(float inV) {
-    return native_atanh(inV);
+float __attribute__((kernel)) testNativeAtanhFloatFloat(float inIn) {
+    return native_atanh(inIn);
 }
 
-float2 __attribute__((kernel)) testNativeAtanhFloat2Float2(float2 inV) {
-    return native_atanh(inV);
+float2 __attribute__((kernel)) testNativeAtanhFloat2Float2(float2 inIn) {
+    return native_atanh(inIn);
 }
 
-float3 __attribute__((kernel)) testNativeAtanhFloat3Float3(float3 inV) {
-    return native_atanh(inV);
+float3 __attribute__((kernel)) testNativeAtanhFloat3Float3(float3 inIn) {
+    return native_atanh(inIn);
 }
 
-float4 __attribute__((kernel)) testNativeAtanhFloat4Float4(float4 inV) {
-    return native_atanh(inV);
+float4 __attribute__((kernel)) testNativeAtanhFloat4Float4(float4 inIn) {
+    return native_atanh(inIn);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanhRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanhRelaxed.rs
index 6660366..40442c7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanhRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeAtanh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanpi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.java
index 35be2e7..1e88568 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeAtanpi extends RSBaseCompute {
+public class TestNativeAtanpi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeAtanpi script;
-    private ScriptC_GeneratedTestNativeAtanpiRelaxed scriptRelaxed;
+    private ScriptC_TestNativeAtanpi script;
+    private ScriptC_TestNativeAtanpiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeAtanpi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeAtanpiRelaxed(mRS);
+        script = new ScriptC_TestNativeAtanpi(mRS);
+        scriptRelaxed = new ScriptC_TestNativeAtanpiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanpi.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeAtanpi.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpiRelaxed.rs
index 6660366..7758862 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeAtanpi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCbrt.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCbrt.java
similarity index 77%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCbrt.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCbrt.java
index 0a2b1fb..cd6a030 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCbrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCbrt.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeCbrt extends RSBaseCompute {
+public class TestNativeCbrt extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeCbrt script;
-    private ScriptC_GeneratedTestNativeCbrtRelaxed scriptRelaxed;
+    private ScriptC_TestNativeCbrt script;
+    private ScriptC_TestNativeCbrtRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeCbrt(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeCbrtRelaxed(mRS);
+        script = new ScriptC_TestNativeCbrt(mRS);
+        scriptRelaxed = new ScriptC_TestNativeCbrtRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeCbrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa1d3335118086389l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6eed1901e2ca9d19l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeCbrtFloatFloat(inV, out);
-            verifyResultsNativeCbrtFloatFloat(inV, out, false);
+            script.forEach_testNativeCbrtFloatFloat(in, out);
+            verifyResultsNativeCbrtFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCbrtFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCbrtFloatFloat(inV, out);
-            verifyResultsNativeCbrtFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeCbrtFloatFloat(in, out);
+            verifyResultsNativeCbrtFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCbrtFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCbrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCbrtFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCbrt(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeCbrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xce4859fd59112965l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2e78c09abaa124adl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeCbrtFloat2Float2(inV, out);
-            verifyResultsNativeCbrtFloat2Float2(inV, out, false);
+            script.forEach_testNativeCbrtFloat2Float2(in, out);
+            verifyResultsNativeCbrtFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCbrtFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCbrtFloat2Float2(inV, out);
-            verifyResultsNativeCbrtFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeCbrtFloat2Float2(in, out);
+            verifyResultsNativeCbrtFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCbrtFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCbrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCbrtFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCbrt(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeCbrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xce4a23184f2c4a43l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2e78cb3c19a7ba47l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeCbrtFloat3Float3(inV, out);
-            verifyResultsNativeCbrtFloat3Float3(inV, out, false);
+            script.forEach_testNativeCbrtFloat3Float3(in, out);
+            verifyResultsNativeCbrtFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCbrtFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCbrtFloat3Float3(inV, out);
-            verifyResultsNativeCbrtFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeCbrtFloat3Float3(in, out);
+            verifyResultsNativeCbrtFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCbrtFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCbrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCbrtFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCbrt(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeCbrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xce4bec3345476b21l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2e78d5dd78ae4fe1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeCbrtFloat4Float4(inV, out);
-            verifyResultsNativeCbrtFloat4Float4(inV, out, false);
+            script.forEach_testNativeCbrtFloat4Float4(in, out);
+            verifyResultsNativeCbrtFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCbrtFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCbrtFloat4Float4(inV, out);
-            verifyResultsNativeCbrtFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeCbrtFloat4Float4(in, out);
+            verifyResultsNativeCbrtFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCbrtFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCbrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCbrtFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCbrt(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCbrt.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCbrt.rs
similarity index 82%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCbrt.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCbrt.rs
index 9b8e4e9..828214b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCbrt.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCbrt.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeCbrtFloatFloat(float inV) {
-    return native_cbrt(inV);
+float __attribute__((kernel)) testNativeCbrtFloatFloat(float in) {
+    return native_cbrt(in);
 }
 
-float2 __attribute__((kernel)) testNativeCbrtFloat2Float2(float2 inV) {
-    return native_cbrt(inV);
+float2 __attribute__((kernel)) testNativeCbrtFloat2Float2(float2 in) {
+    return native_cbrt(in);
 }
 
-float3 __attribute__((kernel)) testNativeCbrtFloat3Float3(float3 inV) {
-    return native_cbrt(inV);
+float3 __attribute__((kernel)) testNativeCbrtFloat3Float3(float3 in) {
+    return native_cbrt(in);
 }
 
-float4 __attribute__((kernel)) testNativeCbrtFloat4Float4(float4 inV) {
-    return native_cbrt(inV);
+float4 __attribute__((kernel)) testNativeCbrtFloat4Float4(float4 in) {
+    return native_cbrt(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCbrtRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCbrtRelaxed.rs
index 6660366..2a49b9e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCbrtRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeCbrt.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCos.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCos.java
similarity index 77%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCos.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCos.java
index 70c734e..d7c9ebf 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCos.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeCos extends RSBaseCompute {
+public class TestNativeCos extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeCos script;
-    private ScriptC_GeneratedTestNativeCosRelaxed scriptRelaxed;
+    private ScriptC_TestNativeCos script;
+    private ScriptC_TestNativeCosRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeCos(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeCosRelaxed(mRS);
+        script = new ScriptC_TestNativeCos(mRS);
+        scriptRelaxed = new ScriptC_TestNativeCosRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeCosFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2f317381777f3495l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x95ef4a20c73e7e3dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeCosFloatFloat(inV, out);
-            verifyResultsNativeCosFloatFloat(inV, out, false);
+            script.forEach_testNativeCosFloatFloat(in, out);
+            verifyResultsNativeCosFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCosFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCosFloatFloat(inV, out);
-            verifyResultsNativeCosFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeCosFloatFloat(in, out);
+            verifyResultsNativeCosFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCosFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCosFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCosFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCos(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeCosFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdc05f75eda3d0911l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xed4d88bac39641b1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeCosFloat2Float2(inV, out);
-            verifyResultsNativeCosFloat2Float2(inV, out, false);
+            script.forEach_testNativeCosFloat2Float2(in, out);
+            verifyResultsNativeCosFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCosFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCosFloat2Float2(inV, out);
-            verifyResultsNativeCosFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeCosFloat2Float2(in, out);
+            verifyResultsNativeCosFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCosFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCosFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCosFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCos(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeCosFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdc07c079d05829efl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xed4d935c229cd74bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeCosFloat3Float3(inV, out);
-            verifyResultsNativeCosFloat3Float3(inV, out, false);
+            script.forEach_testNativeCosFloat3Float3(in, out);
+            verifyResultsNativeCosFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCosFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCosFloat3Float3(inV, out);
-            verifyResultsNativeCosFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeCosFloat3Float3(in, out);
+            verifyResultsNativeCosFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCosFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCosFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCosFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCos(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeCosFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdc098994c6734acdl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xed4d9dfd81a36ce5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeCosFloat4Float4(inV, out);
-            verifyResultsNativeCosFloat4Float4(inV, out, false);
+            script.forEach_testNativeCosFloat4Float4(in, out);
+            verifyResultsNativeCosFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCosFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCosFloat4Float4(inV, out);
-            verifyResultsNativeCosFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeCosFloat4Float4(in, out);
+            verifyResultsNativeCosFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCosFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCosFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCosFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCos(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCos.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCos.rs
similarity index 83%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCos.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCos.rs
index d608991..212c12e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCos.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCos.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeCosFloatFloat(float inV) {
-    return native_cos(inV);
+float __attribute__((kernel)) testNativeCosFloatFloat(float in) {
+    return native_cos(in);
 }
 
-float2 __attribute__((kernel)) testNativeCosFloat2Float2(float2 inV) {
-    return native_cos(inV);
+float2 __attribute__((kernel)) testNativeCosFloat2Float2(float2 in) {
+    return native_cos(in);
 }
 
-float3 __attribute__((kernel)) testNativeCosFloat3Float3(float3 inV) {
-    return native_cos(inV);
+float3 __attribute__((kernel)) testNativeCosFloat3Float3(float3 in) {
+    return native_cos(in);
 }
 
-float4 __attribute__((kernel)) testNativeCosFloat4Float4(float4 inV) {
-    return native_cos(inV);
+float4 __attribute__((kernel)) testNativeCosFloat4Float4(float4 in) {
+    return native_cos(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCosRelaxed.rs
similarity index 95%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCosRelaxed.rs
index 6660366..66f3fef 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCosRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeCos.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCosh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCosh.java
similarity index 77%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCosh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCosh.java
index 1ca49c5..4e841c6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCosh.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeCosh extends RSBaseCompute {
+public class TestNativeCosh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeCosh script;
-    private ScriptC_GeneratedTestNativeCoshRelaxed scriptRelaxed;
+    private ScriptC_TestNativeCosh script;
+    private ScriptC_TestNativeCoshRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeCosh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeCoshRelaxed(mRS);
+        script = new ScriptC_TestNativeCosh(mRS);
+        scriptRelaxed = new ScriptC_TestNativeCoshRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeCoshFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7bb5784aa43ffcf5l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xeb1020909e9c475dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeCoshFloatFloat(inV, out);
-            verifyResultsNativeCoshFloatFloat(inV, out, false);
+            script.forEach_testNativeCoshFloatFloat(in, out);
+            verifyResultsNativeCoshFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCoshFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCoshFloatFloat(inV, out);
-            verifyResultsNativeCoshFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeCoshFloatFloat(in, out);
+            verifyResultsNativeCoshFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCoshFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCoshFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCoshFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCosh(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeCoshFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x818c886316a44671l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc77a568547f7e9d1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeCoshFloat2Float2(inV, out);
-            verifyResultsNativeCoshFloat2Float2(inV, out, false);
+            script.forEach_testNativeCoshFloat2Float2(in, out);
+            verifyResultsNativeCoshFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCoshFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCoshFloat2Float2(inV, out);
-            verifyResultsNativeCoshFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeCoshFloat2Float2(in, out);
+            verifyResultsNativeCoshFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCoshFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCoshFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCoshFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCosh(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeCoshFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x818e517e0cbf674fl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc77a6126a6fe7f6bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeCoshFloat3Float3(inV, out);
-            verifyResultsNativeCoshFloat3Float3(inV, out, false);
+            script.forEach_testNativeCoshFloat3Float3(in, out);
+            verifyResultsNativeCoshFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCoshFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCoshFloat3Float3(inV, out);
-            verifyResultsNativeCoshFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeCoshFloat3Float3(in, out);
+            verifyResultsNativeCoshFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCoshFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCoshFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCoshFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCosh(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeCoshFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x81901a9902da882dl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc77a6bc806051505l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeCoshFloat4Float4(inV, out);
-            verifyResultsNativeCoshFloat4Float4(inV, out, false);
+            script.forEach_testNativeCoshFloat4Float4(in, out);
+            verifyResultsNativeCoshFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCoshFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCoshFloat4Float4(inV, out);
-            verifyResultsNativeCoshFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeCoshFloat4Float4(in, out);
+            verifyResultsNativeCoshFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCoshFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCoshFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCoshFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCosh(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCosh.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCosh.rs
similarity index 82%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCosh.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCosh.rs
index 665e915..f3635d8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCosh.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCosh.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeCoshFloatFloat(float inV) {
-    return native_cosh(inV);
+float __attribute__((kernel)) testNativeCoshFloatFloat(float in) {
+    return native_cosh(in);
 }
 
-float2 __attribute__((kernel)) testNativeCoshFloat2Float2(float2 inV) {
-    return native_cosh(inV);
+float2 __attribute__((kernel)) testNativeCoshFloat2Float2(float2 in) {
+    return native_cosh(in);
 }
 
-float3 __attribute__((kernel)) testNativeCoshFloat3Float3(float3 inV) {
-    return native_cosh(inV);
+float3 __attribute__((kernel)) testNativeCoshFloat3Float3(float3 in) {
+    return native_cosh(in);
 }
 
-float4 __attribute__((kernel)) testNativeCoshFloat4Float4(float4 inV) {
-    return native_cosh(inV);
+float4 __attribute__((kernel)) testNativeCoshFloat4Float4(float4 in) {
+    return native_cosh(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCoshRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCoshRelaxed.rs
index 6660366..138b5c2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCoshRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeCosh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCospi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCospi.java
similarity index 79%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCospi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCospi.java
index 72a5c5d..ab5065b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCospi.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeCospi extends RSBaseCompute {
+public class TestNativeCospi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeCospi script;
-    private ScriptC_GeneratedTestNativeCospiRelaxed scriptRelaxed;
+    private ScriptC_TestNativeCospi script;
+    private ScriptC_TestNativeCospiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeCospi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeCospiRelaxed(mRS);
+        script = new ScriptC_TestNativeCospi(mRS);
+        scriptRelaxed = new ScriptC_TestNativeCospiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeCospiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2614541c9b86df38l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x8fc4f0187aafc9a6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeCospiFloatFloat(inV, out);
-            verifyResultsNativeCospiFloatFloat(inV, out, false);
+            script.forEach_testNativeCospiFloatFloat(in, out);
+            verifyResultsNativeCospiFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCospiFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCospiFloatFloat(inV, out);
-            verifyResultsNativeCospiFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeCospiFloatFloat(in, out);
+            verifyResultsNativeCospiFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCospiFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCospiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCospiFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCospi(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeCospiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8ae37e6159c7c5cl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x656942c9d0dfeb12l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeCospiFloat2Float2(inV, out);
-            verifyResultsNativeCospiFloat2Float2(inV, out, false);
+            script.forEach_testNativeCospiFloat2Float2(in, out);
+            verifyResultsNativeCospiFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCospiFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCospiFloat2Float2(inV, out);
-            verifyResultsNativeCospiFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeCospiFloat2Float2(in, out);
+            verifyResultsNativeCospiFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCospiFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCospiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCospiFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCospi(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeCospiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8b001010bb79d3al, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x65694d6b2fe680acl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeCospiFloat3Float3(inV, out);
-            verifyResultsNativeCospiFloat3Float3(inV, out, false);
+            script.forEach_testNativeCospiFloat3Float3(in, out);
+            verifyResultsNativeCospiFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCospiFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCospiFloat3Float3(inV, out);
-            verifyResultsNativeCospiFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeCospiFloat3Float3(in, out);
+            verifyResultsNativeCospiFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCospiFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCospiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCospiFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCospi(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeCospiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8b1ca1c01d2be18l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6569580c8eed1646l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeCospiFloat4Float4(inV, out);
-            verifyResultsNativeCospiFloat4Float4(inV, out, false);
+            script.forEach_testNativeCospiFloat4Float4(in, out);
+            verifyResultsNativeCospiFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCospiFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeCospiFloat4Float4(inV, out);
-            verifyResultsNativeCospiFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeCospiFloat4Float4(in, out);
+            verifyResultsNativeCospiFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeCospiFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeCospiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeCospiFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeCospi(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCospi.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCospi.rs
similarity index 87%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCospi.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCospi.rs
index dab1603..471403f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeCospi.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCospi.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeCospiFloatFloat(float inV) {
-    return native_cospi(inV);
+float __attribute__((kernel)) testNativeCospiFloatFloat(float in) {
+    return native_cospi(in);
 }
 
-float2 __attribute__((kernel)) testNativeCospiFloat2Float2(float2 inV) {
-    return native_cospi(inV);
+float2 __attribute__((kernel)) testNativeCospiFloat2Float2(float2 in) {
+    return native_cospi(in);
 }
 
-float3 __attribute__((kernel)) testNativeCospiFloat3Float3(float3 inV) {
-    return native_cospi(inV);
+float3 __attribute__((kernel)) testNativeCospiFloat3Float3(float3 in) {
+    return native_cospi(in);
 }
 
-float4 __attribute__((kernel)) testNativeCospiFloat4Float4(float4 inV) {
-    return native_cospi(inV);
+float4 __attribute__((kernel)) testNativeCospiFloat4Float4(float4 in) {
+    return native_cospi(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCospiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeCospiRelaxed.rs
index 6660366..f72429e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeCospiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeCospi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDistance.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDistance.java
similarity index 65%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDistance.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeDistance.java
index 17ebe90..360da34 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDistance.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDistance.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeDistance extends RSBaseCompute {
+public class TestNativeDistance extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeDistance script;
-    private ScriptC_GeneratedTestNativeDistanceRelaxed scriptRelaxed;
+    private ScriptC_TestNativeDistance script;
+    private ScriptC_TestNativeDistanceRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeDistance(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeDistanceRelaxed(mRS);
+        script = new ScriptC_TestNativeDistance(mRS);
+        scriptRelaxed = new ScriptC_TestNativeDistanceRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inLeftVector;
-        public float inRightVector;
+        public float inLhs;
+        public float inRhs;
         public Target.Floaty out;
     }
 
     private void checkNativeDistanceFloatFloatFloat() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb61d5ec530ae2337l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x98c2c48c9b58b3c2l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe0fd4252f8556ff6l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe0fd4252f8559b4cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testNativeDistanceFloatFloatFloat(inLeftVector, out);
-            verifyResultsNativeDistanceFloatFloatFloat(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testNativeDistanceFloatFloatFloat(inLhs, out);
+            verifyResultsNativeDistanceFloatFloatFloat(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testNativeDistanceFloatFloatFloat(inLeftVector, out);
-            verifyResultsNativeDistanceFloatFloatFloat(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testNativeDistanceFloatFloatFloat(inLhs, out);
+            verifyResultsNativeDistanceFloatFloatFloat(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeDistanceFloatFloatFloat(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 1];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 1];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsNativeDistanceFloatFloatFloat(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 1];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 1];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
             // Create the appropriate sized arrays in args
             // Fill args with the input values
-            args.inLeftVector = arrayInLeftVector[i];
-            args.inRightVector = arrayInRightVector[i];
+            args.inLhs = arrayInLhs[i];
+            args.inRhs = arrayInRhs[i];
             Target target = new Target(relaxed);
             CoreMathVerifier.computeNativeDistance(args, target);
 
@@ -84,13 +84,13 @@
             }
             if (!valid) {
                 StringBuilder message = new StringBuilder();
-                message.append("Input inLeftVector: ");
+                message.append("Input inLhs: ");
                 message.append(String.format("%14.8g {%8x} %15a",
-                        arrayInLeftVector[i], Float.floatToRawIntBits(arrayInLeftVector[i]), arrayInLeftVector[i]));
+                        arrayInLhs[i], Float.floatToRawIntBits(arrayInLhs[i]), arrayInLhs[i]));
                 message.append("\n");
-                message.append("Input inRightVector: ");
+                message.append("Input inRhs: ");
                 message.append(String.format("%14.8g {%8x} %15a",
-                        arrayInRightVector[i], Float.floatToRawIntBits(arrayInRightVector[i]), arrayInRightVector[i]));
+                        arrayInRhs[i], Float.floatToRawIntBits(arrayInRhs[i]), arrayInRhs[i]));
                 message.append("\n");
                 message.append("Expected output out: ");
                 message.append(args.out.toString());
@@ -109,50 +109,50 @@
     }
 
     public class ArgumentsFloatNFloatNFloat {
-        public float[] inLeftVector;
-        public float[] inRightVector;
+        public float[] inLhs;
+        public float[] inRhs;
         public Target.Floaty out;
     }
 
     private void checkNativeDistanceFloat2Float2Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xef86e1d727286713l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3d7bc89101e219b6l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x28a9ea2ea1fd926al, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x28a9ea2ea1fdbdc0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testNativeDistanceFloat2Float2Float(inLeftVector, out);
-            verifyResultsNativeDistanceFloat2Float2Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testNativeDistanceFloat2Float2Float(inLhs, out);
+            verifyResultsNativeDistanceFloat2Float2Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat2Float2Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testNativeDistanceFloat2Float2Float(inLeftVector, out);
-            verifyResultsNativeDistanceFloat2Float2Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testNativeDistanceFloat2Float2Float(inLhs, out);
+            verifyResultsNativeDistanceFloat2Float2Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat2Float2Float: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeDistanceFloat2Float2Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 2];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 2];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsNativeDistanceFloat2Float2Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 2];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 2];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[2];
-            args.inRightVector = new float[2];
+            args.inLhs = new float[2];
+            args.inRhs = new float[2];
             // Fill args with the input values
             for (int j = 0; j < 2 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 2 + j];
+                args.inLhs[j] = arrayInLhs[i * 2 + j];
             }
             for (int j = 0; j < 2 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 2 + j];
+                args.inRhs[j] = arrayInRhs[i * 2 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeNativeDistance(args, target);
@@ -165,15 +165,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 2 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 2 + j]), arrayInLeftVector[i * 2 + j]));
+                            arrayInLhs[i * 2 + j], Float.floatToRawIntBits(arrayInLhs[i * 2 + j]), arrayInLhs[i * 2 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 2 + j], Float.floatToRawIntBits(arrayInRightVector[i * 2 + j]), arrayInRightVector[i * 2 + j]));
+                            arrayInRhs[i * 2 + j], Float.floatToRawIntBits(arrayInRhs[i * 2 + j]), arrayInRhs[i * 2 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
@@ -193,44 +193,44 @@
     }
 
     private void checkNativeDistanceFloat3Float3Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbe30075548c71b61l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf3e514c0a78a62d0l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x559b398ef213adc4l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x559b398ef213d91al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testNativeDistanceFloat3Float3Float(inLeftVector, out);
-            verifyResultsNativeDistanceFloat3Float3Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testNativeDistanceFloat3Float3Float(inLhs, out);
+            verifyResultsNativeDistanceFloat3Float3Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat3Float3Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testNativeDistanceFloat3Float3Float(inLeftVector, out);
-            verifyResultsNativeDistanceFloat3Float3Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testNativeDistanceFloat3Float3Float(inLhs, out);
+            verifyResultsNativeDistanceFloat3Float3Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat3Float3Float: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeDistanceFloat3Float3Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsNativeDistanceFloat3Float3Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[3];
-            args.inRightVector = new float[3];
+            args.inLhs = new float[3];
+            args.inRhs = new float[3];
             // Fill args with the input values
             for (int j = 0; j < 3 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
+                args.inLhs[j] = arrayInLhs[i * 4 + j];
             }
             for (int j = 0; j < 3 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 4 + j];
+                args.inRhs[j] = arrayInRhs[i * 4 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeNativeDistance(args, target);
@@ -243,15 +243,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 4 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 4 + j]), arrayInLeftVector[i * 4 + j]));
+                            arrayInLhs[i * 4 + j], Float.floatToRawIntBits(arrayInLhs[i * 4 + j]), arrayInLhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 4 + j], Float.floatToRawIntBits(arrayInRightVector[i * 4 + j]), arrayInRightVector[i * 4 + j]));
+                            arrayInRhs[i * 4 + j], Float.floatToRawIntBits(arrayInRhs[i * 4 + j]), arrayInRhs[i * 4 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
@@ -271,44 +271,44 @@
     }
 
     private void checkNativeDistanceFloat4Float4Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8cd92cd36a65cfafl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xaa4e60f04d32abeal, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x828c88ef4229c91el, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x828c88ef4229f474l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testNativeDistanceFloat4Float4Float(inLeftVector, out);
-            verifyResultsNativeDistanceFloat4Float4Float(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testNativeDistanceFloat4Float4Float(inLhs, out);
+            verifyResultsNativeDistanceFloat4Float4Float(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat4Float4Float: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testNativeDistanceFloat4Float4Float(inLeftVector, out);
-            verifyResultsNativeDistanceFloat4Float4Float(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testNativeDistanceFloat4Float4Float(inLhs, out);
+            verifyResultsNativeDistanceFloat4Float4Float(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat4Float4Float: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeDistanceFloat4Float4Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsNativeDistanceFloat4Float4Float(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
-            args.inLeftVector = new float[4];
-            args.inRightVector = new float[4];
+            args.inLhs = new float[4];
+            args.inRhs = new float[4];
             // Fill args with the input values
             for (int j = 0; j < 4 ; j++) {
-                args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
+                args.inLhs[j] = arrayInLhs[i * 4 + j];
             }
             for (int j = 0; j < 4 ; j++) {
-                args.inRightVector[j] = arrayInRightVector[i * 4 + j];
+                args.inRhs[j] = arrayInRhs[i * 4 + j];
             }
             Target target = new Target(relaxed);
             CoreMathVerifier.computeNativeDistance(args, target);
@@ -321,15 +321,15 @@
             if (!valid) {
                 StringBuilder message = new StringBuilder();
                 for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInLeftVector[i * 4 + j], Float.floatToRawIntBits(arrayInLeftVector[i * 4 + j]), arrayInLeftVector[i * 4 + j]));
+                            arrayInLhs[i * 4 + j], Float.floatToRawIntBits(arrayInLhs[i * 4 + j]), arrayInLhs[i * 4 + j]));
                     message.append("\n");
                 }
                 for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayInRightVector[i * 4 + j], Float.floatToRawIntBits(arrayInRightVector[i * 4 + j]), arrayInRightVector[i * 4 + j]));
+                            arrayInRhs[i * 4 + j], Float.floatToRawIntBits(arrayInRhs[i * 4 + j]), arrayInRhs[i * 4 + j]));
                     message.append("\n");
                 }
                 message.append("Expected output out: ");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDistance.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDistance.rs
new file mode 100644
index 0000000..d9c215c
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDistance.rs
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocInRhs;
+
+float __attribute__((kernel)) testNativeDistanceFloatFloatFloat(float inLhs, unsigned int x) {
+    float inRhs = rsGetElementAt_float(gAllocInRhs, x);
+    return native_distance(inLhs, inRhs);
+}
+
+float __attribute__((kernel)) testNativeDistanceFloat2Float2Float(float2 inLhs, unsigned int x) {
+    float2 inRhs = rsGetElementAt_float2(gAllocInRhs, x);
+    return native_distance(inLhs, inRhs);
+}
+
+float __attribute__((kernel)) testNativeDistanceFloat3Float3Float(float3 inLhs, unsigned int x) {
+    float3 inRhs = rsGetElementAt_float3(gAllocInRhs, x);
+    return native_distance(inLhs, inRhs);
+}
+
+float __attribute__((kernel)) testNativeDistanceFloat4Float4Float(float4 inLhs, unsigned int x) {
+    float4 inRhs = rsGetElementAt_float4(gAllocInRhs, x);
+    return native_distance(inLhs, inRhs);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDistanceRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeDistanceRelaxed.rs
index 6660366..167b79a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDistanceRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeDistance.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDivide.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDivide.java
similarity index 66%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDivide.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeDivide.java
index f8ae8e5..c546724 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeDivide.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDivide.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeDivide extends RSBaseCompute {
+public class TestNativeDivide extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeDivide script;
-    private ScriptC_GeneratedTestNativeDivideRelaxed scriptRelaxed;
+    private ScriptC_TestNativeDivide script;
+    private ScriptC_TestNativeDivideRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeDivide(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeDivideRelaxed(mRS);
+        script = new ScriptC_TestNativeDivide(mRS);
+        scriptRelaxed = new ScriptC_TestNativeDivideRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inLeftVector;
-        public float inRightVector;
+        public float inLhs;
+        public float inRhs;
         public Target.Floaty out;
     }
 
     private void checkNativeDivideFloatFloatFloat() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x73477387751754efl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5ed4412e19040daal, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe2845ef0c23d02del, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe2845ef0c23d2e34l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testNativeDivideFloatFloatFloat(inLeftVector, out);
-            verifyResultsNativeDivideFloatFloatFloat(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testNativeDivideFloatFloatFloat(inLhs, out);
+            verifyResultsNativeDivideFloatFloatFloat(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDivideFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testNativeDivideFloatFloatFloat(inLeftVector, out);
-            verifyResultsNativeDivideFloatFloatFloat(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testNativeDivideFloatFloatFloat(inLhs, out);
+            verifyResultsNativeDivideFloatFloatFloat(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDivideFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeDivideFloatFloatFloat(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 1];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 1];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsNativeDivideFloatFloatFloat(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 1];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 1];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inLeftVector = arrayInLeftVector[i];
-                args.inRightVector = arrayInRightVector[i];
+                args.inLhs = arrayInLhs[i];
+                args.inRhs = arrayInRhs[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeDivide(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inLeftVector, Float.floatToRawIntBits(args.inLeftVector), args.inLeftVector));
+                            args.inLhs, Float.floatToRawIntBits(args.inLhs), args.inLhs));
                     message.append("\n");
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inRightVector, Float.floatToRawIntBits(args.inRightVector), args.inRightVector));
+                            args.inRhs, Float.floatToRawIntBits(args.inRhs), args.inRhs));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkNativeDivideFloat2Float2Float2() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x752d5a1207785d6dl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb071fa74af507ad4l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x51c6d6ecaeab1c48l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x51c6d6ecaeab479el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testNativeDivideFloat2Float2Float2(inLeftVector, out);
-            verifyResultsNativeDivideFloat2Float2Float2(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testNativeDivideFloat2Float2Float2(inLhs, out);
+            verifyResultsNativeDivideFloat2Float2Float2(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDivideFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testNativeDivideFloat2Float2Float2(inLeftVector, out);
-            verifyResultsNativeDivideFloat2Float2Float2(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testNativeDivideFloat2Float2Float2(inLhs, out);
+            verifyResultsNativeDivideFloat2Float2Float2(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDivideFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeDivideFloat2Float2Float2(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 2];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 2];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsNativeDivideFloat2Float2Float2(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 2];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 2];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inLeftVector = arrayInLeftVector[i * 2 + j];
-                args.inRightVector = arrayInRightVector[i * 2 + j];
+                args.inLhs = arrayInLhs[i * 2 + j];
+                args.inRhs = arrayInRhs[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeDivide(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inLeftVector, Float.floatToRawIntBits(args.inLeftVector), args.inLeftVector));
+                            args.inLhs, Float.floatToRawIntBits(args.inLhs), args.inLhs));
                     message.append("\n");
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inRightVector, Float.floatToRawIntBits(args.inRightVector), args.inRightVector));
+                            args.inRhs, Float.floatToRawIntBits(args.inRhs), args.inRhs));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkNativeDivideFloat3Float3Float3() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5623c6c05fb90198l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x79d63bbd822c0e0dl, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xde4f2c1a2b24e021l, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xde4f2c1a2b250b77l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testNativeDivideFloat3Float3Float3(inLeftVector, out);
-            verifyResultsNativeDivideFloat3Float3Float3(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testNativeDivideFloat3Float3Float3(inLhs, out);
+            verifyResultsNativeDivideFloat3Float3Float3(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDivideFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testNativeDivideFloat3Float3Float3(inLeftVector, out);
-            verifyResultsNativeDivideFloat3Float3Float3(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testNativeDivideFloat3Float3Float3(inLhs, out);
+            verifyResultsNativeDivideFloat3Float3Float3(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDivideFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeDivideFloat3Float3Float3(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsNativeDivideFloat3Float3Float3(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inLeftVector = arrayInLeftVector[i * 4 + j];
-                args.inRightVector = arrayInRightVector[i * 4 + j];
+                args.inLhs = arrayInLhs[i * 4 + j];
+                args.inRhs = arrayInRhs[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeDivide(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inLeftVector, Float.floatToRawIntBits(args.inLeftVector), args.inLeftVector));
+                            args.inLhs, Float.floatToRawIntBits(args.inLhs), args.inLhs));
                     message.append("\n");
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inRightVector, Float.floatToRawIntBits(args.inRightVector), args.inRightVector));
+                            args.inRhs, Float.floatToRawIntBits(args.inRhs), args.inRhs));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkNativeDivideFloat4Float4Float4() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x371a336eb7f9a5c3l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x433a7d065507a146l, false);
+        Allocation inLhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6ad78147a79ea3fal, false);
+        Allocation inRhs = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6ad78147a79ecf50l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInRightVector(inRightVector);
-            script.forEach_testNativeDivideFloat4Float4Float4(inLeftVector, out);
-            verifyResultsNativeDivideFloat4Float4Float4(inLeftVector, inRightVector, out, false);
+            script.set_gAllocInRhs(inRhs);
+            script.forEach_testNativeDivideFloat4Float4Float4(inLhs, out);
+            verifyResultsNativeDivideFloat4Float4Float4(inLhs, inRhs, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDivideFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInRightVector(inRightVector);
-            scriptRelaxed.forEach_testNativeDivideFloat4Float4Float4(inLeftVector, out);
-            verifyResultsNativeDivideFloat4Float4Float4(inLeftVector, inRightVector, out, true);
+            scriptRelaxed.set_gAllocInRhs(inRhs);
+            scriptRelaxed.forEach_testNativeDivideFloat4Float4Float4(inLhs, out);
+            verifyResultsNativeDivideFloat4Float4Float4(inLhs, inRhs, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDivideFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeDivideFloat4Float4Float4(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
-        float[] arrayInLeftVector = new float[INPUTSIZE * 4];
-        inLeftVector.copyTo(arrayInLeftVector);
-        float[] arrayInRightVector = new float[INPUTSIZE * 4];
-        inRightVector.copyTo(arrayInRightVector);
+    private void verifyResultsNativeDivideFloat4Float4Float4(Allocation inLhs, Allocation inRhs, Allocation out, boolean relaxed) {
+        float[] arrayInLhs = new float[INPUTSIZE * 4];
+        inLhs.copyTo(arrayInLhs);
+        float[] arrayInRhs = new float[INPUTSIZE * 4];
+        inRhs.copyTo(arrayInRhs);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inLeftVector = arrayInLeftVector[i * 4 + j];
-                args.inRightVector = arrayInRightVector[i * 4 + j];
+                args.inLhs = arrayInLhs[i * 4 + j];
+                args.inRhs = arrayInRhs[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeDivide(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inLeftVector: ");
+                    message.append("Input inLhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inLeftVector, Float.floatToRawIntBits(args.inLeftVector), args.inLeftVector));
+                            args.inLhs, Float.floatToRawIntBits(args.inLhs), args.inLhs));
                     message.append("\n");
-                    message.append("Input inRightVector: ");
+                    message.append("Input inRhs: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inRightVector, Float.floatToRawIntBits(args.inRightVector), args.inRightVector));
+                            args.inRhs, Float.floatToRawIntBits(args.inRhs), args.inRhs));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDivide.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDivide.rs
new file mode 100644
index 0000000..ee36b50
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDivide.rs
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocInRhs;
+
+float __attribute__((kernel)) testNativeDivideFloatFloatFloat(float inLhs, unsigned int x) {
+    float inRhs = rsGetElementAt_float(gAllocInRhs, x);
+    return native_divide(inLhs, inRhs);
+}
+
+float2 __attribute__((kernel)) testNativeDivideFloat2Float2Float2(float2 inLhs, unsigned int x) {
+    float2 inRhs = rsGetElementAt_float2(gAllocInRhs, x);
+    return native_divide(inLhs, inRhs);
+}
+
+float3 __attribute__((kernel)) testNativeDivideFloat3Float3Float3(float3 inLhs, unsigned int x) {
+    float3 inRhs = rsGetElementAt_float3(gAllocInRhs, x);
+    return native_divide(inLhs, inRhs);
+}
+
+float4 __attribute__((kernel)) testNativeDivideFloat4Float4Float4(float4 inLhs, unsigned int x) {
+    float4 inRhs = rsGetElementAt_float4(gAllocInRhs, x);
+    return native_divide(inLhs, inRhs);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDivideRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeDivideRelaxed.rs
index 6660366..b6d5004 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeDivideRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeDivide.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp.java
index 229c8b0..3c9a847 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeExp extends RSBaseCompute {
+public class TestNativeExp extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeExp script;
-    private ScriptC_GeneratedTestNativeExpRelaxed scriptRelaxed;
+    private ScriptC_TestNativeExp script;
+    private ScriptC_TestNativeExpRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeExp(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeExpRelaxed(mRS);
+        script = new ScriptC_TestNativeExp(mRS);
+        scriptRelaxed = new ScriptC_TestNativeExpRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp10.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp10.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp10.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp10.java
index d172b5d..75eb8df 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp10.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeExp10 extends RSBaseCompute {
+public class TestNativeExp10 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeExp10 script;
-    private ScriptC_GeneratedTestNativeExp10Relaxed scriptRelaxed;
+    private ScriptC_TestNativeExp10 script;
+    private ScriptC_TestNativeExp10Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeExp10(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeExp10Relaxed(mRS);
+        script = new ScriptC_TestNativeExp10(mRS);
+        scriptRelaxed = new ScriptC_TestNativeExp10Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp10.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp10.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp10.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp10.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp10Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp10Relaxed.rs
index 6660366..4f12665 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp10Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeExp10.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp2.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp2.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp2.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp2.java
index 50b995d..bb0e9b3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp2.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeExp2 extends RSBaseCompute {
+public class TestNativeExp2 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeExp2 script;
-    private ScriptC_GeneratedTestNativeExp2Relaxed scriptRelaxed;
+    private ScriptC_TestNativeExp2 script;
+    private ScriptC_TestNativeExp2Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeExp2(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeExp2Relaxed(mRS);
+        script = new ScriptC_TestNativeExp2(mRS);
+        scriptRelaxed = new ScriptC_TestNativeExp2Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp2.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp2.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExp2.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp2.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp2Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp2Relaxed.rs
index 6660366..8b99710 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExp2Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeExp2.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpRelaxed.rs
index 6660366..dd3a73c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeExp.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpm1.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpm1.java
similarity index 79%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpm1.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpm1.java
index c183fe6..3eecc32 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpm1.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpm1.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeExpm1 extends RSBaseCompute {
+public class TestNativeExpm1 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeExpm1 script;
-    private ScriptC_GeneratedTestNativeExpm1Relaxed scriptRelaxed;
+    private ScriptC_TestNativeExpm1 script;
+    private ScriptC_TestNativeExpm1Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeExpm1(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeExpm1Relaxed(mRS);
+        script = new ScriptC_TestNativeExpm1(mRS);
+        scriptRelaxed = new ScriptC_TestNativeExpm1Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeExpm1FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7a90bd8a7094f34bl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x209e2820fcaa295fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeExpm1FloatFloat(inV, out);
-            verifyResultsNativeExpm1FloatFloat(inV, out, false);
+            script.forEach_testNativeExpm1FloatFloat(in, out);
+            verifyResultsNativeExpm1FloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeExpm1FloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeExpm1FloatFloat(inV, out);
-            verifyResultsNativeExpm1FloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeExpm1FloatFloat(in, out);
+            verifyResultsNativeExpm1FloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeExpm1FloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeExpm1FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeExpm1FloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeExpm1(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeExpm1Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3f43b22de84b7997l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x964ef83c9a3d4a43l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeExpm1Float2Float2(inV, out);
-            verifyResultsNativeExpm1Float2Float2(inV, out, false);
+            script.forEach_testNativeExpm1Float2Float2(in, out);
+            verifyResultsNativeExpm1Float2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeExpm1Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeExpm1Float2Float2(inV, out);
-            verifyResultsNativeExpm1Float2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeExpm1Float2Float2(in, out);
+            verifyResultsNativeExpm1Float2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeExpm1Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeExpm1Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeExpm1Float2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeExpm1(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeExpm1Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3f457b48de669a75l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x964f02ddf943dfddl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeExpm1Float3Float3(inV, out);
-            verifyResultsNativeExpm1Float3Float3(inV, out, false);
+            script.forEach_testNativeExpm1Float3Float3(in, out);
+            verifyResultsNativeExpm1Float3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeExpm1Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeExpm1Float3Float3(inV, out);
-            verifyResultsNativeExpm1Float3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeExpm1Float3Float3(in, out);
+            verifyResultsNativeExpm1Float3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeExpm1Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeExpm1Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeExpm1Float3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeExpm1(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeExpm1Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3f474463d481bb53l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x964f0d7f584a7577l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeExpm1Float4Float4(inV, out);
-            verifyResultsNativeExpm1Float4Float4(inV, out, false);
+            script.forEach_testNativeExpm1Float4Float4(in, out);
+            verifyResultsNativeExpm1Float4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeExpm1Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeExpm1Float4Float4(inV, out);
-            verifyResultsNativeExpm1Float4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeExpm1Float4Float4(in, out);
+            verifyResultsNativeExpm1Float4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeExpm1Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeExpm1Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeExpm1Float4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeExpm1(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpm1.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpm1.rs
similarity index 87%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpm1.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpm1.rs
index aca1745..6d265d6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeExpm1.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpm1.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeExpm1FloatFloat(float inV) {
-    return native_expm1(inV);
+float __attribute__((kernel)) testNativeExpm1FloatFloat(float in) {
+    return native_expm1(in);
 }
 
-float2 __attribute__((kernel)) testNativeExpm1Float2Float2(float2 inV) {
-    return native_expm1(inV);
+float2 __attribute__((kernel)) testNativeExpm1Float2Float2(float2 in) {
+    return native_expm1(in);
 }
 
-float3 __attribute__((kernel)) testNativeExpm1Float3Float3(float3 inV) {
-    return native_expm1(inV);
+float3 __attribute__((kernel)) testNativeExpm1Float3Float3(float3 in) {
+    return native_expm1(in);
 }
 
-float4 __attribute__((kernel)) testNativeExpm1Float4Float4(float4 inV) {
-    return native_expm1(inV);
+float4 __attribute__((kernel)) testNativeExpm1Float4Float4(float4 in) {
+    return native_expm1(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpm1Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpm1Relaxed.rs
index 6660366..a74a0d1 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeExpm1Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeExpm1.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeHypot.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeHypot.java
similarity index 71%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeHypot.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeHypot.java
index fcb86f3..0a50675 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeHypot.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeHypot.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeHypot extends RSBaseCompute {
+public class TestNativeHypot extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeHypot script;
-    private ScriptC_GeneratedTestNativeHypotRelaxed scriptRelaxed;
+    private ScriptC_TestNativeHypot script;
+    private ScriptC_TestNativeHypotRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeHypot(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeHypotRelaxed(mRS);
+        script = new ScriptC_TestNativeHypot(mRS);
+        scriptRelaxed = new ScriptC_TestNativeHypotRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inA;
-        public float inB;
+        public float inX;
+        public float inY;
         public Target.Floaty out;
     }
 
     private void checkNativeHypotFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3d61f129bdf66001l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3d61f129bdf66002l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3d61f129bdf66018l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3d61f129bdf66019l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testNativeHypotFloatFloatFloat(inA, out);
-            verifyResultsNativeHypotFloatFloatFloat(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNativeHypotFloatFloatFloat(inX, out);
+            verifyResultsNativeHypotFloatFloatFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeHypotFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testNativeHypotFloatFloatFloat(inA, out);
-            verifyResultsNativeHypotFloatFloatFloat(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNativeHypotFloatFloatFloat(inX, out);
+            verifyResultsNativeHypotFloatFloatFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeHypotFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeHypotFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 1];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 1];
-        inB.copyTo(arrayInB);
+    private void verifyResultsNativeHypotFloatFloatFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i];
-                args.inB = arrayInB[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeHypot(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkNativeHypotFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x92a8064760a50e4dl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x92a8064760a50e4el, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x92a8064760a50e64l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x92a8064760a50e65l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testNativeHypotFloat2Float2Float2(inA, out);
-            verifyResultsNativeHypotFloat2Float2Float2(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNativeHypotFloat2Float2Float2(inX, out);
+            verifyResultsNativeHypotFloat2Float2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeHypotFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testNativeHypotFloat2Float2Float2(inA, out);
-            verifyResultsNativeHypotFloat2Float2Float2(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNativeHypotFloat2Float2Float2(inX, out);
+            verifyResultsNativeHypotFloat2Float2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeHypotFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeHypotFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 2];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 2];
-        inB.copyTo(arrayInB);
+    private void verifyResultsNativeHypotFloat2Float2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeHypot(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkNativeHypotFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe70ce46762830feel, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe70ce46762830fefl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe70ce46762831005l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe70ce46762831006l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testNativeHypotFloat3Float3Float3(inA, out);
-            verifyResultsNativeHypotFloat3Float3Float3(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNativeHypotFloat3Float3Float3(inX, out);
+            verifyResultsNativeHypotFloat3Float3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeHypotFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testNativeHypotFloat3Float3Float3(inA, out);
-            verifyResultsNativeHypotFloat3Float3Float3(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNativeHypotFloat3Float3Float3(inX, out);
+            verifyResultsNativeHypotFloat3Float3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeHypotFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeHypotFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsNativeHypotFloat3Float3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeHypot(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkNativeHypotFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3b71c2876461118fl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3b71c28764611190l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3b71c287646111a6l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3b71c287646111a7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInB(inB);
-            script.forEach_testNativeHypotFloat4Float4Float4(inA, out);
-            verifyResultsNativeHypotFloat4Float4Float4(inA, inB, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNativeHypotFloat4Float4Float4(inX, out);
+            verifyResultsNativeHypotFloat4Float4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeHypotFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testNativeHypotFloat4Float4Float4(inA, out);
-            verifyResultsNativeHypotFloat4Float4Float4(inA, inB, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNativeHypotFloat4Float4Float4(inX, out);
+            verifyResultsNativeHypotFloat4Float4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeHypotFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeHypotFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
-        float[] arrayInA = new float[INPUTSIZE * 4];
-        inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
-        inB.copyTo(arrayInB);
+    private void verifyResultsNativeHypotFloat4Float4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeHypot(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inA, Float.floatToRawIntBits(args.inA), args.inA));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inB: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeHypot.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeHypot.rs
similarity index 67%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeHypot.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeHypot.rs
index 70fb23d..b4e8a7c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeHypot.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeHypot.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInB;
+rs_allocation gAllocInY;
 
-float __attribute__((kernel)) testNativeHypotFloatFloatFloat(float inA, unsigned int x) {
-    float inB = rsGetElementAt_float(gAllocInB, x);
-    return native_hypot(inA, inB);
+float __attribute__((kernel)) testNativeHypotFloatFloatFloat(float inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return native_hypot(inX, inY);
 }
 
-float2 __attribute__((kernel)) testNativeHypotFloat2Float2Float2(float2 inA, unsigned int x) {
-    float2 inB = rsGetElementAt_float2(gAllocInB, x);
-    return native_hypot(inA, inB);
+float2 __attribute__((kernel)) testNativeHypotFloat2Float2Float2(float2 inX, unsigned int x) {
+    float2 inY = rsGetElementAt_float2(gAllocInY, x);
+    return native_hypot(inX, inY);
 }
 
-float3 __attribute__((kernel)) testNativeHypotFloat3Float3Float3(float3 inA, unsigned int x) {
-    float3 inB = rsGetElementAt_float3(gAllocInB, x);
-    return native_hypot(inA, inB);
+float3 __attribute__((kernel)) testNativeHypotFloat3Float3Float3(float3 inX, unsigned int x) {
+    float3 inY = rsGetElementAt_float3(gAllocInY, x);
+    return native_hypot(inX, inY);
 }
 
-float4 __attribute__((kernel)) testNativeHypotFloat4Float4Float4(float4 inA, unsigned int x) {
-    float4 inB = rsGetElementAt_float4(gAllocInB, x);
-    return native_hypot(inA, inB);
+float4 __attribute__((kernel)) testNativeHypotFloat4Float4Float4(float4 inX, unsigned int x) {
+    float4 inY = rsGetElementAt_float4(gAllocInY, x);
+    return native_hypot(inX, inY);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeHypotRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeHypotRelaxed.rs
index 6660366..79aa107 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeHypotRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeHypot.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLength.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLength.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLength.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLength.java
index 77faec5..b3a5df6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLength.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLength.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeLength extends RSBaseCompute {
+public class TestNativeLength extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeLength script;
-    private ScriptC_GeneratedTestNativeLengthRelaxed scriptRelaxed;
+    private ScriptC_TestNativeLength script;
+    private ScriptC_TestNativeLengthRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeLength(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeLengthRelaxed(mRS);
+        script = new ScriptC_TestNativeLength(mRS);
+        scriptRelaxed = new ScriptC_TestNativeLengthRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLength.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLength.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLength.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLength.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLengthRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLengthRelaxed.rs
index 6660366..cb03c1e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLengthRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeLength.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog.java
index 323d174..4116cba 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeLog extends RSBaseCompute {
+public class TestNativeLog extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeLog script;
-    private ScriptC_GeneratedTestNativeLogRelaxed scriptRelaxed;
+    private ScriptC_TestNativeLog script;
+    private ScriptC_TestNativeLogRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeLog(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeLogRelaxed(mRS);
+        script = new ScriptC_TestNativeLog(mRS);
+        scriptRelaxed = new ScriptC_TestNativeLogRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog10.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog10.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog10.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog10.java
index 3220259..9a64239 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog10.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeLog10 extends RSBaseCompute {
+public class TestNativeLog10 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeLog10 script;
-    private ScriptC_GeneratedTestNativeLog10Relaxed scriptRelaxed;
+    private ScriptC_TestNativeLog10 script;
+    private ScriptC_TestNativeLog10Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeLog10(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeLog10Relaxed(mRS);
+        script = new ScriptC_TestNativeLog10(mRS);
+        scriptRelaxed = new ScriptC_TestNativeLog10Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog10.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog10.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog10.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog10.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog10Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog10Relaxed.rs
index 6660366..a00ed08 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog10Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeLog10.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog1p.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog1p.java
similarity index 79%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog1p.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog1p.java
index b2c2bea..0d88a75 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog1p.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog1p.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeLog1p extends RSBaseCompute {
+public class TestNativeLog1p extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeLog1p script;
-    private ScriptC_GeneratedTestNativeLog1pRelaxed scriptRelaxed;
+    private ScriptC_TestNativeLog1p script;
+    private ScriptC_TestNativeLog1pRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeLog1p(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeLog1pRelaxed(mRS);
+        script = new ScriptC_TestNativeLog1p(mRS);
+        scriptRelaxed = new ScriptC_TestNativeLog1pRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeLog1pFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb77ad6f5e656185dl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x444585911437d95l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeLog1pFloatFloat(inV, out);
-            verifyResultsNativeLog1pFloatFloat(inV, out, false);
+            script.forEach_testNativeLog1pFloatFloat(in, out);
+            verifyResultsNativeLog1pFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeLog1pFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeLog1pFloatFloat(inV, out);
-            verifyResultsNativeLog1pFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeLog1pFloatFloat(in, out);
+            verifyResultsNativeLog1pFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeLog1pFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeLog1pFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeLog1pFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeLog1p(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeLog1pFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x36154b5368503899l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd1a13d4961ae8449l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeLog1pFloat2Float2(inV, out);
-            verifyResultsNativeLog1pFloat2Float2(inV, out, false);
+            script.forEach_testNativeLog1pFloat2Float2(in, out);
+            verifyResultsNativeLog1pFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeLog1pFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeLog1pFloat2Float2(inV, out);
-            verifyResultsNativeLog1pFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeLog1pFloat2Float2(in, out);
+            verifyResultsNativeLog1pFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeLog1pFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeLog1pFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeLog1pFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeLog1p(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeLog1pFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3617146e5e6b5977l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd1a147eac0b519e3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeLog1pFloat3Float3(inV, out);
-            verifyResultsNativeLog1pFloat3Float3(inV, out, false);
+            script.forEach_testNativeLog1pFloat3Float3(in, out);
+            verifyResultsNativeLog1pFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeLog1pFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeLog1pFloat3Float3(inV, out);
-            verifyResultsNativeLog1pFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeLog1pFloat3Float3(in, out);
+            verifyResultsNativeLog1pFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeLog1pFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeLog1pFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeLog1pFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeLog1p(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeLog1pFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3618dd8954867a55l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd1a1528c1fbbaf7dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeLog1pFloat4Float4(inV, out);
-            verifyResultsNativeLog1pFloat4Float4(inV, out, false);
+            script.forEach_testNativeLog1pFloat4Float4(in, out);
+            verifyResultsNativeLog1pFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeLog1pFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeLog1pFloat4Float4(inV, out);
-            verifyResultsNativeLog1pFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeLog1pFloat4Float4(in, out);
+            verifyResultsNativeLog1pFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeLog1pFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeLog1pFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeLog1pFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeLog1p(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog1p.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog1p.rs
similarity index 87%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog1p.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog1p.rs
index 4fdcd2f..8d9cdd2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog1p.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog1p.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeLog1pFloatFloat(float inV) {
-    return native_log1p(inV);
+float __attribute__((kernel)) testNativeLog1pFloatFloat(float in) {
+    return native_log1p(in);
 }
 
-float2 __attribute__((kernel)) testNativeLog1pFloat2Float2(float2 inV) {
-    return native_log1p(inV);
+float2 __attribute__((kernel)) testNativeLog1pFloat2Float2(float2 in) {
+    return native_log1p(in);
 }
 
-float3 __attribute__((kernel)) testNativeLog1pFloat3Float3(float3 inV) {
-    return native_log1p(inV);
+float3 __attribute__((kernel)) testNativeLog1pFloat3Float3(float3 in) {
+    return native_log1p(in);
 }
 
-float4 __attribute__((kernel)) testNativeLog1pFloat4Float4(float4 inV) {
-    return native_log1p(inV);
+float4 __attribute__((kernel)) testNativeLog1pFloat4Float4(float4 in) {
+    return native_log1p(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog1pRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog1pRelaxed.rs
index 6660366..3411c6e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog1pRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeLog1p.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog2.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog2.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog2.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog2.java
index 2da8087..674abb7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog2.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeLog2 extends RSBaseCompute {
+public class TestNativeLog2 extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeLog2 script;
-    private ScriptC_GeneratedTestNativeLog2Relaxed scriptRelaxed;
+    private ScriptC_TestNativeLog2 script;
+    private ScriptC_TestNativeLog2Relaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeLog2(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeLog2Relaxed(mRS);
+        script = new ScriptC_TestNativeLog2(mRS);
+        scriptRelaxed = new ScriptC_TestNativeLog2Relaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog2.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog2.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeLog2.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog2.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog2Relaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog2Relaxed.rs
index 6660366..71c2580 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLog2Relaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeLog2.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLogRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeLogRelaxed.rs
index 6660366..70d5e2f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeLogRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeLog.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeNormalize.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeNormalize.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeNormalize.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeNormalize.java
index ef9ebf9..42f4553 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeNormalize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeNormalize.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeNormalize extends RSBaseCompute {
+public class TestNativeNormalize extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeNormalize script;
-    private ScriptC_GeneratedTestNativeNormalizeRelaxed scriptRelaxed;
+    private ScriptC_TestNativeNormalize script;
+    private ScriptC_TestNativeNormalizeRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeNormalize(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeNormalizeRelaxed(mRS);
+        script = new ScriptC_TestNativeNormalize(mRS);
+        scriptRelaxed = new ScriptC_TestNativeNormalizeRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeNormalize.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeNormalize.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeNormalize.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeNormalize.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeNormalizeRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeNormalizeRelaxed.rs
index 6660366..9050ff3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeNormalizeRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeNormalize.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativePowr.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativePowr.java
similarity index 67%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativePowr.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativePowr.java
index f4443e4..f19d80c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativePowr.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativePowr.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativePowr extends RSBaseCompute {
+public class TestNativePowr extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativePowr script;
-    private ScriptC_GeneratedTestNativePowrRelaxed scriptRelaxed;
+    private ScriptC_TestNativePowr script;
+    private ScriptC_TestNativePowrRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativePowr(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativePowrRelaxed(mRS);
+        script = new ScriptC_TestNativePowr(mRS);
+        scriptRelaxed = new ScriptC_TestNativePowrRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inBase;
-        public float inExponent;
+        public float inV;
+        public float inY;
         public Target.Floaty out;
     }
 
     private void checkNativePowrFloatFloatFloat() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x22637077834d1839l, 0, 256);
-        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xef7b0ab4f9181f0fl, -15, 15);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3c3550bdff7a10c2l, 0, 256);
+        Allocation inY = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3c3550bdff7a10c5l, -15, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testNativePowrFloatFloatFloat(inBase, out);
-            verifyResultsNativePowrFloatFloatFloat(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNativePowrFloatFloatFloat(inV, out);
+            verifyResultsNativePowrFloatFloatFloat(inV, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativePowrFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testNativePowrFloatFloatFloat(inBase, out);
-            verifyResultsNativePowrFloatFloatFloat(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNativePowrFloatFloatFloat(inV, out);
+            verifyResultsNativePowrFloatFloatFloat(inV, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativePowrFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativePowrFloatFloatFloat(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 1];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 1];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsNativePowrFloatFloatFloat(Allocation inV, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInV = new float[INPUTSIZE * 1];
+        inV.copyTo(arrayInV);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i];
-                args.inExponent = arrayInExponent[i];
+                args.inV = arrayInV[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativePowr(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inV: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkNativePowrFloat2Float2Float2() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x47afceb7283b11a5l, 0, 256);
-        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x65ac261bb67d4abbl, -15, 15);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdbc56fbe7733c926l, 0, 256);
+        Allocation inY = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdbc56fbe7733c929l, -15, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testNativePowrFloat2Float2Float2(inBase, out);
-            verifyResultsNativePowrFloat2Float2Float2(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNativePowrFloat2Float2Float2(inV, out);
+            verifyResultsNativePowrFloat2Float2Float2(inV, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativePowrFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testNativePowrFloat2Float2Float2(inBase, out);
-            verifyResultsNativePowrFloat2Float2Float2(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNativePowrFloat2Float2Float2(inV, out);
+            verifyResultsNativePowrFloat2Float2Float2(inV, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativePowrFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativePowrFloat2Float2Float2(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 2];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 2];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsNativePowrFloat2Float2Float2(Allocation inV, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInV = new float[INPUTSIZE * 2];
+        inV.copyTo(arrayInV);
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i * 2 + j];
-                args.inExponent = arrayInExponent[i * 2 + j];
+                args.inV = arrayInV[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativePowr(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inV: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkNativePowrFloat3Float3Float3() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe2961d5b10aef718l, 0, 256);
-        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x411aa11d0d9fcd3el, -15, 15);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x302a4dde7911cac7l, 0, 256);
+        Allocation inY = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x302a4dde7911cacal, -15, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testNativePowrFloat3Float3Float3(inBase, out);
-            verifyResultsNativePowrFloat3Float3Float3(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNativePowrFloat3Float3Float3(inV, out);
+            verifyResultsNativePowrFloat3Float3Float3(inV, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativePowrFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testNativePowrFloat3Float3Float3(inBase, out);
-            verifyResultsNativePowrFloat3Float3Float3(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNativePowrFloat3Float3Float3(inV, out);
+            verifyResultsNativePowrFloat3Float3Float3(inV, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativePowrFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativePowrFloat3Float3Float3(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 4];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 4];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsNativePowrFloat3Float3Float3(Allocation inV, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInV = new float[INPUTSIZE * 4];
+        inV.copyTo(arrayInV);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i * 4 + j];
-                args.inExponent = arrayInExponent[i * 4 + j];
+                args.inV = arrayInV[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativePowr(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inV: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkNativePowrFloat4Float4Float4() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7d7c6bfef922dc8bl, 0, 256);
-        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1c891c1e64c24fc1l, -15, 15);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x848f2bfe7aefcc68l, 0, 256);
+        Allocation inY = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x848f2bfe7aefcc6bl, -15, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testNativePowrFloat4Float4Float4(inBase, out);
-            verifyResultsNativePowrFloat4Float4Float4(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNativePowrFloat4Float4Float4(inV, out);
+            verifyResultsNativePowrFloat4Float4Float4(inV, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativePowrFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testNativePowrFloat4Float4Float4(inBase, out);
-            verifyResultsNativePowrFloat4Float4Float4(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNativePowrFloat4Float4Float4(inV, out);
+            verifyResultsNativePowrFloat4Float4Float4(inV, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativePowrFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativePowrFloat4Float4Float4(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 4];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 4];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsNativePowrFloat4Float4Float4(Allocation inV, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInV = new float[INPUTSIZE * 4];
+        inV.copyTo(arrayInV);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i * 4 + j];
-                args.inExponent = arrayInExponent[i * 4 + j];
+                args.inV = arrayInV[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativePowr(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inV: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativePowr.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativePowr.rs
similarity index 63%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativePowr.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativePowr.rs
index 8adc2d2..06de2f9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativePowr.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativePowr.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInExponent;
+rs_allocation gAllocInY;
 
-float __attribute__((kernel)) testNativePowrFloatFloatFloat(float inBase, unsigned int x) {
-    float inExponent = rsGetElementAt_float(gAllocInExponent, x);
-    return native_powr(inBase, inExponent);
+float __attribute__((kernel)) testNativePowrFloatFloatFloat(float inV, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return native_powr(inV, inY);
 }
 
-float2 __attribute__((kernel)) testNativePowrFloat2Float2Float2(float2 inBase, unsigned int x) {
-    float2 inExponent = rsGetElementAt_float2(gAllocInExponent, x);
-    return native_powr(inBase, inExponent);
+float2 __attribute__((kernel)) testNativePowrFloat2Float2Float2(float2 inV, unsigned int x) {
+    float2 inY = rsGetElementAt_float2(gAllocInY, x);
+    return native_powr(inV, inY);
 }
 
-float3 __attribute__((kernel)) testNativePowrFloat3Float3Float3(float3 inBase, unsigned int x) {
-    float3 inExponent = rsGetElementAt_float3(gAllocInExponent, x);
-    return native_powr(inBase, inExponent);
+float3 __attribute__((kernel)) testNativePowrFloat3Float3Float3(float3 inV, unsigned int x) {
+    float3 inY = rsGetElementAt_float3(gAllocInY, x);
+    return native_powr(inV, inY);
 }
 
-float4 __attribute__((kernel)) testNativePowrFloat4Float4Float4(float4 inBase, unsigned int x) {
-    float4 inExponent = rsGetElementAt_float4(gAllocInExponent, x);
-    return native_powr(inBase, inExponent);
+float4 __attribute__((kernel)) testNativePowrFloat4Float4Float4(float4 inV, unsigned int x) {
+    float4 inY = rsGetElementAt_float4(gAllocInY, x);
+    return native_powr(inV, inY);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativePowrRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativePowrRelaxed.rs
index 6660366..069e40e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativePowrRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativePowr.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRecip.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRecip.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRecip.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeRecip.java
index 88d9f82..976526b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRecip.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRecip.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeRecip extends RSBaseCompute {
+public class TestNativeRecip extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeRecip script;
-    private ScriptC_GeneratedTestNativeRecipRelaxed scriptRelaxed;
+    private ScriptC_TestNativeRecip script;
+    private ScriptC_TestNativeRecipRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeRecip(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeRecipRelaxed(mRS);
+        script = new ScriptC_TestNativeRecip(mRS);
+        scriptRelaxed = new ScriptC_TestNativeRecipRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRecip.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRecip.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRecip.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeRecip.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRecipRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeRecipRelaxed.rs
index 6660366..f2cbc83 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRecipRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeRecip.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRootn.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRootn.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRootn.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeRootn.java
index 9d42f44..d125e3b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRootn.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRootn.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeRootn extends RSBaseCompute {
+public class TestNativeRootn extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeRootn script;
-    private ScriptC_GeneratedTestNativeRootnRelaxed scriptRelaxed;
+    private ScriptC_TestNativeRootn script;
+    private ScriptC_TestNativeRootnRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeRootn(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeRootnRelaxed(mRS);
+        script = new ScriptC_TestNativeRootn(mRS);
+        scriptRelaxed = new ScriptC_TestNativeRootnRelaxed(mRS);
     }
 
     public class ArgumentsFloatIntFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRootn.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRootn.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRootn.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeRootn.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRootnRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeRootnRelaxed.rs
index 6660366..3b05992 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRootnRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeRootn.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRsqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRsqrt.java
similarity index 79%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRsqrt.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeRsqrt.java
index 88b821a..fc2549d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRsqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRsqrt.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeRsqrt extends RSBaseCompute {
+public class TestNativeRsqrt extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeRsqrt script;
-    private ScriptC_GeneratedTestNativeRsqrtRelaxed scriptRelaxed;
+    private ScriptC_TestNativeRsqrt script;
+    private ScriptC_TestNativeRsqrtRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeRsqrt(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeRsqrtRelaxed(mRS);
+        script = new ScriptC_TestNativeRsqrt(mRS);
+        scriptRelaxed = new ScriptC_TestNativeRsqrtRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeRsqrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf3caff6b795084f6l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf3cf23b51aa29de0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeRsqrtFloatFloat(inV, out);
-            verifyResultsNativeRsqrtFloatFloat(inV, out, false);
+            script.forEach_testNativeRsqrtFloatFloat(in, out);
+            verifyResultsNativeRsqrtFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeRsqrtFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeRsqrtFloatFloat(inV, out);
-            verifyResultsNativeRsqrtFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeRsqrtFloatFloat(in, out);
+            verifyResultsNativeRsqrtFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeRsqrtFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeRsqrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeRsqrtFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeRsqrt(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeRsqrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd5098485fb0a95aal, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf318090911bec1fcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeRsqrtFloat2Float2(inV, out);
-            verifyResultsNativeRsqrtFloat2Float2(inV, out, false);
+            script.forEach_testNativeRsqrtFloat2Float2(in, out);
+            verifyResultsNativeRsqrtFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeRsqrtFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeRsqrtFloat2Float2(inV, out);
-            verifyResultsNativeRsqrtFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeRsqrtFloat2Float2(in, out);
+            verifyResultsNativeRsqrtFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeRsqrtFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeRsqrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeRsqrtFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeRsqrt(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeRsqrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd50b4da0f125b688l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf31813aa70c55796l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeRsqrtFloat3Float3(inV, out);
-            verifyResultsNativeRsqrtFloat3Float3(inV, out, false);
+            script.forEach_testNativeRsqrtFloat3Float3(in, out);
+            verifyResultsNativeRsqrtFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeRsqrtFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeRsqrtFloat3Float3(inV, out);
-            verifyResultsNativeRsqrtFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeRsqrtFloat3Float3(in, out);
+            verifyResultsNativeRsqrtFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeRsqrtFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeRsqrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeRsqrtFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeRsqrt(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeRsqrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd50d16bbe740d766l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf3181e4bcfcbed30l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeRsqrtFloat4Float4(inV, out);
-            verifyResultsNativeRsqrtFloat4Float4(inV, out, false);
+            script.forEach_testNativeRsqrtFloat4Float4(in, out);
+            verifyResultsNativeRsqrtFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeRsqrtFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeRsqrtFloat4Float4(inV, out);
-            verifyResultsNativeRsqrtFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeRsqrtFloat4Float4(in, out);
+            verifyResultsNativeRsqrtFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeRsqrtFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeRsqrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeRsqrtFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeRsqrt(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRsqrt.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRsqrt.rs
similarity index 87%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRsqrt.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeRsqrt.rs
index b7c3173..af291cb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeRsqrt.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRsqrt.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeRsqrtFloatFloat(float inV) {
-    return native_rsqrt(inV);
+float __attribute__((kernel)) testNativeRsqrtFloatFloat(float in) {
+    return native_rsqrt(in);
 }
 
-float2 __attribute__((kernel)) testNativeRsqrtFloat2Float2(float2 inV) {
-    return native_rsqrt(inV);
+float2 __attribute__((kernel)) testNativeRsqrtFloat2Float2(float2 in) {
+    return native_rsqrt(in);
 }
 
-float3 __attribute__((kernel)) testNativeRsqrtFloat3Float3(float3 inV) {
-    return native_rsqrt(inV);
+float3 __attribute__((kernel)) testNativeRsqrtFloat3Float3(float3 in) {
+    return native_rsqrt(in);
 }
 
-float4 __attribute__((kernel)) testNativeRsqrtFloat4Float4(float4 inV) {
-    return native_rsqrt(inV);
+float4 __attribute__((kernel)) testNativeRsqrtFloat4Float4(float4 in) {
+    return native_rsqrt(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRsqrtRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeRsqrtRelaxed.rs
index 6660366..c18cc22 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeRsqrtRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeRsqrt.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSin.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSin.java
similarity index 77%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSin.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSin.java
index 29cc178..1637326 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSin.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeSin extends RSBaseCompute {
+public class TestNativeSin extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeSin script;
-    private ScriptC_GeneratedTestNativeSinRelaxed scriptRelaxed;
+    private ScriptC_TestNativeSin script;
+    private ScriptC_TestNativeSinRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeSin(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeSinRelaxed(mRS);
+        script = new ScriptC_TestNativeSin(mRS);
+        scriptRelaxed = new ScriptC_TestNativeSinRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeSinFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb8fe46da9f3e52c8l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x33ee19763354cc56l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeSinFloatFloat(inV, out);
-            verifyResultsNativeSinFloatFloat(inV, out, false);
+            script.forEach_testNativeSinFloatFloat(in, out);
+            verifyResultsNativeSinFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinFloatFloat(inV, out);
-            verifyResultsNativeSinFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinFloatFloat(in, out);
+            verifyResultsNativeSinFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSin(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeSinFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2468764eed9e276cl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x12b508b470b05442l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeSinFloat2Float2(inV, out);
-            verifyResultsNativeSinFloat2Float2(inV, out, false);
+            script.forEach_testNativeSinFloat2Float2(in, out);
+            verifyResultsNativeSinFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinFloat2Float2(inV, out);
-            verifyResultsNativeSinFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinFloat2Float2(in, out);
+            verifyResultsNativeSinFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSin(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeSinFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x246a3f69e3b9484al, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x12b51355cfb6e9dcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeSinFloat3Float3(inV, out);
-            verifyResultsNativeSinFloat3Float3(inV, out, false);
+            script.forEach_testNativeSinFloat3Float3(in, out);
+            verifyResultsNativeSinFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinFloat3Float3(inV, out);
-            verifyResultsNativeSinFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinFloat3Float3(in, out);
+            verifyResultsNativeSinFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSin(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeSinFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x246c0884d9d46928l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x12b51df72ebd7f76l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeSinFloat4Float4(inV, out);
-            verifyResultsNativeSinFloat4Float4(inV, out, false);
+            script.forEach_testNativeSinFloat4Float4(in, out);
+            verifyResultsNativeSinFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinFloat4Float4(inV, out);
-            verifyResultsNativeSinFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinFloat4Float4(in, out);
+            verifyResultsNativeSinFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSin(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSin.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSin.rs
similarity index 83%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSin.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSin.rs
index dacc15e..1af8929 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSin.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSin.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeSinFloatFloat(float inV) {
-    return native_sin(inV);
+float __attribute__((kernel)) testNativeSinFloatFloat(float in) {
+    return native_sin(in);
 }
 
-float2 __attribute__((kernel)) testNativeSinFloat2Float2(float2 inV) {
-    return native_sin(inV);
+float2 __attribute__((kernel)) testNativeSinFloat2Float2(float2 in) {
+    return native_sin(in);
 }
 
-float3 __attribute__((kernel)) testNativeSinFloat3Float3(float3 inV) {
-    return native_sin(inV);
+float3 __attribute__((kernel)) testNativeSinFloat3Float3(float3 in) {
+    return native_sin(in);
 }
 
-float4 __attribute__((kernel)) testNativeSinFloat4Float4(float4 inV) {
-    return native_sin(inV);
+float4 __attribute__((kernel)) testNativeSinFloat4Float4(float4 in) {
+    return native_sin(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinRelaxed.rs
index 6660366..e3dbf27 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeSin.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSincos.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSincos.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.java
index 8812b4d..380f2b4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSincos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeSincos extends RSBaseCompute {
+public class TestNativeSincos extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeSincos script;
-    private ScriptC_GeneratedTestNativeSincosRelaxed scriptRelaxed;
+    private ScriptC_TestNativeSincos script;
+    private ScriptC_TestNativeSincosRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeSincos(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeSincosRelaxed(mRS);
+        script = new ScriptC_TestNativeSincos(mRS);
+        scriptRelaxed = new ScriptC_TestNativeSincosRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
         public float inV;
-        public Target.Floaty outCos;
+        public Target.Floaty outCosptr;
         public Target.Floaty out;
     }
 
     private void checkNativeSincosFloatFloatFloat() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe15df2366436cc13l, false);
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocOutCos(outCos);
+            script.set_gAllocOutCosptr(outCosptr);
             script.forEach_testNativeSincosFloatFloatFloat(inV, out);
-            verifyResultsNativeSincosFloatFloatFloat(inV, outCos, out, false);
+            verifyResultsNativeSincosFloatFloatFloat(inV, outCosptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSincosFloatFloatFloat: " + e.toString());
         }
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutCos(outCos);
+            scriptRelaxed.set_gAllocOutCosptr(outCosptr);
             scriptRelaxed.forEach_testNativeSincosFloatFloatFloat(inV, out);
-            verifyResultsNativeSincosFloatFloatFloat(inV, outCos, out, true);
+            verifyResultsNativeSincosFloatFloatFloat(inV, outCosptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSincosFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSincosFloatFloatFloat(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
+    private void verifyResultsNativeSincosFloatFloatFloat(Allocation inV, Allocation outCosptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
         inV.copyTo(arrayInV);
-        float[] arrayOutCos = new float[INPUTSIZE * 1];
-        outCos.copyTo(arrayOutCos);
+        float[] arrayOutCosptr = new float[INPUTSIZE * 1];
+        outCosptr.copyTo(arrayOutCosptr);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -79,7 +79,7 @@
                 CoreMathVerifier.computeNativeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCos.couldBe(arrayOutCos[i * 1 + j], 0.0005)) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
@@ -91,13 +91,13 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outCos: ");
-                    message.append(args.outCos.toString());
+                    message.append("Expected output outCosptr: ");
+                    message.append(args.outCosptr.toString());
                     message.append("\n");
-                    message.append("Actual   output outCos: ");
+                    message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutCos[i * 1 + j], Float.floatToRawIntBits(arrayOutCos[i * 1 + j]), arrayOutCos[i * 1 + j]));
-                    if (!args.outCos.couldBe(arrayOutCos[i * 1 + j], 0.0005)) {
+                            arrayOutCosptr[i * 1 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 1 + j]), arrayOutCosptr[i * 1 + j]));
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -121,30 +121,30 @@
     private void checkNativeSincosFloat2Float2Float2() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe5a1f1dcda676ea9l, false);
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocOutCos(outCos);
+            script.set_gAllocOutCosptr(outCosptr);
             script.forEach_testNativeSincosFloat2Float2Float2(inV, out);
-            verifyResultsNativeSincosFloat2Float2Float2(inV, outCos, out, false);
+            verifyResultsNativeSincosFloat2Float2Float2(inV, outCosptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSincosFloat2Float2Float2: " + e.toString());
         }
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutCos(outCos);
+            scriptRelaxed.set_gAllocOutCosptr(outCosptr);
             scriptRelaxed.forEach_testNativeSincosFloat2Float2Float2(inV, out);
-            verifyResultsNativeSincosFloat2Float2Float2(inV, outCos, out, true);
+            verifyResultsNativeSincosFloat2Float2Float2(inV, outCosptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSincosFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSincosFloat2Float2Float2(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
+    private void verifyResultsNativeSincosFloat2Float2Float2(Allocation inV, Allocation outCosptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
         inV.copyTo(arrayInV);
-        float[] arrayOutCos = new float[INPUTSIZE * 2];
-        outCos.copyTo(arrayOutCos);
+        float[] arrayOutCosptr = new float[INPUTSIZE * 2];
+        outCosptr.copyTo(arrayOutCosptr);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -157,7 +157,7 @@
                 CoreMathVerifier.computeNativeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCos.couldBe(arrayOutCos[i * 2 + j], 0.0005)) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
@@ -169,13 +169,13 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outCos: ");
-                    message.append(args.outCos.toString());
+                    message.append("Expected output outCosptr: ");
+                    message.append(args.outCosptr.toString());
                     message.append("\n");
-                    message.append("Actual   output outCos: ");
+                    message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutCos[i * 2 + j], Float.floatToRawIntBits(arrayOutCos[i * 2 + j]), arrayOutCos[i * 2 + j]));
-                    if (!args.outCos.couldBe(arrayOutCos[i * 2 + j], 0.0005)) {
+                            arrayOutCosptr[i * 2 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 2 + j]), arrayOutCosptr[i * 2 + j]));
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -199,30 +199,30 @@
     private void checkNativeSincosFloat3Float3Float3() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3a06cffcdc45704al, false);
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocOutCos(outCos);
+            script.set_gAllocOutCosptr(outCosptr);
             script.forEach_testNativeSincosFloat3Float3Float3(inV, out);
-            verifyResultsNativeSincosFloat3Float3Float3(inV, outCos, out, false);
+            verifyResultsNativeSincosFloat3Float3Float3(inV, outCosptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSincosFloat3Float3Float3: " + e.toString());
         }
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutCos(outCos);
+            scriptRelaxed.set_gAllocOutCosptr(outCosptr);
             scriptRelaxed.forEach_testNativeSincosFloat3Float3Float3(inV, out);
-            verifyResultsNativeSincosFloat3Float3Float3(inV, outCos, out, true);
+            verifyResultsNativeSincosFloat3Float3Float3(inV, outCosptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSincosFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSincosFloat3Float3Float3(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
+    private void verifyResultsNativeSincosFloat3Float3Float3(Allocation inV, Allocation outCosptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
         inV.copyTo(arrayInV);
-        float[] arrayOutCos = new float[INPUTSIZE * 4];
-        outCos.copyTo(arrayOutCos);
+        float[] arrayOutCosptr = new float[INPUTSIZE * 4];
+        outCosptr.copyTo(arrayOutCosptr);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -235,7 +235,7 @@
                 CoreMathVerifier.computeNativeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCos.couldBe(arrayOutCos[i * 4 + j], 0.0005)) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
@@ -247,13 +247,13 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outCos: ");
-                    message.append(args.outCos.toString());
+                    message.append("Expected output outCosptr: ");
+                    message.append(args.outCosptr.toString());
                     message.append("\n");
-                    message.append("Actual   output outCos: ");
+                    message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutCos[i * 4 + j], Float.floatToRawIntBits(arrayOutCos[i * 4 + j]), arrayOutCos[i * 4 + j]));
-                    if (!args.outCos.couldBe(arrayOutCos[i * 4 + j], 0.0005)) {
+                            arrayOutCosptr[i * 4 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 4 + j]), arrayOutCosptr[i * 4 + j]));
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -277,30 +277,30 @@
     private void checkNativeSincosFloat4Float4Float4() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8e6bae1cde2371ebl, false);
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocOutCos(outCos);
+            script.set_gAllocOutCosptr(outCosptr);
             script.forEach_testNativeSincosFloat4Float4Float4(inV, out);
-            verifyResultsNativeSincosFloat4Float4Float4(inV, outCos, out, false);
+            verifyResultsNativeSincosFloat4Float4Float4(inV, outCosptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSincosFloat4Float4Float4: " + e.toString());
         }
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutCos(outCos);
+            scriptRelaxed.set_gAllocOutCosptr(outCosptr);
             scriptRelaxed.forEach_testNativeSincosFloat4Float4Float4(inV, out);
-            verifyResultsNativeSincosFloat4Float4Float4(inV, outCos, out, true);
+            verifyResultsNativeSincosFloat4Float4Float4(inV, outCosptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSincosFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSincosFloat4Float4Float4(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
+    private void verifyResultsNativeSincosFloat4Float4Float4(Allocation inV, Allocation outCosptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
         inV.copyTo(arrayInV);
-        float[] arrayOutCos = new float[INPUTSIZE * 4];
-        outCos.copyTo(arrayOutCos);
+        float[] arrayOutCosptr = new float[INPUTSIZE * 4];
+        outCosptr.copyTo(arrayOutCosptr);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -313,7 +313,7 @@
                 CoreMathVerifier.computeNativeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCos.couldBe(arrayOutCos[i * 4 + j], 0.0005)) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
@@ -325,13 +325,13 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outCos: ");
-                    message.append(args.outCos.toString());
+                    message.append("Expected output outCosptr: ");
+                    message.append(args.outCosptr.toString());
                     message.append("\n");
-                    message.append("Actual   output outCos: ");
+                    message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutCos[i * 4 + j], Float.floatToRawIntBits(arrayOutCos[i * 4 + j]), arrayOutCos[i * 4 + j]));
-                    if (!args.outCos.couldBe(arrayOutCos[i * 4 + j], 0.0005)) {
+                            arrayOutCosptr[i * 4 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 4 + j]), arrayOutCosptr[i * 4 + j]));
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSincos.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.rs
similarity index 68%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSincos.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.rs
index 741a49b..8148c67 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSincos.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.rs
@@ -19,32 +19,32 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocOutCos;
+rs_allocation gAllocOutCosptr;
 
 float __attribute__((kernel)) testNativeSincosFloatFloatFloat(float inV, unsigned int x) {
-    float outCos = 0;
-    float out = native_sincos(inV, &outCos);
-    rsSetElementAt_float(gAllocOutCos, outCos, x);
+    float outCosptr = 0;
+    float out = native_sincos(inV, &outCosptr);
+    rsSetElementAt_float(gAllocOutCosptr, outCosptr, x);
     return out;
 }
 
 float2 __attribute__((kernel)) testNativeSincosFloat2Float2Float2(float2 inV, unsigned int x) {
-    float2 outCos = 0;
-    float2 out = native_sincos(inV, &outCos);
-    rsSetElementAt_float2(gAllocOutCos, outCos, x);
+    float2 outCosptr = 0;
+    float2 out = native_sincos(inV, &outCosptr);
+    rsSetElementAt_float2(gAllocOutCosptr, outCosptr, x);
     return out;
 }
 
 float3 __attribute__((kernel)) testNativeSincosFloat3Float3Float3(float3 inV, unsigned int x) {
-    float3 outCos = 0;
-    float3 out = native_sincos(inV, &outCos);
-    rsSetElementAt_float3(gAllocOutCos, outCos, x);
+    float3 outCosptr = 0;
+    float3 out = native_sincos(inV, &outCosptr);
+    rsSetElementAt_float3(gAllocOutCosptr, outCosptr, x);
     return out;
 }
 
 float4 __attribute__((kernel)) testNativeSincosFloat4Float4Float4(float4 inV, unsigned int x) {
-    float4 outCos = 0;
-    float4 out = native_sincos(inV, &outCos);
-    rsSetElementAt_float4(gAllocOutCos, outCos, x);
+    float4 outCosptr = 0;
+    float4 out = native_sincos(inV, &outCosptr);
+    rsSetElementAt_float4(gAllocOutCosptr, outCosptr, x);
     return out;
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincosRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincosRelaxed.rs
index 6660366..175e265 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincosRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeSincos.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinh.java
similarity index 77%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinh.java
index cb7b90e..9c2edc7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinh.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeSinh extends RSBaseCompute {
+public class TestNativeSinh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeSinh script;
-    private ScriptC_GeneratedTestNativeSinhRelaxed scriptRelaxed;
+    private ScriptC_TestNativeSinh script;
+    private ScriptC_TestNativeSinhRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeSinh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeSinhRelaxed(mRS);
+        script = new ScriptC_TestNativeSinh(mRS);
+        scriptRelaxed = new ScriptC_TestNativeSinhRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeSinhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa11cf844515a0f86l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x74dcf3e9c65b6590l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeSinhFloatFloat(inV, out);
-            verifyResultsNativeSinhFloatFloat(inV, out, false);
+            script.forEach_testNativeSinhFloatFloat(in, out);
+            verifyResultsNativeSinhFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinhFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinhFloatFloat(inV, out);
-            verifyResultsNativeSinhFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinhFloatFloat(in, out);
+            verifyResultsNativeSinhFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinhFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinhFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSinh(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeSinhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xaa17dab657f45fbal, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfdcd5755b59082cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeSinhFloat2Float2(inV, out);
-            verifyResultsNativeSinhFloat2Float2(inV, out, false);
+            script.forEach_testNativeSinhFloat2Float2(in, out);
+            verifyResultsNativeSinhFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinhFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinhFloat2Float2(inV, out);
-            verifyResultsNativeSinhFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinhFloat2Float2(in, out);
+            verifyResultsNativeSinhFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinhFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinhFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSinh(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeSinhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xaa19a3d14e0f8098l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfdce016ba5f9dc6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeSinhFloat3Float3(inV, out);
-            verifyResultsNativeSinhFloat3Float3(inV, out, false);
+            script.forEach_testNativeSinhFloat3Float3(in, out);
+            verifyResultsNativeSinhFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinhFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinhFloat3Float3(inV, out);
-            verifyResultsNativeSinhFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinhFloat3Float3(in, out);
+            verifyResultsNativeSinhFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinhFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinhFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSinh(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeSinhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xaa1b6cec442aa176l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfdceab819663360l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeSinhFloat4Float4(inV, out);
-            verifyResultsNativeSinhFloat4Float4(inV, out, false);
+            script.forEach_testNativeSinhFloat4Float4(in, out);
+            verifyResultsNativeSinhFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinhFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinhFloat4Float4(inV, out);
-            verifyResultsNativeSinhFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinhFloat4Float4(in, out);
+            verifyResultsNativeSinhFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinhFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinhFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSinh(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinh.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinh.rs
similarity index 82%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinh.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinh.rs
index 8eecf7c..20728d5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinh.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinh.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeSinhFloatFloat(float inV) {
-    return native_sinh(inV);
+float __attribute__((kernel)) testNativeSinhFloatFloat(float in) {
+    return native_sinh(in);
 }
 
-float2 __attribute__((kernel)) testNativeSinhFloat2Float2(float2 inV) {
-    return native_sinh(inV);
+float2 __attribute__((kernel)) testNativeSinhFloat2Float2(float2 in) {
+    return native_sinh(in);
 }
 
-float3 __attribute__((kernel)) testNativeSinhFloat3Float3(float3 inV) {
-    return native_sinh(inV);
+float3 __attribute__((kernel)) testNativeSinhFloat3Float3(float3 in) {
+    return native_sinh(in);
 }
 
-float4 __attribute__((kernel)) testNativeSinhFloat4Float4(float4 inV) {
-    return native_sinh(inV);
+float4 __attribute__((kernel)) testNativeSinhFloat4Float4(float4 in) {
+    return native_sinh(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinhRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinhRelaxed.rs
index 6660366..7ba4ce8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinhRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeSinh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinpi.java
similarity index 79%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinpi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinpi.java
index a887d0e..2f67e8e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinpi.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeSinpi extends RSBaseCompute {
+public class TestNativeSinpi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeSinpi script;
-    private ScriptC_GeneratedTestNativeSinpiRelaxed scriptRelaxed;
+    private ScriptC_TestNativeSinpi script;
+    private ScriptC_TestNativeSinpiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeSinpi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeSinpiRelaxed(mRS);
+        script = new ScriptC_TestNativeSinpi(mRS);
+        scriptRelaxed = new ScriptC_TestNativeSinpiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeSinpiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6e76d30caee7fd93l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb52c701227c9dc37l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeSinpiFloatFloat(inV, out);
-            verifyResultsNativeSinpiFloatFloat(inV, out, false);
+            script.forEach_testNativeSinpiFloatFloat(in, out);
+            verifyResultsNativeSinpiFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinpiFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinpiFloatFloat(inV, out);
-            verifyResultsNativeSinpiFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinpiFloatFloat(in, out);
+            verifyResultsNativeSinpiFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinpiFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinpiFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSinpi(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeSinpiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd8150be20e10bb9fl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8df4951d1230045bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeSinpiFloat2Float2(inV, out);
-            verifyResultsNativeSinpiFloat2Float2(inV, out, false);
+            script.forEach_testNativeSinpiFloat2Float2(in, out);
+            verifyResultsNativeSinpiFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinpiFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinpiFloat2Float2(inV, out);
-            verifyResultsNativeSinpiFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinpiFloat2Float2(in, out);
+            verifyResultsNativeSinpiFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinpiFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinpiFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSinpi(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeSinpiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd816d4fd042bdc7dl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8df49fbe713699f5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeSinpiFloat3Float3(inV, out);
-            verifyResultsNativeSinpiFloat3Float3(inV, out, false);
+            script.forEach_testNativeSinpiFloat3Float3(in, out);
+            verifyResultsNativeSinpiFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinpiFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinpiFloat3Float3(inV, out);
-            verifyResultsNativeSinpiFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinpiFloat3Float3(in, out);
+            verifyResultsNativeSinpiFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinpiFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinpiFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSinpi(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeSinpiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd8189e17fa46fd5bl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8df4aa5fd03d2f8fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeSinpiFloat4Float4(inV, out);
-            verifyResultsNativeSinpiFloat4Float4(inV, out, false);
+            script.forEach_testNativeSinpiFloat4Float4(in, out);
+            verifyResultsNativeSinpiFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinpiFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSinpiFloat4Float4(inV, out);
-            verifyResultsNativeSinpiFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeSinpiFloat4Float4(in, out);
+            verifyResultsNativeSinpiFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSinpiFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSinpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSinpiFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSinpi(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinpi.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinpi.rs
similarity index 87%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinpi.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinpi.rs
index 7d88eb6..1b17471 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSinpi.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinpi.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeSinpiFloatFloat(float inV) {
-    return native_sinpi(inV);
+float __attribute__((kernel)) testNativeSinpiFloatFloat(float in) {
+    return native_sinpi(in);
 }
 
-float2 __attribute__((kernel)) testNativeSinpiFloat2Float2(float2 inV) {
-    return native_sinpi(inV);
+float2 __attribute__((kernel)) testNativeSinpiFloat2Float2(float2 in) {
+    return native_sinpi(in);
 }
 
-float3 __attribute__((kernel)) testNativeSinpiFloat3Float3(float3 inV) {
-    return native_sinpi(inV);
+float3 __attribute__((kernel)) testNativeSinpiFloat3Float3(float3 in) {
+    return native_sinpi(in);
 }
 
-float4 __attribute__((kernel)) testNativeSinpiFloat4Float4(float4 inV) {
-    return native_sinpi(inV);
+float4 __attribute__((kernel)) testNativeSinpiFloat4Float4(float4 in) {
+    return native_sinpi(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinpiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinpiRelaxed.rs
index 6660366..2bc871f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSinpiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeSinpi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSqrt.java
similarity index 77%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSqrt.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSqrt.java
index a64fff3..edb07bc 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSqrt.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeSqrt extends RSBaseCompute {
+public class TestNativeSqrt extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeSqrt script;
-    private ScriptC_GeneratedTestNativeSqrtRelaxed scriptRelaxed;
+    private ScriptC_TestNativeSqrt script;
+    private ScriptC_TestNativeSqrtRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeSqrt(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeSqrtRelaxed(mRS);
+        script = new ScriptC_TestNativeSqrt(mRS);
+        scriptRelaxed = new ScriptC_TestNativeSqrtRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeSqrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5de9ec2c642f9b06l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb4c9e7b9972ac810l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeSqrtFloatFloat(inV, out);
-            verifyResultsNativeSqrtFloatFloat(inV, out, false);
+            script.forEach_testNativeSqrtFloatFloat(in, out);
+            verifyResultsNativeSqrtFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSqrtFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSqrtFloatFloat(inV, out);
-            verifyResultsNativeSqrtFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeSqrtFloatFloat(in, out);
+            verifyResultsNativeSqrtFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSqrtFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSqrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSqrtFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSqrt(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeSqrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4e6581e66050ef3al, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc649cd70853776acl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeSqrtFloat2Float2(inV, out);
-            verifyResultsNativeSqrtFloat2Float2(inV, out, false);
+            script.forEach_testNativeSqrtFloat2Float2(in, out);
+            verifyResultsNativeSqrtFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSqrtFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSqrtFloat2Float2(inV, out);
-            verifyResultsNativeSqrtFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeSqrtFloat2Float2(in, out);
+            verifyResultsNativeSqrtFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSqrtFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSqrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSqrtFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSqrt(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeSqrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4e674b01566c1018l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc649d811e43e0c46l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeSqrtFloat3Float3(inV, out);
-            verifyResultsNativeSqrtFloat3Float3(inV, out, false);
+            script.forEach_testNativeSqrtFloat3Float3(in, out);
+            verifyResultsNativeSqrtFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSqrtFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSqrtFloat3Float3(inV, out);
-            verifyResultsNativeSqrtFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeSqrtFloat3Float3(in, out);
+            verifyResultsNativeSqrtFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSqrtFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSqrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSqrtFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSqrt(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeSqrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4e69141c4c8730f6l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc649e2b34344a1e0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeSqrtFloat4Float4(inV, out);
-            verifyResultsNativeSqrtFloat4Float4(inV, out, false);
+            script.forEach_testNativeSqrtFloat4Float4(in, out);
+            verifyResultsNativeSqrtFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSqrtFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeSqrtFloat4Float4(inV, out);
-            verifyResultsNativeSqrtFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeSqrtFloat4Float4(in, out);
+            verifyResultsNativeSqrtFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeSqrtFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeSqrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeSqrtFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeSqrt(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSqrt.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSqrt.rs
similarity index 82%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSqrt.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSqrt.rs
index c312e6a..2ed1cc8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeSqrt.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSqrt.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeSqrtFloatFloat(float inV) {
-    return native_sqrt(inV);
+float __attribute__((kernel)) testNativeSqrtFloatFloat(float in) {
+    return native_sqrt(in);
 }
 
-float2 __attribute__((kernel)) testNativeSqrtFloat2Float2(float2 inV) {
-    return native_sqrt(inV);
+float2 __attribute__((kernel)) testNativeSqrtFloat2Float2(float2 in) {
+    return native_sqrt(in);
 }
 
-float3 __attribute__((kernel)) testNativeSqrtFloat3Float3(float3 inV) {
-    return native_sqrt(inV);
+float3 __attribute__((kernel)) testNativeSqrtFloat3Float3(float3 in) {
+    return native_sqrt(in);
 }
 
-float4 __attribute__((kernel)) testNativeSqrtFloat4Float4(float4 inV) {
-    return native_sqrt(inV);
+float4 __attribute__((kernel)) testNativeSqrtFloat4Float4(float4 in) {
+    return native_sqrt(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSqrtRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeSqrtRelaxed.rs
index 6660366..aa39435 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSqrtRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeSqrt.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTan.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTan.java
similarity index 77%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTan.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeTan.java
index 8dc9836..cd51a53 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTan.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeTan extends RSBaseCompute {
+public class TestNativeTan extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeTan script;
-    private ScriptC_GeneratedTestNativeTanRelaxed scriptRelaxed;
+    private ScriptC_TestNativeTan script;
+    private ScriptC_TestNativeTanRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeTan(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeTanRelaxed(mRS);
+        script = new ScriptC_TestNativeTan(mRS);
+        scriptRelaxed = new ScriptC_TestNativeTanRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeTanFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x62e3c32037b34543l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5b9a224e25042b47l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeTanFloatFloat(inV, out);
-            verifyResultsNativeTanFloatFloat(inV, out, false);
+            script.forEach_testNativeTanFloatFloat(in, out);
+            verifyResultsNativeTanFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanFloatFloat(inV, out);
-            verifyResultsNativeTanFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanFloatFloat(in, out);
+            verifyResultsNativeTanFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTan(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeTanFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3ee708f9124981cfl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x9c40e8650c550eebl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeTanFloat2Float2(inV, out);
-            verifyResultsNativeTanFloat2Float2(inV, out, false);
+            script.forEach_testNativeTanFloat2Float2(in, out);
+            verifyResultsNativeTanFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanFloat2Float2(inV, out);
-            verifyResultsNativeTanFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanFloat2Float2(in, out);
+            verifyResultsNativeTanFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTan(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeTanFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3ee8d2140864a2adl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9c40f3066b5ba485l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeTanFloat3Float3(inV, out);
-            verifyResultsNativeTanFloat3Float3(inV, out, false);
+            script.forEach_testNativeTanFloat3Float3(in, out);
+            verifyResultsNativeTanFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanFloat3Float3(inV, out);
-            verifyResultsNativeTanFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanFloat3Float3(in, out);
+            verifyResultsNativeTanFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTan(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeTanFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3eea9b2efe7fc38bl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x9c40fda7ca623a1fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeTanFloat4Float4(inV, out);
-            verifyResultsNativeTanFloat4Float4(inV, out, false);
+            script.forEach_testNativeTanFloat4Float4(in, out);
+            verifyResultsNativeTanFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanFloat4Float4(inV, out);
-            verifyResultsNativeTanFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanFloat4Float4(in, out);
+            verifyResultsNativeTanFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTan(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTan.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTan.rs
similarity index 83%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTan.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeTan.rs
index 004ffc5..000bc74 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTan.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTan.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeTanFloatFloat(float inV) {
-    return native_tan(inV);
+float __attribute__((kernel)) testNativeTanFloatFloat(float in) {
+    return native_tan(in);
 }
 
-float2 __attribute__((kernel)) testNativeTanFloat2Float2(float2 inV) {
-    return native_tan(inV);
+float2 __attribute__((kernel)) testNativeTanFloat2Float2(float2 in) {
+    return native_tan(in);
 }
 
-float3 __attribute__((kernel)) testNativeTanFloat3Float3(float3 inV) {
-    return native_tan(inV);
+float3 __attribute__((kernel)) testNativeTanFloat3Float3(float3 in) {
+    return native_tan(in);
 }
 
-float4 __attribute__((kernel)) testNativeTanFloat4Float4(float4 inV) {
-    return native_tan(inV);
+float4 __attribute__((kernel)) testNativeTanFloat4Float4(float4 in) {
+    return native_tan(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanRelaxed.rs
index 6660366..9ec6688 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeTan.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanh.java
similarity index 77%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanh.java
index e2674bf..0b69e5f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanh.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeTanh extends RSBaseCompute {
+public class TestNativeTanh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeTanh script;
-    private ScriptC_GeneratedTestNativeTanhRelaxed scriptRelaxed;
+    private ScriptC_TestNativeTanh script;
+    private ScriptC_TestNativeTanhRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeTanh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeTanhRelaxed(mRS);
+        script = new ScriptC_TestNativeTanh(mRS);
+        scriptRelaxed = new ScriptC_TestNativeTanhRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeTanhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2aa8d7f4ecfeca2fl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x1ec2702f5ed0580bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeTanhFloatFloat(inV, out);
-            verifyResultsNativeTanhFloatFloat(inV, out, false);
+            script.forEach_testNativeTanhFloatFloat(in, out);
+            verifyResultsNativeTanhFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanhFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanhFloatFloat(inV, out);
-            verifyResultsNativeTanhFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanhFloatFloat(in, out);
+            verifyResultsNativeTanhFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanhFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanhFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTanh(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeTanhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1d5a7d4a80bc8e5bl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2a5b681f8004628fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeTanhFloat2Float2(inV, out);
-            verifyResultsNativeTanhFloat2Float2(inV, out, false);
+            script.forEach_testNativeTanhFloat2Float2(in, out);
+            verifyResultsNativeTanhFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanhFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanhFloat2Float2(inV, out);
-            verifyResultsNativeTanhFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanhFloat2Float2(in, out);
+            verifyResultsNativeTanhFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanhFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanhFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTanh(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeTanhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1d5c466576d7af39l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2a5b72c0df0af829l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeTanhFloat3Float3(inV, out);
-            verifyResultsNativeTanhFloat3Float3(inV, out, false);
+            script.forEach_testNativeTanhFloat3Float3(in, out);
+            verifyResultsNativeTanhFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanhFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanhFloat3Float3(inV, out);
-            verifyResultsNativeTanhFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanhFloat3Float3(in, out);
+            verifyResultsNativeTanhFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanhFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanhFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTanh(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeTanhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1d5e0f806cf2d017l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2a5b7d623e118dc3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeTanhFloat4Float4(inV, out);
-            verifyResultsNativeTanhFloat4Float4(inV, out, false);
+            script.forEach_testNativeTanhFloat4Float4(in, out);
+            verifyResultsNativeTanhFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanhFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanhFloat4Float4(inV, out);
-            verifyResultsNativeTanhFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanhFloat4Float4(in, out);
+            verifyResultsNativeTanhFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanhFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanhFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTanh(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanh.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanh.rs
similarity index 82%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanh.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanh.rs
index 03fed50..a7bfcfd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanh.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanh.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeTanhFloatFloat(float inV) {
-    return native_tanh(inV);
+float __attribute__((kernel)) testNativeTanhFloatFloat(float in) {
+    return native_tanh(in);
 }
 
-float2 __attribute__((kernel)) testNativeTanhFloat2Float2(float2 inV) {
-    return native_tanh(inV);
+float2 __attribute__((kernel)) testNativeTanhFloat2Float2(float2 in) {
+    return native_tanh(in);
 }
 
-float3 __attribute__((kernel)) testNativeTanhFloat3Float3(float3 inV) {
-    return native_tanh(inV);
+float3 __attribute__((kernel)) testNativeTanhFloat3Float3(float3 in) {
+    return native_tanh(in);
 }
 
-float4 __attribute__((kernel)) testNativeTanhFloat4Float4(float4 inV) {
-    return native_tanh(inV);
+float4 __attribute__((kernel)) testNativeTanhFloat4Float4(float4 in) {
+    return native_tanh(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanhRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanhRelaxed.rs
index 6660366..27c9275 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanhRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeTanh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanpi.java
similarity index 79%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanpi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanpi.java
index f046f1e..1d9b538 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanpi.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNativeTanpi extends RSBaseCompute {
+public class TestNativeTanpi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNativeTanpi script;
-    private ScriptC_GeneratedTestNativeTanpiRelaxed scriptRelaxed;
+    private ScriptC_TestNativeTanpi script;
+    private ScriptC_TestNativeTanpiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNativeTanpi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNativeTanpiRelaxed(mRS);
+        script = new ScriptC_TestNativeTanpi(mRS);
+        scriptRelaxed = new ScriptC_TestNativeTanpiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkNativeTanpiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x88f565b6d39357f6l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3eb84fc2c36e96e0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testNativeTanpiFloatFloat(inV, out);
-            verifyResultsNativeTanpiFloatFloat(inV, out, false);
+            script.forEach_testNativeTanpiFloatFloat(in, out);
+            verifyResultsNativeTanpiFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanpiFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanpiFloatFloat(inV, out);
-            verifyResultsNativeTanpiFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanpiFloatFloat(in, out);
+            verifyResultsNativeTanpiFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanpiFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanpiFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTanpi(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkNativeTanpiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x34465ac4e7b090aal, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x13737b13af832fcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testNativeTanpiFloat2Float2(inV, out);
-            verifyResultsNativeTanpiFloat2Float2(inV, out, false);
+            script.forEach_testNativeTanpiFloat2Float2(in, out);
+            verifyResultsNativeTanpiFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanpiFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanpiFloat2Float2(inV, out);
-            verifyResultsNativeTanpiFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanpiFloat2Float2(in, out);
+            verifyResultsNativeTanpiFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanpiFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanpiFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTanpi(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkNativeTanpiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x344823dfddcbb188l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x137425299fec896l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testNativeTanpiFloat3Float3(inV, out);
-            verifyResultsNativeTanpiFloat3Float3(inV, out, false);
+            script.forEach_testNativeTanpiFloat3Float3(in, out);
+            verifyResultsNativeTanpiFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanpiFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanpiFloat3Float3(inV, out);
-            verifyResultsNativeTanpiFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanpiFloat3Float3(in, out);
+            verifyResultsNativeTanpiFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanpiFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanpiFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTanpi(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkNativeTanpiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3449ecfad3e6d266l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1374cf3f9055e30l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testNativeTanpiFloat4Float4(inV, out);
-            verifyResultsNativeTanpiFloat4Float4(inV, out, false);
+            script.forEach_testNativeTanpiFloat4Float4(in, out);
+            verifyResultsNativeTanpiFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanpiFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testNativeTanpiFloat4Float4(inV, out);
-            verifyResultsNativeTanpiFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testNativeTanpiFloat4Float4(in, out);
+            verifyResultsNativeTanpiFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeTanpiFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNativeTanpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsNativeTanpiFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNativeTanpi(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanpi.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanpi.rs
similarity index 87%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanpi.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanpi.rs
index c553315..ae1f633 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNativeTanpi.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanpi.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testNativeTanpiFloatFloat(float inV) {
-    return native_tanpi(inV);
+float __attribute__((kernel)) testNativeTanpiFloatFloat(float in) {
+    return native_tanpi(in);
 }
 
-float2 __attribute__((kernel)) testNativeTanpiFloat2Float2(float2 inV) {
-    return native_tanpi(inV);
+float2 __attribute__((kernel)) testNativeTanpiFloat2Float2(float2 in) {
+    return native_tanpi(in);
 }
 
-float3 __attribute__((kernel)) testNativeTanpiFloat3Float3(float3 inV) {
-    return native_tanpi(inV);
+float3 __attribute__((kernel)) testNativeTanpiFloat3Float3(float3 in) {
+    return native_tanpi(in);
 }
 
-float4 __attribute__((kernel)) testNativeTanpiFloat4Float4(float4 inV) {
-    return native_tanpi(inV);
+float4 __attribute__((kernel)) testNativeTanpiFloat4Float4(float4 in) {
+    return native_tanpi(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanpiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanpiRelaxed.rs
index 6660366..921fa3c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeTanpiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNativeTanpi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNextafter.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNextafter.java
similarity index 69%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNextafter.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNextafter.java
index 2d9567f..df69e42 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNextafter.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNextafter.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNextafter extends RSBaseCompute {
+public class TestNextafter extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNextafter script;
-    private ScriptC_GeneratedTestNextafterRelaxed scriptRelaxed;
+    private ScriptC_TestNextafter script;
+    private ScriptC_TestNextafterRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNextafter(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNextafterRelaxed(mRS);
+        script = new ScriptC_TestNextafter(mRS);
+        scriptRelaxed = new ScriptC_TestNextafterRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inV;
-        public float inTarget;
+        public float inX;
+        public float inY;
         public Target.Floaty out;
     }
 
     private void checkNextafterFloatFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa3b02393ad412956l, false);
-        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xde8acce6afd7c03dl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa3b02393ad412958l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa3b02393ad412959l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInTarget(inTarget);
-            script.forEach_testNextafterFloatFloatFloat(inV, out);
-            verifyResultsNextafterFloatFloatFloat(inV, inTarget, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNextafterFloatFloatFloat(inX, out);
+            verifyResultsNextafterFloatFloatFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNextafterFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInTarget(inTarget);
-            scriptRelaxed.forEach_testNextafterFloatFloatFloat(inV, out);
-            verifyResultsNextafterFloatFloatFloat(inV, inTarget, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNextafterFloatFloatFloat(inX, out);
+            verifyResultsNextafterFloatFloatFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNextafterFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsNextafterFloatFloatFloat(Allocation inV, Allocation inTarget, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
-        float[] arrayInTarget = new float[INPUTSIZE * 1];
-        inTarget.copyTo(arrayInTarget);
+    private void verifyResultsNextafterFloatFloatFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inV = arrayInV[i];
-                args.inTarget = arrayInTarget[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNextafter(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inTarget: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inTarget, Float.floatToRawIntBits(args.inTarget), args.inTarget));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkNextafterFloat2Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x29b40e0584a1e22l, false);
-        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x68f3a41af7e4d541l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x29b40e0584a1e24l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x29b40e0584a1e25l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInTarget(inTarget);
-            script.forEach_testNextafterFloat2Float2Float2(inV, out);
-            verifyResultsNextafterFloat2Float2Float2(inV, inTarget, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNextafterFloat2Float2Float2(inX, out);
+            verifyResultsNextafterFloat2Float2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNextafterFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInTarget(inTarget);
-            scriptRelaxed.forEach_testNextafterFloat2Float2Float2(inV, out);
-            verifyResultsNextafterFloat2Float2Float2(inV, inTarget, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNextafterFloat2Float2Float2(inX, out);
+            verifyResultsNextafterFloat2Float2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNextafterFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsNextafterFloat2Float2Float2(Allocation inV, Allocation inTarget, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
-        float[] arrayInTarget = new float[INPUTSIZE * 2];
-        inTarget.copyTo(arrayInTarget);
+    private void verifyResultsNextafterFloat2Float2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
-                args.inTarget = arrayInTarget[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNextafter(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inTarget: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inTarget, Float.floatToRawIntBits(args.inTarget), args.inTarget));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkNextafterFloat3Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x57001f005a281fc3l, false);
-        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3261a1f4e4f910dcl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x57001f005a281fc5l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x57001f005a281fc6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInTarget(inTarget);
-            script.forEach_testNextafterFloat3Float3Float3(inV, out);
-            verifyResultsNextafterFloat3Float3Float3(inV, inTarget, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNextafterFloat3Float3Float3(inX, out);
+            verifyResultsNextafterFloat3Float3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNextafterFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInTarget(inTarget);
-            scriptRelaxed.forEach_testNextafterFloat3Float3Float3(inV, out);
-            verifyResultsNextafterFloat3Float3Float3(inV, inTarget, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNextafterFloat3Float3Float3(inX, out);
+            verifyResultsNextafterFloat3Float3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNextafterFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsNextafterFloat3Float3Float3(Allocation inV, Allocation inTarget, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
-        float[] arrayInTarget = new float[INPUTSIZE * 4];
-        inTarget.copyTo(arrayInTarget);
+    private void verifyResultsNextafterFloat3Float3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
-                args.inTarget = arrayInTarget[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNextafter(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inTarget: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inTarget, Float.floatToRawIntBits(args.inTarget), args.inTarget));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkNextafterFloat4Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xab64fd205c062164l, false);
-        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfbcf9fced20d4c77l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xab64fd205c062166l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xab64fd205c062167l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInTarget(inTarget);
-            script.forEach_testNextafterFloat4Float4Float4(inV, out);
-            verifyResultsNextafterFloat4Float4Float4(inV, inTarget, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testNextafterFloat4Float4Float4(inX, out);
+            verifyResultsNextafterFloat4Float4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNextafterFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInTarget(inTarget);
-            scriptRelaxed.forEach_testNextafterFloat4Float4Float4(inV, out);
-            verifyResultsNextafterFloat4Float4Float4(inV, inTarget, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testNextafterFloat4Float4Float4(inX, out);
+            verifyResultsNextafterFloat4Float4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNextafterFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsNextafterFloat4Float4Float4(Allocation inV, Allocation inTarget, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
-        float[] arrayInTarget = new float[INPUTSIZE * 4];
-        inTarget.copyTo(arrayInTarget);
+    private void verifyResultsNextafterFloat4Float4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
-                args.inTarget = arrayInTarget[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeNextafter(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inTarget: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inTarget, Float.floatToRawIntBits(args.inTarget), args.inTarget));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNextafter.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNextafter.rs
similarity index 65%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNextafter.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNextafter.rs
index b7c57f6..a7ae02d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNextafter.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNextafter.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInTarget;
+rs_allocation gAllocInY;
 
-float __attribute__((kernel)) testNextafterFloatFloatFloat(float inV, unsigned int x) {
-    float inTarget = rsGetElementAt_float(gAllocInTarget, x);
-    return nextafter(inV, inTarget);
+float __attribute__((kernel)) testNextafterFloatFloatFloat(float inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return nextafter(inX, inY);
 }
 
-float2 __attribute__((kernel)) testNextafterFloat2Float2Float2(float2 inV, unsigned int x) {
-    float2 inTarget = rsGetElementAt_float2(gAllocInTarget, x);
-    return nextafter(inV, inTarget);
+float2 __attribute__((kernel)) testNextafterFloat2Float2Float2(float2 inX, unsigned int x) {
+    float2 inY = rsGetElementAt_float2(gAllocInY, x);
+    return nextafter(inX, inY);
 }
 
-float3 __attribute__((kernel)) testNextafterFloat3Float3Float3(float3 inV, unsigned int x) {
-    float3 inTarget = rsGetElementAt_float3(gAllocInTarget, x);
-    return nextafter(inV, inTarget);
+float3 __attribute__((kernel)) testNextafterFloat3Float3Float3(float3 inX, unsigned int x) {
+    float3 inY = rsGetElementAt_float3(gAllocInY, x);
+    return nextafter(inX, inY);
 }
 
-float4 __attribute__((kernel)) testNextafterFloat4Float4Float4(float4 inV, unsigned int x) {
-    float4 inTarget = rsGetElementAt_float4(gAllocInTarget, x);
-    return nextafter(inV, inTarget);
+float4 __attribute__((kernel)) testNextafterFloat4Float4Float4(float4 inX, unsigned int x) {
+    float4 inY = rsGetElementAt_float4(gAllocInY, x);
+    return nextafter(inX, inY);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNextafterRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNextafterRelaxed.rs
index 6660366..2111f17 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNextafterRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNextafter.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNormalize.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNormalize.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNormalize.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNormalize.java
index 34d2cb0..0d71ec5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNormalize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNormalize.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestNormalize extends RSBaseCompute {
+public class TestNormalize extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestNormalize script;
-    private ScriptC_GeneratedTestNormalizeRelaxed scriptRelaxed;
+    private ScriptC_TestNormalize script;
+    private ScriptC_TestNormalizeRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestNormalize(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestNormalizeRelaxed(mRS);
+        script = new ScriptC_TestNormalize(mRS);
+        scriptRelaxed = new ScriptC_TestNormalizeRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNormalize.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNormalize.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestNormalize.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestNormalize.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestNormalizeRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestNormalizeRelaxed.rs
index 6660366..148bec3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNormalizeRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestNormalize.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPow.java b/tests/tests/renderscript/src/android/renderscript/cts/TestPow.java
similarity index 66%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPow.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestPow.java
index fcdd097..39369c4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPow.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestPow.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestPow extends RSBaseCompute {
+public class TestPow extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestPow script;
-    private ScriptC_GeneratedTestPowRelaxed scriptRelaxed;
+    private ScriptC_TestPow script;
+    private ScriptC_TestPowRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestPow(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestPowRelaxed(mRS);
+        script = new ScriptC_TestPow(mRS);
+        scriptRelaxed = new ScriptC_TestPowRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inBase;
-        public float inExponent;
+        public float inX;
+        public float inY;
         public Target.Floaty out;
     }
 
     private void checkPowFloatFloatFloat() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x377b8a6622b91eel, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x8bdde8de49a5f734l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x470aeab18312445bl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x470aeab18312445cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPowFloatFloatFloat(inBase, out);
-            verifyResultsPowFloatFloatFloat(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPowFloatFloatFloat(inX, out);
+            verifyResultsPowFloatFloatFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPowFloatFloatFloat(inBase, out);
-            verifyResultsPowFloatFloatFloat(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPowFloatFloatFloat(inX, out);
+            verifyResultsPowFloatFloatFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsPowFloatFloatFloat(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 1];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 1];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPowFloatFloatFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i];
-                args.inExponent = arrayInExponent[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePow(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkPowFloat2Float2Float2() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x15be0382895c2294l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xeb77bf60bbad35fal, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbcd9b7ed561242ddl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbcd9b7ed561242del, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPowFloat2Float2Float2(inBase, out);
-            verifyResultsPowFloat2Float2Float2(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPowFloat2Float2Float2(inX, out);
+            verifyResultsPowFloat2Float2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPowFloat2Float2Float2(inBase, out);
-            verifyResultsPowFloat2Float2Float2(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPowFloat2Float2Float2(inX, out);
+            verifyResultsPowFloat2Float2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsPowFloat2Float2Float2(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 2];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 2];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPowFloat2Float2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i * 2 + j];
-                args.inExponent = arrayInExponent[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePow(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkPowFloat3Float3Float3() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb0a4522671d00807l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc6e63a6212cfb87dl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x113e960d57f0447el, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x113e960d57f0447fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPowFloat3Float3Float3(inBase, out);
-            verifyResultsPowFloat3Float3Float3(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPowFloat3Float3Float3(inX, out);
+            verifyResultsPowFloat3Float3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPowFloat3Float3Float3(inBase, out);
-            verifyResultsPowFloat3Float3Float3(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPowFloat3Float3Float3(inX, out);
+            verifyResultsPowFloat3Float3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsPowFloat3Float3Float3(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 4];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 4];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPowFloat3Float3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i * 4 + j];
-                args.inExponent = arrayInExponent[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePow(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkPowFloat4Float4Float4() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4b8aa0ca5a43ed7al, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa254b56369f23b00l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x65a3742d59ce461fl, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x65a3742d59ce4620l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPowFloat4Float4Float4(inBase, out);
-            verifyResultsPowFloat4Float4Float4(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPowFloat4Float4Float4(inX, out);
+            verifyResultsPowFloat4Float4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPowFloat4Float4Float4(inBase, out);
-            verifyResultsPowFloat4Float4Float4(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPowFloat4Float4Float4(inX, out);
+            verifyResultsPowFloat4Float4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsPowFloat4Float4Float4(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 4];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 4];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPowFloat4Float4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i * 4 + j];
-                args.inExponent = arrayInExponent[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePow(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPow.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestPow.rs
similarity index 61%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPow.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestPow.rs
index 1033d0e..855419a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPow.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestPow.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInExponent;
+rs_allocation gAllocInY;
 
-float __attribute__((kernel)) testPowFloatFloatFloat(float inBase, unsigned int x) {
-    float inExponent = rsGetElementAt_float(gAllocInExponent, x);
-    return pow(inBase, inExponent);
+float __attribute__((kernel)) testPowFloatFloatFloat(float inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return pow(inX, inY);
 }
 
-float2 __attribute__((kernel)) testPowFloat2Float2Float2(float2 inBase, unsigned int x) {
-    float2 inExponent = rsGetElementAt_float2(gAllocInExponent, x);
-    return pow(inBase, inExponent);
+float2 __attribute__((kernel)) testPowFloat2Float2Float2(float2 inX, unsigned int x) {
+    float2 inY = rsGetElementAt_float2(gAllocInY, x);
+    return pow(inX, inY);
 }
 
-float3 __attribute__((kernel)) testPowFloat3Float3Float3(float3 inBase, unsigned int x) {
-    float3 inExponent = rsGetElementAt_float3(gAllocInExponent, x);
-    return pow(inBase, inExponent);
+float3 __attribute__((kernel)) testPowFloat3Float3Float3(float3 inX, unsigned int x) {
+    float3 inY = rsGetElementAt_float3(gAllocInY, x);
+    return pow(inX, inY);
 }
 
-float4 __attribute__((kernel)) testPowFloat4Float4Float4(float4 inBase, unsigned int x) {
-    float4 inExponent = rsGetElementAt_float4(gAllocInExponent, x);
-    return pow(inBase, inExponent);
+float4 __attribute__((kernel)) testPowFloat4Float4Float4(float4 inX, unsigned int x) {
+    float4 inY = rsGetElementAt_float4(gAllocInY, x);
+    return pow(inX, inY);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestPowRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestPowRelaxed.rs
index 6660366..eae1207 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestPowRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestPow.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPown.java b/tests/tests/renderscript/src/android/renderscript/cts/TestPown.java
similarity index 66%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPown.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestPown.java
index f412854..14a09e1 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPown.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestPown.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestPown extends RSBaseCompute {
+public class TestPown extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestPown script;
-    private ScriptC_GeneratedTestPownRelaxed scriptRelaxed;
+    private ScriptC_TestPown script;
+    private ScriptC_TestPownRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestPown(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestPownRelaxed(mRS);
+        script = new ScriptC_TestPown(mRS);
+        scriptRelaxed = new ScriptC_TestPownRelaxed(mRS);
     }
 
     public class ArgumentsFloatIntFloat {
-        public float inBase;
-        public int inExponent;
+        public float inX;
+        public int inY;
         public Target.Floaty out;
     }
 
     private void checkPownFloatIntFloat() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe020952d622f0405l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x9c3888e9096b9f1bl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xde633e0d2c462948l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xde633e0d2c462949l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPownFloatIntFloat(inBase, out);
-            verifyResultsPownFloatIntFloat(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPownFloatIntFloat(inX, out);
+            verifyResultsPownFloatIntFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPownFloatIntFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPownFloatIntFloat(inBase, out);
-            verifyResultsPownFloatIntFloat(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPownFloatIntFloat(inX, out);
+            verifyResultsPownFloatIntFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPownFloatIntFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsPownFloatIntFloat(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 1];
-        inBase.copyTo(arrayInBase);
-        int[] arrayInExponent = new int[INPUTSIZE * 1];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPownFloatIntFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        int[] arrayInY = new int[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inBase = arrayInBase[i];
-                args.inExponent = arrayInExponent[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePown(args, target);
@@ -84,12 +84,12 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
-                    message.append(String.format("%d", args.inExponent));
+                    message.append("Input inY: ");
+                    message.append(String.format("%d", args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -109,39 +109,39 @@
     }
 
     private void checkPownFloat2Int2Float2() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7571c02be438467l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xe6177b3249076ddl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1685dc0ea821329el, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x1685dc0ea821329fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPownFloat2Int2Float2(inBase, out);
-            verifyResultsPownFloat2Int2Float2(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPownFloat2Int2Float2(inX, out);
+            verifyResultsPownFloat2Int2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPownFloat2Int2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPownFloat2Int2Float2(inBase, out);
-            verifyResultsPownFloat2Int2Float2(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPownFloat2Int2Float2(inX, out);
+            verifyResultsPownFloat2Int2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPownFloat2Int2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsPownFloat2Int2Float2(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 2];
-        inBase.copyTo(arrayInBase);
-        int[] arrayInExponent = new int[INPUTSIZE * 2];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPownFloat2Int2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        int[] arrayInY = new int[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inBase = arrayInBase[i * 2 + j];
-                args.inExponent = arrayInExponent[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePown(args, target);
@@ -152,12 +152,12 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
-                    message.append(String.format("%d", args.inExponent));
+                    message.append("Input inY: ");
+                    message.append(String.format("%d", args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -177,39 +177,39 @@
     }
 
     private void checkPownFloat3Int3Float3() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5e88c45be35ff8a2l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xaf710734144a81a8l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3c3c1a719dd39f57l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x3c3c1a719dd39f58l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPownFloat3Int3Float3(inBase, out);
-            verifyResultsPownFloat3Int3Float3(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPownFloat3Int3Float3(inX, out);
+            verifyResultsPownFloat3Int3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPownFloat3Int3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPownFloat3Int3Float3(inBase, out);
-            verifyResultsPownFloat3Int3Float3(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPownFloat3Int3Float3(inX, out);
+            verifyResultsPownFloat3Int3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPownFloat3Int3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsPownFloat3Int3Float3(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 4];
-        inBase.copyTo(arrayInBase);
-        int[] arrayInExponent = new int[INPUTSIZE * 4];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPownFloat3Int3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        int[] arrayInY = new int[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inBase = arrayInBase[i * 4 + j];
-                args.inExponent = arrayInExponent[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePown(args, target);
@@ -220,12 +220,12 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
-                    message.append(String.format("%d", args.inExponent));
+                    message.append("Input inY: ");
+                    message.append(String.format("%d", args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -245,39 +245,39 @@
     }
 
     private void checkPownFloat4Int4Float4() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb5ba6cb5087c6cddl, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x508096b504048c73l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x61f258d493860c10l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x61f258d493860c11l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPownFloat4Int4Float4(inBase, out);
-            verifyResultsPownFloat4Int4Float4(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPownFloat4Int4Float4(inX, out);
+            verifyResultsPownFloat4Int4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPownFloat4Int4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPownFloat4Int4Float4(inBase, out);
-            verifyResultsPownFloat4Int4Float4(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPownFloat4Int4Float4(inX, out);
+            verifyResultsPownFloat4Int4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPownFloat4Int4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsPownFloat4Int4Float4(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 4];
-        inBase.copyTo(arrayInBase);
-        int[] arrayInExponent = new int[INPUTSIZE * 4];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPownFloat4Int4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        int[] arrayInY = new int[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
-                args.inBase = arrayInBase[i * 4 + j];
-                args.inExponent = arrayInExponent[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePown(args, target);
@@ -288,12 +288,12 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
-                    message.append(String.format("%d", args.inExponent));
+                    message.append("Input inY: ");
+                    message.append(String.format("%d", args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPown.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestPown.rs
similarity index 62%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPown.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestPown.rs
index f4fa3d8..3ee4fc0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPown.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestPown.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInExponent;
+rs_allocation gAllocInY;
 
-float __attribute__((kernel)) testPownFloatIntFloat(float inBase, unsigned int x) {
-    int inExponent = rsGetElementAt_int(gAllocInExponent, x);
-    return pown(inBase, inExponent);
+float __attribute__((kernel)) testPownFloatIntFloat(float inX, unsigned int x) {
+    int inY = rsGetElementAt_int(gAllocInY, x);
+    return pown(inX, inY);
 }
 
-float2 __attribute__((kernel)) testPownFloat2Int2Float2(float2 inBase, unsigned int x) {
-    int2 inExponent = rsGetElementAt_int2(gAllocInExponent, x);
-    return pown(inBase, inExponent);
+float2 __attribute__((kernel)) testPownFloat2Int2Float2(float2 inX, unsigned int x) {
+    int2 inY = rsGetElementAt_int2(gAllocInY, x);
+    return pown(inX, inY);
 }
 
-float3 __attribute__((kernel)) testPownFloat3Int3Float3(float3 inBase, unsigned int x) {
-    int3 inExponent = rsGetElementAt_int3(gAllocInExponent, x);
-    return pown(inBase, inExponent);
+float3 __attribute__((kernel)) testPownFloat3Int3Float3(float3 inX, unsigned int x) {
+    int3 inY = rsGetElementAt_int3(gAllocInY, x);
+    return pown(inX, inY);
 }
 
-float4 __attribute__((kernel)) testPownFloat4Int4Float4(float4 inBase, unsigned int x) {
-    int4 inExponent = rsGetElementAt_int4(gAllocInExponent, x);
-    return pown(inBase, inExponent);
+float4 __attribute__((kernel)) testPownFloat4Int4Float4(float4 inX, unsigned int x) {
+    int4 inY = rsGetElementAt_int4(gAllocInY, x);
+    return pown(inX, inY);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestPownRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestPownRelaxed.rs
index 6660366..d35cd0b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestPownRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestPown.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowr.java b/tests/tests/renderscript/src/android/renderscript/cts/TestPowr.java
similarity index 66%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowr.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestPowr.java
index 740500d..b1f281b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowr.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestPowr.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestPowr extends RSBaseCompute {
+public class TestPowr extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestPowr script;
-    private ScriptC_GeneratedTestPowrRelaxed scriptRelaxed;
+    private ScriptC_TestPowr script;
+    private ScriptC_TestPowrRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestPowr(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestPowrRelaxed(mRS);
+        script = new ScriptC_TestPowr(mRS);
+        scriptRelaxed = new ScriptC_TestPowrRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inBase;
-        public float inExponent;
+        public float inX;
+        public float inY;
         public Target.Floaty out;
     }
 
     private void checkPowrFloatFloatFloat() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x432f9eac0c490ca4l, 0, 3000);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7ee76eaeab21ab0al, false);
+        Allocation inX = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x616e17ec158f6a8dl, 0, 3000);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x616e17ec158f6a8el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPowrFloatFloatFloat(inBase, out);
-            verifyResultsPowrFloatFloatFloat(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPowrFloatFloatFloat(inX, out);
+            verifyResultsPowrFloatFloatFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowrFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPowrFloatFloatFloat(inBase, out);
-            verifyResultsPowrFloatFloatFloat(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPowrFloatFloatFloat(inX, out);
+            verifyResultsPowrFloatFloatFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowrFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsPowrFloatFloatFloat(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 1];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 1];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPowrFloatFloatFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i];
-                args.inExponent = arrayInExponent[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePowr(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkPowrFloat2Float2Float2() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x5ce1f4c2eae1fd16l, 0, 3000);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1f9ec14817a9ddcl, false);
+        Allocation inX = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfc919df3002fbd93l, 0, 3000);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfc919df3002fbd94l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPowrFloat2Float2Float2(inBase, out);
-            verifyResultsPowrFloat2Float2Float2(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPowrFloat2Float2Float2(inX, out);
+            verifyResultsPowrFloat2Float2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowrFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPowrFloat2Float2Float2(inBase, out);
-            verifyResultsPowrFloat2Float2Float2(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPowrFloat2Float2Float2(inX, out);
+            verifyResultsPowrFloat2Float2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowrFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsPowrFloat2Float2Float2(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 2];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 2];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPowrFloat2Float2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i * 2 + j];
-                args.inExponent = arrayInExponent[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePowr(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkPowrFloat3Float3Float3() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf7c84366d355e289l, 0, 3000);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdd686715d89d205fl, false);
+        Allocation inX = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x50f67c13020dbf34l, 0, 3000);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x50f67c13020dbf35l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPowrFloat3Float3Float3(inBase, out);
-            verifyResultsPowrFloat3Float3Float3(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPowrFloat3Float3Float3(inX, out);
+            verifyResultsPowrFloat3Float3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowrFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPowrFloat3Float3Float3(inBase, out);
-            verifyResultsPowrFloat3Float3Float3(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPowrFloat3Float3Float3(inX, out);
+            verifyResultsPowrFloat3Float3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowrFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsPowrFloat3Float3Float3(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 4];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 4];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPowrFloat3Float3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i * 4 + j];
-                args.inExponent = arrayInExponent[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePowr(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkPowrFloat4Float4Float4() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x92ae920abbc9c7fcl, 0, 3000);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb8d6e2172fbfa2e2l, false);
+        Allocation inX = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa55b5a3303ebc0d5l, 0, 3000);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa55b5a3303ebc0d6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInExponent(inExponent);
-            script.forEach_testPowrFloat4Float4Float4(inBase, out);
-            verifyResultsPowrFloat4Float4Float4(inBase, inExponent, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testPowrFloat4Float4Float4(inX, out);
+            verifyResultsPowrFloat4Float4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowrFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInExponent(inExponent);
-            scriptRelaxed.forEach_testPowrFloat4Float4Float4(inBase, out);
-            verifyResultsPowrFloat4Float4Float4(inBase, inExponent, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testPowrFloat4Float4Float4(inX, out);
+            verifyResultsPowrFloat4Float4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testPowrFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsPowrFloat4Float4Float4(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
-        float[] arrayInBase = new float[INPUTSIZE * 4];
-        inBase.copyTo(arrayInBase);
-        float[] arrayInExponent = new float[INPUTSIZE * 4];
-        inExponent.copyTo(arrayInExponent);
+    private void verifyResultsPowrFloat4Float4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inBase = arrayInBase[i * 4 + j];
-                args.inExponent = arrayInExponent[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computePowr(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inBase, Float.floatToRawIntBits(args.inBase), args.inBase));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inExponent: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inExponent, Float.floatToRawIntBits(args.inExponent), args.inExponent));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowr.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestPowr.rs
similarity index 61%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowr.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestPowr.rs
index 9cd9da0..0fd603e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestPowr.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestPowr.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInExponent;
+rs_allocation gAllocInY;
 
-float __attribute__((kernel)) testPowrFloatFloatFloat(float inBase, unsigned int x) {
-    float inExponent = rsGetElementAt_float(gAllocInExponent, x);
-    return powr(inBase, inExponent);
+float __attribute__((kernel)) testPowrFloatFloatFloat(float inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return powr(inX, inY);
 }
 
-float2 __attribute__((kernel)) testPowrFloat2Float2Float2(float2 inBase, unsigned int x) {
-    float2 inExponent = rsGetElementAt_float2(gAllocInExponent, x);
-    return powr(inBase, inExponent);
+float2 __attribute__((kernel)) testPowrFloat2Float2Float2(float2 inX, unsigned int x) {
+    float2 inY = rsGetElementAt_float2(gAllocInY, x);
+    return powr(inX, inY);
 }
 
-float3 __attribute__((kernel)) testPowrFloat3Float3Float3(float3 inBase, unsigned int x) {
-    float3 inExponent = rsGetElementAt_float3(gAllocInExponent, x);
-    return powr(inBase, inExponent);
+float3 __attribute__((kernel)) testPowrFloat3Float3Float3(float3 inX, unsigned int x) {
+    float3 inY = rsGetElementAt_float3(gAllocInY, x);
+    return powr(inX, inY);
 }
 
-float4 __attribute__((kernel)) testPowrFloat4Float4Float4(float4 inBase, unsigned int x) {
-    float4 inExponent = rsGetElementAt_float4(gAllocInExponent, x);
-    return powr(inBase, inExponent);
+float4 __attribute__((kernel)) testPowrFloat4Float4Float4(float4 inX, unsigned int x) {
+    float4 inY = rsGetElementAt_float4(gAllocInY, x);
+    return powr(inX, inY);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestPowrRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestPowrRelaxed.rs
index 6660366..95e6f84 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestPowrRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestPowr.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRadians.java b/tests/tests/renderscript/src/android/renderscript/cts/TestRadians.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRadians.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestRadians.java
index 61bf9b2..2707ac2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRadians.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRadians.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestRadians extends RSBaseCompute {
+public class TestRadians extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestRadians script;
-    private ScriptC_GeneratedTestRadiansRelaxed scriptRelaxed;
+    private ScriptC_TestRadians script;
+    private ScriptC_TestRadiansRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestRadians(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestRadiansRelaxed(mRS);
+        script = new ScriptC_TestRadians(mRS);
+        scriptRelaxed = new ScriptC_TestRadiansRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float inValue;
         public Target.Floaty out;
     }
 
     private void checkRadiansFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6e5054c0042adfabl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xaa72f227598b8106l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testRadiansFloatFloat(inV, out);
-            verifyResultsRadiansFloatFloat(inV, out, false);
+            script.forEach_testRadiansFloatFloat(inValue, out);
+            verifyResultsRadiansFloatFloat(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRadiansFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testRadiansFloatFloat(inV, out);
-            verifyResultsRadiansFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testRadiansFloatFloat(inValue, out);
+            verifyResultsRadiansFloatFloat(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRadiansFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsRadiansFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRadiansFloatFloat(Allocation inValue, Allocation out, boolean relaxed) {
+        float[] arrayInValue = new float[INPUTSIZE * 1];
+        inValue.copyTo(arrayInValue);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.inValue = arrayInValue[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRadians(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inValue: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inValue, Float.floatToRawIntBits(args.inValue), args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkRadiansFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc20ed424de23baf7l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb28bd9316e059892l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testRadiansFloat2Float2(inV, out);
-            verifyResultsRadiansFloat2Float2(inV, out, false);
+            script.forEach_testRadiansFloat2Float2(inValue, out);
+            verifyResultsRadiansFloat2Float2(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRadiansFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testRadiansFloat2Float2(inV, out);
-            verifyResultsRadiansFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testRadiansFloat2Float2(inValue, out);
+            verifyResultsRadiansFloat2Float2(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRadiansFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsRadiansFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRadiansFloat2Float2(Allocation inValue, Allocation out, boolean relaxed) {
+        float[] arrayInValue = new float[INPUTSIZE * 2];
+        inValue.copyTo(arrayInValue);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.inValue = arrayInValue[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRadians(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inValue: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inValue, Float.floatToRawIntBits(args.inValue), args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkRadiansFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc2109d3fd43edbd5l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd8404eb8b743be10l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testRadiansFloat3Float3(inV, out);
-            verifyResultsRadiansFloat3Float3(inV, out, false);
+            script.forEach_testRadiansFloat3Float3(inValue, out);
+            verifyResultsRadiansFloat3Float3(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRadiansFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testRadiansFloat3Float3(inV, out);
-            verifyResultsRadiansFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testRadiansFloat3Float3(inValue, out);
+            verifyResultsRadiansFloat3Float3(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRadiansFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsRadiansFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRadiansFloat3Float3(Allocation inValue, Allocation out, boolean relaxed) {
+        float[] arrayInValue = new float[INPUTSIZE * 4];
+        inValue.copyTo(arrayInValue);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.inValue = arrayInValue[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRadians(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inValue: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inValue, Float.floatToRawIntBits(args.inValue), args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkRadiansFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc212665aca59fcb3l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfdf4c4400081e38el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testRadiansFloat4Float4(inV, out);
-            verifyResultsRadiansFloat4Float4(inV, out, false);
+            script.forEach_testRadiansFloat4Float4(inValue, out);
+            verifyResultsRadiansFloat4Float4(inValue, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRadiansFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testRadiansFloat4Float4(inV, out);
-            verifyResultsRadiansFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testRadiansFloat4Float4(inValue, out);
+            verifyResultsRadiansFloat4Float4(inValue, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRadiansFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsRadiansFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRadiansFloat4Float4(Allocation inValue, Allocation out, boolean relaxed) {
+        float[] arrayInValue = new float[INPUTSIZE * 4];
+        inValue.copyTo(arrayInValue);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.inValue = arrayInValue[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRadians(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input inValue: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.inValue, Float.floatToRawIntBits(args.inValue), args.inValue));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRadians.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRadians.rs
similarity index 82%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRadians.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestRadians.rs
index 035a936..09aa9a0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRadians.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRadians.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testRadiansFloatFloat(float inV) {
-    return radians(inV);
+float __attribute__((kernel)) testRadiansFloatFloat(float inValue) {
+    return radians(inValue);
 }
 
-float2 __attribute__((kernel)) testRadiansFloat2Float2(float2 inV) {
-    return radians(inV);
+float2 __attribute__((kernel)) testRadiansFloat2Float2(float2 inValue) {
+    return radians(inValue);
 }
 
-float3 __attribute__((kernel)) testRadiansFloat3Float3(float3 inV) {
-    return radians(inV);
+float3 __attribute__((kernel)) testRadiansFloat3Float3(float3 inValue) {
+    return radians(inValue);
 }
 
-float4 __attribute__((kernel)) testRadiansFloat4Float4(float4 inV) {
-    return radians(inV);
+float4 __attribute__((kernel)) testRadiansFloat4Float4(float4 inValue) {
+    return radians(inValue);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRadiansRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestRadiansRelaxed.rs
index 6660366..fa9209f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRadiansRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestRadians.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemainder.java b/tests/tests/renderscript/src/android/renderscript/cts/TestRemainder.java
similarity index 65%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemainder.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestRemainder.java
index 9bb5c65..8208d23 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemainder.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRemainder.java
@@ -22,58 +22,58 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestRemainder extends RSBaseCompute {
+public class TestRemainder extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestRemainder script;
-    private ScriptC_GeneratedTestRemainderRelaxed scriptRelaxed;
+    private ScriptC_TestRemainder script;
+    private ScriptC_TestRemainderRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestRemainder(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestRemainderRelaxed(mRS);
+        script = new ScriptC_TestRemainder(mRS);
+        scriptRelaxed = new ScriptC_TestRemainderRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
-        public float inNumerator;
-        public float inDenominator;
+        public float inX;
+        public float inY;
         public Target.Floaty out;
     }
 
     private void checkRemainderFloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd47c3f07317ea229l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb246eb0ee2ebe35al, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x27d6330966022888l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x27d6330966022889l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testRemainderFloatFloatFloat(inNumerator, out);
-            verifyResultsRemainderFloatFloatFloat(inNumerator, inDenominator, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testRemainderFloatFloatFloat(inX, out);
+            verifyResultsRemainderFloatFloatFloat(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemainderFloatFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testRemainderFloatFloatFloat(inNumerator, out);
-            verifyResultsRemainderFloatFloatFloat(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testRemainderFloatFloatFloat(inX, out);
+            verifyResultsRemainderFloatFloatFloat(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemainderFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsRemainderFloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 1];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 1];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsRemainderFloatFloatFloat(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 1];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 1];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i];
-                args.inDenominator = arrayInDenominator[i];
+                args.inX = arrayInX[i];
+                args.inY = arrayInY[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRemainder(args, target);
@@ -84,13 +84,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -110,39 +110,39 @@
     }
 
     private void checkRemainderFloat2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x27d975633fdcf8d5l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xce8489f2aa4be3a6l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfb2eaf332420c6b4l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfb2eaf332420c6b5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testRemainderFloat2Float2Float2(inNumerator, out);
-            verifyResultsRemainderFloat2Float2Float2(inNumerator, inDenominator, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testRemainderFloat2Float2Float2(inX, out);
+            verifyResultsRemainderFloat2Float2Float2(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemainderFloat2Float2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testRemainderFloat2Float2Float2(inNumerator, out);
-            verifyResultsRemainderFloat2Float2Float2(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testRemainderFloat2Float2Float2(inX, out);
+            verifyResultsRemainderFloat2Float2Float2(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemainderFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsRemainderFloat2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 2];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 2];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsRemainderFloat2Float2Float2(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 2];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 2];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 2 + j];
-                args.inDenominator = arrayInDenominator[i * 2 + j];
+                args.inX = arrayInX[i * 2 + j];
+                args.inY = arrayInY[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRemainder(args, target);
@@ -153,13 +153,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -179,39 +179,39 @@
     }
 
     private void checkRemainderFloat3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3681e9ce2a8e4d6l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x97e8cb3b7d2776dfl, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4f938d5325fec855l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4f938d5325fec856l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testRemainderFloat3Float3Float3(inNumerator, out);
-            verifyResultsRemainderFloat3Float3Float3(inNumerator, inDenominator, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testRemainderFloat3Float3Float3(inX, out);
+            verifyResultsRemainderFloat3Float3Float3(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemainderFloat3Float3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testRemainderFloat3Float3Float3(inNumerator, out);
-            verifyResultsRemainderFloat3Float3Float3(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testRemainderFloat3Float3Float3(inX, out);
+            verifyResultsRemainderFloat3Float3Float3(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemainderFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsRemainderFloat3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsRemainderFloat3Float3Float3(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRemainder(args, target);
@@ -222,13 +222,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -248,39 +248,39 @@
     }
 
     private void checkRemainderFloat4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdef6c7d68574d0d7l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x614d0c8450030a18l, false);
+        Allocation inX = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa3f86b7327dcc9f6l, false);
+        Allocation inY = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa3f86b7327dcc9f7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocInDenominator(inDenominator);
-            script.forEach_testRemainderFloat4Float4Float4(inNumerator, out);
-            verifyResultsRemainderFloat4Float4Float4(inNumerator, inDenominator, out, false);
+            script.set_gAllocInY(inY);
+            script.forEach_testRemainderFloat4Float4Float4(inX, out);
+            verifyResultsRemainderFloat4Float4Float4(inX, inY, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemainderFloat4Float4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocInDenominator(inDenominator);
-            scriptRelaxed.forEach_testRemainderFloat4Float4Float4(inNumerator, out);
-            verifyResultsRemainderFloat4Float4Float4(inNumerator, inDenominator, out, true);
+            scriptRelaxed.set_gAllocInY(inY);
+            scriptRelaxed.forEach_testRemainderFloat4Float4Float4(inX, out);
+            verifyResultsRemainderFloat4Float4Float4(inX, inY, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemainderFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsRemainderFloat4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
-        float[] arrayInNumerator = new float[INPUTSIZE * 4];
-        inNumerator.copyTo(arrayInNumerator);
-        float[] arrayInDenominator = new float[INPUTSIZE * 4];
-        inDenominator.copyTo(arrayInDenominator);
+    private void verifyResultsRemainderFloat4Float4Float4(Allocation inX, Allocation inY, Allocation out, boolean relaxed) {
+        float[] arrayInX = new float[INPUTSIZE * 4];
+        inX.copyTo(arrayInX);
+        float[] arrayInY = new float[INPUTSIZE * 4];
+        inY.copyTo(arrayInY);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
-                args.inNumerator = arrayInNumerator[i * 4 + j];
-                args.inDenominator = arrayInDenominator[i * 4 + j];
+                args.inX = arrayInX[i * 4 + j];
+                args.inY = arrayInY[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRemainder(args, target);
@@ -291,13 +291,13 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
+                    message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inNumerator, Float.floatToRawIntBits(args.inNumerator), args.inNumerator));
+                            args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Input inDenominator: ");
+                    message.append("Input inY: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inDenominator, Float.floatToRawIntBits(args.inDenominator), args.inDenominator));
+                            args.inY, Float.floatToRawIntBits(args.inY), args.inY));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemainder.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRemainder.rs
similarity index 61%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemainder.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestRemainder.rs
index a0aa809..86f2030 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRemainder.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRemainder.rs
@@ -19,24 +19,24 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocInDenominator;
+rs_allocation gAllocInY;
 
-float __attribute__((kernel)) testRemainderFloatFloatFloat(float inNumerator, unsigned int x) {
-    float inDenominator = rsGetElementAt_float(gAllocInDenominator, x);
-    return remainder(inNumerator, inDenominator);
+float __attribute__((kernel)) testRemainderFloatFloatFloat(float inX, unsigned int x) {
+    float inY = rsGetElementAt_float(gAllocInY, x);
+    return remainder(inX, inY);
 }
 
-float2 __attribute__((kernel)) testRemainderFloat2Float2Float2(float2 inNumerator, unsigned int x) {
-    float2 inDenominator = rsGetElementAt_float2(gAllocInDenominator, x);
-    return remainder(inNumerator, inDenominator);
+float2 __attribute__((kernel)) testRemainderFloat2Float2Float2(float2 inX, unsigned int x) {
+    float2 inY = rsGetElementAt_float2(gAllocInY, x);
+    return remainder(inX, inY);
 }
 
-float3 __attribute__((kernel)) testRemainderFloat3Float3Float3(float3 inNumerator, unsigned int x) {
-    float3 inDenominator = rsGetElementAt_float3(gAllocInDenominator, x);
-    return remainder(inNumerator, inDenominator);
+float3 __attribute__((kernel)) testRemainderFloat3Float3Float3(float3 inX, unsigned int x) {
+    float3 inY = rsGetElementAt_float3(gAllocInY, x);
+    return remainder(inX, inY);
 }
 
-float4 __attribute__((kernel)) testRemainderFloat4Float4Float4(float4 inNumerator, unsigned int x) {
-    float4 inDenominator = rsGetElementAt_float4(gAllocInDenominator, x);
-    return remainder(inNumerator, inDenominator);
+float4 __attribute__((kernel)) testRemainderFloat4Float4Float4(float4 inX, unsigned int x) {
+    float4 inY = rsGetElementAt_float4(gAllocInY, x);
+    return remainder(inX, inY);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRemainderRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestRemainderRelaxed.rs
index 6660366..7c45964 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRemainderRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestRemainder.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestRemquo.java b/tests/tests/renderscript/src/android/renderscript/cts/TestRemquo.java
new file mode 100644
index 0000000..7052dd1
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRemquo.java
@@ -0,0 +1,334 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+package android.renderscript.cts;
+
+import android.renderscript.Allocation;
+import android.renderscript.RSRuntimeException;
+import android.renderscript.Element;
+
+public class TestRemquo extends RSBaseCompute {
+
+    private ScriptC_TestRemquo script;
+    private ScriptC_TestRemquoRelaxed scriptRelaxed;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        script = new ScriptC_TestRemquo(mRS);
+        scriptRelaxed = new ScriptC_TestRemquoRelaxed(mRS);
+    }
+
+    public class ArgumentsFloatFloatIntFloat {
+        public float inB;
+        public float inC;
+        public int outD;
+        public float out;
+    }
+
+    private void checkRemquoFloatFloatIntFloat() {
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x118af9b82db63b13l, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x118af9b82db63b14l, false);
+        try {
+            Allocation outD = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
+            script.set_gAllocInC(inC);
+            script.set_gAllocOutD(outD);
+            script.forEach_testRemquoFloatFloatIntFloat(inB, out);
+            verifyResultsRemquoFloatFloatIntFloat(inB, inC, outD, out, false);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloatFloatIntFloat: " + e.toString());
+        }
+        try {
+            Allocation outD = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.set_gAllocOutD(outD);
+            scriptRelaxed.forEach_testRemquoFloatFloatIntFloat(inB, out);
+            verifyResultsRemquoFloatFloatIntFloat(inB, inC, outD, out, true);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloatFloatIntFloat: " + e.toString());
+        }
+    }
+
+    private void verifyResultsRemquoFloatFloatIntFloat(Allocation inB, Allocation inC, Allocation outD, Allocation out, boolean relaxed) {
+        float[] arrayInB = new float[INPUTSIZE * 1];
+        inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 1];
+        inC.copyTo(arrayInC);
+        int[] arrayOutD = new int[INPUTSIZE * 1];
+        outD.copyTo(arrayOutD);
+        float[] arrayOut = new float[INPUTSIZE * 1];
+        out.copyTo(arrayOut);
+        for (int i = 0; i < INPUTSIZE; i++) {
+            for (int j = 0; j < 1 ; j++) {
+                // Extract the inputs.
+                ArgumentsFloatFloatIntFloat args = new ArgumentsFloatFloatIntFloat();
+                args.inB = arrayInB[i];
+                args.inC = arrayInC[i];
+                // Extract the outputs.
+                args.outD = arrayOutD[i * 1 + j];
+                args.out = arrayOut[i * 1 + j];
+                // Ask the CoreMathVerifier to validate.
+                Target target = new Target(relaxed);
+                String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
+                boolean valid = errorMessage == null;
+                if (!valid) {
+                    StringBuilder message = new StringBuilder();
+                    message.append("Input inB: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                    message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
+                    message.append("Output outD: ");
+                    message.append(String.format("%d", args.outD));
+                    message.append("\n");
+                    message.append("Output out: ");
+                    message.append(Float.toString(args.out));
+                    message.append("\n");
+                    message.append(errorMessage);
+                    assertTrue("Incorrect output for checkRemquoFloatFloatIntFloat" +
+                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                }
+            }
+        }
+    }
+
+    private void checkRemquoFloat2Float2Int2Float2() {
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x9b98a1a6b125f903l, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x9b98a1a6b125f904l, false);
+        try {
+            Allocation outD = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            script.set_gAllocInC(inC);
+            script.set_gAllocOutD(outD);
+            script.forEach_testRemquoFloat2Float2Int2Float2(inB, out);
+            verifyResultsRemquoFloat2Float2Int2Float2(inB, inC, outD, out, false);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat2Float2Int2Float2: " + e.toString());
+        }
+        try {
+            Allocation outD = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.set_gAllocOutD(outD);
+            scriptRelaxed.forEach_testRemquoFloat2Float2Int2Float2(inB, out);
+            verifyResultsRemquoFloat2Float2Int2Float2(inB, inC, outD, out, true);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat2Float2Int2Float2: " + e.toString());
+        }
+    }
+
+    private void verifyResultsRemquoFloat2Float2Int2Float2(Allocation inB, Allocation inC, Allocation outD, Allocation out, boolean relaxed) {
+        float[] arrayInB = new float[INPUTSIZE * 2];
+        inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 2];
+        inC.copyTo(arrayInC);
+        int[] arrayOutD = new int[INPUTSIZE * 2];
+        outD.copyTo(arrayOutD);
+        float[] arrayOut = new float[INPUTSIZE * 2];
+        out.copyTo(arrayOut);
+        for (int i = 0; i < INPUTSIZE; i++) {
+            for (int j = 0; j < 2 ; j++) {
+                // Extract the inputs.
+                ArgumentsFloatFloatIntFloat args = new ArgumentsFloatFloatIntFloat();
+                args.inB = arrayInB[i * 2 + j];
+                args.inC = arrayInC[i * 2 + j];
+                // Extract the outputs.
+                args.outD = arrayOutD[i * 2 + j];
+                args.out = arrayOut[i * 2 + j];
+                // Ask the CoreMathVerifier to validate.
+                Target target = new Target(relaxed);
+                String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
+                boolean valid = errorMessage == null;
+                if (!valid) {
+                    StringBuilder message = new StringBuilder();
+                    message.append("Input inB: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                    message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
+                    message.append("Output outD: ");
+                    message.append(String.format("%d", args.outD));
+                    message.append("\n");
+                    message.append("Output out: ");
+                    message.append(Float.toString(args.out));
+                    message.append("\n");
+                    message.append(errorMessage);
+                    assertTrue("Incorrect output for checkRemquoFloat2Float2Int2Float2" +
+                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                }
+            }
+        }
+    }
+
+    private void checkRemquoFloat3Float3Int3Float3() {
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xa049a00a6911ca8fl, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xa049a00a6911ca90l, false);
+        try {
+            Allocation outD = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            script.set_gAllocInC(inC);
+            script.set_gAllocOutD(outD);
+            script.forEach_testRemquoFloat3Float3Int3Float3(inB, out);
+            verifyResultsRemquoFloat3Float3Int3Float3(inB, inC, outD, out, false);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat3Float3Int3Float3: " + e.toString());
+        }
+        try {
+            Allocation outD = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.set_gAllocOutD(outD);
+            scriptRelaxed.forEach_testRemquoFloat3Float3Int3Float3(inB, out);
+            verifyResultsRemquoFloat3Float3Int3Float3(inB, inC, outD, out, true);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat3Float3Int3Float3: " + e.toString());
+        }
+    }
+
+    private void verifyResultsRemquoFloat3Float3Int3Float3(Allocation inB, Allocation inC, Allocation outD, Allocation out, boolean relaxed) {
+        float[] arrayInB = new float[INPUTSIZE * 4];
+        inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 4];
+        inC.copyTo(arrayInC);
+        int[] arrayOutD = new int[INPUTSIZE * 4];
+        outD.copyTo(arrayOutD);
+        float[] arrayOut = new float[INPUTSIZE * 4];
+        out.copyTo(arrayOut);
+        for (int i = 0; i < INPUTSIZE; i++) {
+            for (int j = 0; j < 3 ; j++) {
+                // Extract the inputs.
+                ArgumentsFloatFloatIntFloat args = new ArgumentsFloatFloatIntFloat();
+                args.inB = arrayInB[i * 4 + j];
+                args.inC = arrayInC[i * 4 + j];
+                // Extract the outputs.
+                args.outD = arrayOutD[i * 4 + j];
+                args.out = arrayOut[i * 4 + j];
+                // Ask the CoreMathVerifier to validate.
+                Target target = new Target(relaxed);
+                String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
+                boolean valid = errorMessage == null;
+                if (!valid) {
+                    StringBuilder message = new StringBuilder();
+                    message.append("Input inB: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                    message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
+                    message.append("Output outD: ");
+                    message.append(String.format("%d", args.outD));
+                    message.append("\n");
+                    message.append("Output out: ");
+                    message.append(Float.toString(args.out));
+                    message.append("\n");
+                    message.append(errorMessage);
+                    assertTrue("Incorrect output for checkRemquoFloat3Float3Int3Float3" +
+                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                }
+            }
+        }
+    }
+
+    private void checkRemquoFloat4Float4Int4Float4() {
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa4fa9e6e20fd9c1bl, false);
+        Allocation inC = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa4fa9e6e20fd9c1cl, false);
+        try {
+            Allocation outD = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            script.set_gAllocInC(inC);
+            script.set_gAllocOutD(outD);
+            script.forEach_testRemquoFloat4Float4Int4Float4(inB, out);
+            verifyResultsRemquoFloat4Float4Int4Float4(inB, inC, outD, out, false);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat4Float4Int4Float4: " + e.toString());
+        }
+        try {
+            Allocation outD = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            scriptRelaxed.set_gAllocInC(inC);
+            scriptRelaxed.set_gAllocOutD(outD);
+            scriptRelaxed.forEach_testRemquoFloat4Float4Int4Float4(inB, out);
+            verifyResultsRemquoFloat4Float4Int4Float4(inB, inC, outD, out, true);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRemquoFloat4Float4Int4Float4: " + e.toString());
+        }
+    }
+
+    private void verifyResultsRemquoFloat4Float4Int4Float4(Allocation inB, Allocation inC, Allocation outD, Allocation out, boolean relaxed) {
+        float[] arrayInB = new float[INPUTSIZE * 4];
+        inB.copyTo(arrayInB);
+        float[] arrayInC = new float[INPUTSIZE * 4];
+        inC.copyTo(arrayInC);
+        int[] arrayOutD = new int[INPUTSIZE * 4];
+        outD.copyTo(arrayOutD);
+        float[] arrayOut = new float[INPUTSIZE * 4];
+        out.copyTo(arrayOut);
+        for (int i = 0; i < INPUTSIZE; i++) {
+            for (int j = 0; j < 4 ; j++) {
+                // Extract the inputs.
+                ArgumentsFloatFloatIntFloat args = new ArgumentsFloatFloatIntFloat();
+                args.inB = arrayInB[i * 4 + j];
+                args.inC = arrayInC[i * 4 + j];
+                // Extract the outputs.
+                args.outD = arrayOutD[i * 4 + j];
+                args.out = arrayOut[i * 4 + j];
+                // Ask the CoreMathVerifier to validate.
+                Target target = new Target(relaxed);
+                String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
+                boolean valid = errorMessage == null;
+                if (!valid) {
+                    StringBuilder message = new StringBuilder();
+                    message.append("Input inB: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inB, Float.floatToRawIntBits(args.inB), args.inB));
+                    message.append("\n");
+                    message.append("Input inC: ");
+                    message.append(String.format("%14.8g {%8x} %15a",
+                            args.inC, Float.floatToRawIntBits(args.inC), args.inC));
+                    message.append("\n");
+                    message.append("Output outD: ");
+                    message.append(String.format("%d", args.outD));
+                    message.append("\n");
+                    message.append("Output out: ");
+                    message.append(Float.toString(args.out));
+                    message.append("\n");
+                    message.append(errorMessage);
+                    assertTrue("Incorrect output for checkRemquoFloat4Float4Int4Float4" +
+                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                }
+            }
+        }
+    }
+
+    public void testRemquo() {
+        checkRemquoFloatFloatIntFloat();
+        checkRemquoFloat2Float2Int2Float2();
+        checkRemquoFloat3Float3Int3Float3();
+        checkRemquoFloat4Float4Int4Float4();
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestRemquo.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRemquo.rs
new file mode 100644
index 0000000..032e6c0
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRemquo.rs
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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)
+
+// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
+
+rs_allocation gAllocInC;
+rs_allocation gAllocOutD;
+
+float __attribute__((kernel)) testRemquoFloatFloatIntFloat(float inB, unsigned int x) {
+    float inC = rsGetElementAt_float(gAllocInC, x);
+    int outD = 0;
+    float out = remquo(inB, inC, &outD);
+    rsSetElementAt_int(gAllocOutD, outD, x);
+    return out;
+}
+
+float2 __attribute__((kernel)) testRemquoFloat2Float2Int2Float2(float2 inB, unsigned int x) {
+    float2 inC = rsGetElementAt_float2(gAllocInC, x);
+    int2 outD = 0;
+    float2 out = remquo(inB, inC, &outD);
+    rsSetElementAt_int2(gAllocOutD, outD, x);
+    return out;
+}
+
+float3 __attribute__((kernel)) testRemquoFloat3Float3Int3Float3(float3 inB, unsigned int x) {
+    float3 inC = rsGetElementAt_float3(gAllocInC, x);
+    int3 outD = 0;
+    float3 out = remquo(inB, inC, &outD);
+    rsSetElementAt_int3(gAllocOutD, outD, x);
+    return out;
+}
+
+float4 __attribute__((kernel)) testRemquoFloat4Float4Int4Float4(float4 inB, unsigned int x) {
+    float4 inC = rsGetElementAt_float4(gAllocInC, x);
+    int4 outD = 0;
+    float4 out = remquo(inB, inC, &outD);
+    rsSetElementAt_int4(gAllocOutD, outD, x);
+    return out;
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRemquoRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestRemquoRelaxed.rs
index 6660366..3962532 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRemquoRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestRemquo.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRint.java b/tests/tests/renderscript/src/android/renderscript/cts/TestRint.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRint.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestRint.java
index 5c296e9..6d42aeb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRint.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRint.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestRint extends RSBaseCompute {
+public class TestRint extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestRint script;
-    private ScriptC_GeneratedTestRintRelaxed scriptRelaxed;
+    private ScriptC_TestRint script;
+    private ScriptC_TestRintRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestRint(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestRintRelaxed(mRS);
+        script = new ScriptC_TestRint(mRS);
+        scriptRelaxed = new ScriptC_TestRintRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkRintFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb88cd9adbf02db54l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfe569fda5dbe93fal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testRintFloatFloat(inV, out);
-            verifyResultsRintFloatFloat(inV, out, false);
+            script.forEach_testRintFloatFloat(in, out);
+            verifyResultsRintFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRintFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testRintFloatFloat(inV, out);
-            verifyResultsRintFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testRintFloatFloat(in, out);
+            verifyResultsRintFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRintFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsRintFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRintFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRint(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkRintFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf12aed2f601c6298l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xffa7b22ac6b343c6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testRintFloat2Float2(inV, out);
-            verifyResultsRintFloat2Float2(inV, out, false);
+            script.forEach_testRintFloat2Float2(in, out);
+            verifyResultsRintFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRintFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testRintFloat2Float2(inV, out);
-            verifyResultsRintFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testRintFloat2Float2(in, out);
+            verifyResultsRintFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRintFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsRintFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRintFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRint(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkRintFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf12cb64a56378376l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xffa7bccc25b9d960l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testRintFloat3Float3(inV, out);
-            verifyResultsRintFloat3Float3(inV, out, false);
+            script.forEach_testRintFloat3Float3(in, out);
+            verifyResultsRintFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRintFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testRintFloat3Float3(inV, out);
-            verifyResultsRintFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testRintFloat3Float3(in, out);
+            verifyResultsRintFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRintFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsRintFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRintFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRint(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkRintFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf12e7f654c52a454l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xffa7c76d84c06efal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testRintFloat4Float4(inV, out);
-            verifyResultsRintFloat4Float4(inV, out, false);
+            script.forEach_testRintFloat4Float4(in, out);
+            verifyResultsRintFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRintFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testRintFloat4Float4(inV, out);
-            verifyResultsRintFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testRintFloat4Float4(in, out);
+            verifyResultsRintFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRintFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsRintFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRintFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRint(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRint.rs
similarity index 70%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestRint.rs
index d7e22fa..a551d68 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRint.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testRintFloatFloat(float in) {
+    return rint(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testRintFloat2Float2(float2 in) {
+    return rint(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testRintFloat3Float3(float3 in) {
+    return rint(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testRintFloat4Float4(float4 in) {
+    return rint(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRintRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestRintRelaxed.rs
index 6660366..9fb4636 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRintRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestRint.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRootn.java b/tests/tests/renderscript/src/android/renderscript/cts/TestRootn.java
similarity index 98%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRootn.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestRootn.java
index 06842b6..b9562e4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRootn.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRootn.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestRootn extends RSBaseCompute {
+public class TestRootn extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestRootn script;
-    private ScriptC_GeneratedTestRootnRelaxed scriptRelaxed;
+    private ScriptC_TestRootn script;
+    private ScriptC_TestRootnRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestRootn(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestRootnRelaxed(mRS);
+        script = new ScriptC_TestRootn(mRS);
+        scriptRelaxed = new ScriptC_TestRootnRelaxed(mRS);
     }
 
     public class ArgumentsFloatIntFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRootn.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRootn.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRootn.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestRootn.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRootnRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestRootnRelaxed.rs
index 6660366..e42d664 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRootnRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestRootn.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRound.java b/tests/tests/renderscript/src/android/renderscript/cts/TestRound.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRound.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestRound.java
index 9278a80..f9c9a9d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRound.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRound.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestRound extends RSBaseCompute {
+public class TestRound extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestRound script;
-    private ScriptC_GeneratedTestRoundRelaxed scriptRelaxed;
+    private ScriptC_TestRound script;
+    private ScriptC_TestRoundRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestRound(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestRoundRelaxed(mRS);
+        script = new ScriptC_TestRound(mRS);
+        scriptRelaxed = new ScriptC_TestRoundRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkRoundFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x51f05c443f4006c3l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x377ca8d7e9a82fc7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testRoundFloatFloat(inV, out);
-            verifyResultsRoundFloatFloat(inV, out, false);
+            script.forEach_testRoundFloatFloat(in, out);
+            verifyResultsRoundFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRoundFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testRoundFloatFloat(inV, out);
-            verifyResultsRoundFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testRoundFloatFloat(in, out);
+            verifyResultsRoundFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRoundFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsRoundFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRoundFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRound(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkRoundFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd0e51e3399eb174fl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc35ea17250f98f6bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testRoundFloat2Float2(inV, out);
-            verifyResultsRoundFloat2Float2(inV, out, false);
+            script.forEach_testRoundFloat2Float2(in, out);
+            verifyResultsRoundFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRoundFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testRoundFloat2Float2(inV, out);
-            verifyResultsRoundFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testRoundFloat2Float2(in, out);
+            verifyResultsRoundFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRoundFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsRoundFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRoundFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRound(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkRoundFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd0e6e74e9006382dl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc35eac13b0002505l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testRoundFloat3Float3(inV, out);
-            verifyResultsRoundFloat3Float3(inV, out, false);
+            script.forEach_testRoundFloat3Float3(in, out);
+            verifyResultsRoundFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRoundFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testRoundFloat3Float3(inV, out);
-            verifyResultsRoundFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testRoundFloat3Float3(in, out);
+            verifyResultsRoundFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRoundFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsRoundFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRoundFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRound(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkRoundFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd0e8b0698621590bl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc35eb6b50f06ba9fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testRoundFloat4Float4(inV, out);
-            verifyResultsRoundFloat4Float4(inV, out, false);
+            script.forEach_testRoundFloat4Float4(in, out);
+            verifyResultsRoundFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRoundFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testRoundFloat4Float4(inV, out);
-            verifyResultsRoundFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testRoundFloat4Float4(in, out);
+            verifyResultsRoundFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRoundFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsRoundFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRoundFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRound(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRound.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestRound.rs
index d7e22fa..0442849 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRound.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testRoundFloatFloat(float in) {
+    return round(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testRoundFloat2Float2(float2 in) {
+    return round(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testRoundFloat3Float3(float3 in) {
+    return round(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testRoundFloat4Float4(float4 in) {
+    return round(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRoundRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestRoundRelaxed.rs
index 6660366..ebbdccf 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRoundRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestRound.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRsqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/TestRsqrt.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRsqrt.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestRsqrt.java
index aec55d2..7b57621 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestRsqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRsqrt.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestRsqrt extends RSBaseCompute {
+public class TestRsqrt extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestRsqrt script;
-    private ScriptC_GeneratedTestRsqrtRelaxed scriptRelaxed;
+    private ScriptC_TestRsqrt script;
+    private ScriptC_TestRsqrtRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestRsqrt(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestRsqrtRelaxed(mRS);
+        script = new ScriptC_TestRsqrt(mRS);
+        scriptRelaxed = new ScriptC_TestRsqrtRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkRsqrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x637c4873aa3f3b8fl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x736e0d9786ef9c2bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testRsqrtFloatFloat(inV, out);
-            verifyResultsRsqrtFloatFloat(inV, out, false);
+            script.forEach_testRsqrtFloatFloat(in, out);
+            verifyResultsRsqrtFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRsqrtFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testRsqrtFloatFloat(inV, out);
-            verifyResultsRsqrtFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testRsqrtFloatFloat(in, out);
+            verifyResultsRsqrtFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRsqrtFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsRsqrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRsqrtFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRsqrt(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkRsqrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8c8200af672f6cbbl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb5df4d6949d76dafl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testRsqrtFloat2Float2(inV, out);
-            verifyResultsRsqrtFloat2Float2(inV, out, false);
+            script.forEach_testRsqrtFloat2Float2(in, out);
+            verifyResultsRsqrtFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRsqrtFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testRsqrtFloat2Float2(inV, out);
-            verifyResultsRsqrtFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testRsqrtFloat2Float2(in, out);
+            verifyResultsRsqrtFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRsqrtFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsRsqrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRsqrtFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRsqrt(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkRsqrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8c83c9ca5d4a8d99l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb5df580aa8de0349l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testRsqrtFloat3Float3(inV, out);
-            verifyResultsRsqrtFloat3Float3(inV, out, false);
+            script.forEach_testRsqrtFloat3Float3(in, out);
+            verifyResultsRsqrtFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRsqrtFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testRsqrtFloat3Float3(inV, out);
-            verifyResultsRsqrtFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testRsqrtFloat3Float3(in, out);
+            verifyResultsRsqrtFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRsqrtFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsRsqrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRsqrtFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRsqrt(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkRsqrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8c8592e55365ae77l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb5df62ac07e498e3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testRsqrtFloat4Float4(inV, out);
-            verifyResultsRsqrtFloat4Float4(inV, out, false);
+            script.forEach_testRsqrtFloat4Float4(in, out);
+            verifyResultsRsqrtFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRsqrtFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testRsqrtFloat4Float4(inV, out);
-            verifyResultsRsqrtFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testRsqrtFloat4Float4(in, out);
+            verifyResultsRsqrtFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testRsqrtFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsRsqrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsRsqrtFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeRsqrt(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRsqrt.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestRsqrt.rs
index d7e22fa..5978899 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRsqrt.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testRsqrtFloatFloat(float in) {
+    return rsqrt(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testRsqrtFloat2Float2(float2 in) {
+    return rsqrt(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testRsqrtFloat3Float3(float3 in) {
+    return rsqrt(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testRsqrtFloat4Float4(float4 in) {
+    return rsqrt(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestRsqrtRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestRsqrtRelaxed.rs
index 6660366..262761e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestRsqrtRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestRsqrt.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSign.java b/tests/tests/renderscript/src/android/renderscript/cts/TestSign.java
similarity index 97%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSign.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestSign.java
index b9de39f..77c467c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSign.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSign.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestSign extends RSBaseCompute {
+public class TestSign extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestSign script;
-    private ScriptC_GeneratedTestSignRelaxed scriptRelaxed;
+    private ScriptC_TestSign script;
+    private ScriptC_TestSignRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestSign(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestSignRelaxed(mRS);
+        script = new ScriptC_TestSign(mRS);
+        scriptRelaxed = new ScriptC_TestSignRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSign.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSign.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSign.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestSign.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSignRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestSignRelaxed.rs
index 6660366..1bc69fb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSignRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestSign.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSin.java b/tests/tests/renderscript/src/android/renderscript/cts/TestSin.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSin.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestSin.java
index e167669..ae039e2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSin.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestSin extends RSBaseCompute {
+public class TestSin extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestSin script;
-    private ScriptC_GeneratedTestSinRelaxed scriptRelaxed;
+    private ScriptC_TestSin script;
+    private ScriptC_TestSinRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestSin(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestSinRelaxed(mRS);
+        script = new ScriptC_TestSin(mRS);
+        scriptRelaxed = new ScriptC_TestSinRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkSinFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x983d81dfe3401d29l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd3e99dcfa01359f9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testSinFloatFloat(inV, out);
-            verifyResultsSinFloatFloat(inV, out, false);
+            script.forEach_testSinFloatFloat(in, out);
+            verifyResultsSinFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testSinFloatFloat(inV, out);
-            verifyResultsSinFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testSinFloatFloat(in, out);
+            verifyResultsSinFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsSinFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSin(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkSinFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x9419bf571e8cde05l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x9253f296dcfd528dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testSinFloat2Float2(inV, out);
-            verifyResultsSinFloat2Float2(inV, out, false);
+            script.forEach_testSinFloat2Float2(in, out);
+            verifyResultsSinFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testSinFloat2Float2(inV, out);
-            verifyResultsSinFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testSinFloat2Float2(in, out);
+            verifyResultsSinFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsSinFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSin(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkSinFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x941b887214a7fee3l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9253fd383c03e827l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testSinFloat3Float3(inV, out);
-            verifyResultsSinFloat3Float3(inV, out, false);
+            script.forEach_testSinFloat3Float3(in, out);
+            verifyResultsSinFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testSinFloat3Float3(inV, out);
-            verifyResultsSinFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testSinFloat3Float3(in, out);
+            verifyResultsSinFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsSinFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSin(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkSinFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x941d518d0ac31fc1l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x925407d99b0a7dc1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testSinFloat4Float4(inV, out);
-            verifyResultsSinFloat4Float4(inV, out, false);
+            script.forEach_testSinFloat4Float4(in, out);
+            verifyResultsSinFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testSinFloat4Float4(inV, out);
-            verifyResultsSinFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testSinFloat4Float4(in, out);
+            verifyResultsSinFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsSinFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSin(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSin.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestSin.rs
index d7e22fa..15e78ba 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSin.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testSinFloatFloat(float in) {
+    return sin(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testSinFloat2Float2(float2 in) {
+    return sin(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testSinFloat3Float3(float3 in) {
+    return sin(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testSinFloat4Float4(float4 in) {
+    return sin(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSinRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestSinRelaxed.rs
index 6660366..e9e4912 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSinRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestSin.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSincos.java b/tests/tests/renderscript/src/android/renderscript/cts/TestSincos.java
similarity index 74%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSincos.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestSincos.java
index 4c58cd6..60c6ef0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSincos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSincos.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestSincos extends RSBaseCompute {
+public class TestSincos extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestSincos script;
-    private ScriptC_GeneratedTestSincosRelaxed scriptRelaxed;
+    private ScriptC_TestSincos script;
+    private ScriptC_TestSincosRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestSincos(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestSincosRelaxed(mRS);
+        script = new ScriptC_TestSincos(mRS);
+        scriptRelaxed = new ScriptC_TestSincosRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
         public float inV;
-        public Target.Floaty outCos;
+        public Target.Floaty outCosptr;
         public Target.Floaty out;
     }
 
     private void checkSincosFloatFloatFloat() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb8748e13e46c48d4l, false);
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.set_gAllocOutCos(outCos);
+            script.set_gAllocOutCosptr(outCosptr);
             script.forEach_testSincosFloatFloatFloat(inV, out);
-            verifyResultsSincosFloatFloatFloat(inV, outCos, out, false);
+            verifyResultsSincosFloatFloatFloat(inV, outCosptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSincosFloatFloatFloat: " + e.toString());
         }
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutCos(outCos);
+            scriptRelaxed.set_gAllocOutCosptr(outCosptr);
             scriptRelaxed.forEach_testSincosFloatFloatFloat(inV, out);
-            verifyResultsSincosFloatFloatFloat(inV, outCos, out, true);
+            verifyResultsSincosFloatFloatFloat(inV, outCosptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSincosFloatFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsSincosFloatFloatFloat(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
+    private void verifyResultsSincosFloatFloatFloat(Allocation inV, Allocation outCosptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
         inV.copyTo(arrayInV);
-        float[] arrayOutCos = new float[INPUTSIZE * 1];
-        outCos.copyTo(arrayOutCos);
+        float[] arrayOutCosptr = new float[INPUTSIZE * 1];
+        outCosptr.copyTo(arrayOutCosptr);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -79,7 +79,7 @@
                 CoreMathVerifier.computeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCos.couldBe(arrayOutCos[i * 1 + j])) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j])) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 1 + j])) {
@@ -91,13 +91,13 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outCos: ");
-                    message.append(args.outCos.toString());
+                    message.append("Expected output outCosptr: ");
+                    message.append(args.outCosptr.toString());
                     message.append("\n");
-                    message.append("Actual   output outCos: ");
+                    message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutCos[i * 1 + j], Float.floatToRawIntBits(arrayOutCos[i * 1 + j]), arrayOutCos[i * 1 + j]));
-                    if (!args.outCos.couldBe(arrayOutCos[i * 1 + j])) {
+                            arrayOutCosptr[i * 1 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 1 + j]), arrayOutCosptr[i * 1 + j]));
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j])) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -121,30 +121,30 @@
     private void checkSincosFloat2Float2Float2() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc85bab4e3e2fc77cl, false);
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.set_gAllocOutCos(outCos);
+            script.set_gAllocOutCosptr(outCosptr);
             script.forEach_testSincosFloat2Float2Float2(inV, out);
-            verifyResultsSincosFloat2Float2Float2(inV, outCos, out, false);
+            verifyResultsSincosFloat2Float2Float2(inV, outCosptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSincosFloat2Float2Float2: " + e.toString());
         }
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutCos(outCos);
+            scriptRelaxed.set_gAllocOutCosptr(outCosptr);
             scriptRelaxed.forEach_testSincosFloat2Float2Float2(inV, out);
-            verifyResultsSincosFloat2Float2Float2(inV, outCos, out, true);
+            verifyResultsSincosFloat2Float2Float2(inV, outCosptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSincosFloat2Float2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsSincosFloat2Float2Float2(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
+    private void verifyResultsSincosFloat2Float2Float2(Allocation inV, Allocation outCosptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
         inV.copyTo(arrayInV);
-        float[] arrayOutCos = new float[INPUTSIZE * 2];
-        outCos.copyTo(arrayOutCos);
+        float[] arrayOutCosptr = new float[INPUTSIZE * 2];
+        outCosptr.copyTo(arrayOutCosptr);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -157,7 +157,7 @@
                 CoreMathVerifier.computeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCos.couldBe(arrayOutCos[i * 2 + j])) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j])) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
@@ -169,13 +169,13 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outCos: ");
-                    message.append(args.outCos.toString());
+                    message.append("Expected output outCosptr: ");
+                    message.append(args.outCosptr.toString());
                     message.append("\n");
-                    message.append("Actual   output outCos: ");
+                    message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutCos[i * 2 + j], Float.floatToRawIntBits(arrayOutCos[i * 2 + j]), arrayOutCos[i * 2 + j]));
-                    if (!args.outCos.couldBe(arrayOutCos[i * 2 + j])) {
+                            arrayOutCosptr[i * 2 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 2 + j]), arrayOutCosptr[i * 2 + j]));
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j])) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -199,30 +199,30 @@
     private void checkSincosFloat3Float3Float3() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1cc0896e400dc91dl, false);
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.set_gAllocOutCos(outCos);
+            script.set_gAllocOutCosptr(outCosptr);
             script.forEach_testSincosFloat3Float3Float3(inV, out);
-            verifyResultsSincosFloat3Float3Float3(inV, outCos, out, false);
+            verifyResultsSincosFloat3Float3Float3(inV, outCosptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSincosFloat3Float3Float3: " + e.toString());
         }
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutCos(outCos);
+            scriptRelaxed.set_gAllocOutCosptr(outCosptr);
             scriptRelaxed.forEach_testSincosFloat3Float3Float3(inV, out);
-            verifyResultsSincosFloat3Float3Float3(inV, outCos, out, true);
+            verifyResultsSincosFloat3Float3Float3(inV, outCosptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSincosFloat3Float3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsSincosFloat3Float3Float3(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
+    private void verifyResultsSincosFloat3Float3Float3(Allocation inV, Allocation outCosptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
         inV.copyTo(arrayInV);
-        float[] arrayOutCos = new float[INPUTSIZE * 4];
-        outCos.copyTo(arrayOutCos);
+        float[] arrayOutCosptr = new float[INPUTSIZE * 4];
+        outCosptr.copyTo(arrayOutCosptr);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -235,7 +235,7 @@
                 CoreMathVerifier.computeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCos.couldBe(arrayOutCos[i * 4 + j])) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
@@ -247,13 +247,13 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outCos: ");
-                    message.append(args.outCos.toString());
+                    message.append("Expected output outCosptr: ");
+                    message.append(args.outCosptr.toString());
                     message.append("\n");
-                    message.append("Actual   output outCos: ");
+                    message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutCos[i * 4 + j], Float.floatToRawIntBits(arrayOutCos[i * 4 + j]), arrayOutCos[i * 4 + j]));
-                    if (!args.outCos.couldBe(arrayOutCos[i * 4 + j])) {
+                            arrayOutCosptr[i * 4 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 4 + j]), arrayOutCosptr[i * 4 + j]));
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -277,30 +277,30 @@
     private void checkSincosFloat4Float4Float4() {
         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7125678e41ebcabel, false);
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.set_gAllocOutCos(outCos);
+            script.set_gAllocOutCosptr(outCosptr);
             script.forEach_testSincosFloat4Float4Float4(inV, out);
-            verifyResultsSincosFloat4Float4Float4(inV, outCos, out, false);
+            verifyResultsSincosFloat4Float4Float4(inV, outCosptr, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSincosFloat4Float4Float4: " + e.toString());
         }
         try {
-            Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            Allocation outCosptr = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.set_gAllocOutCos(outCos);
+            scriptRelaxed.set_gAllocOutCosptr(outCosptr);
             scriptRelaxed.forEach_testSincosFloat4Float4Float4(inV, out);
-            verifyResultsSincosFloat4Float4Float4(inV, outCos, out, true);
+            verifyResultsSincosFloat4Float4Float4(inV, outCosptr, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSincosFloat4Float4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsSincosFloat4Float4Float4(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
+    private void verifyResultsSincosFloat4Float4Float4(Allocation inV, Allocation outCosptr, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
         inV.copyTo(arrayInV);
-        float[] arrayOutCos = new float[INPUTSIZE * 4];
-        outCos.copyTo(arrayOutCos);
+        float[] arrayOutCosptr = new float[INPUTSIZE * 4];
+        outCosptr.copyTo(arrayOutCosptr);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
@@ -313,7 +313,7 @@
                 CoreMathVerifier.computeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCos.couldBe(arrayOutCos[i * 4 + j])) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
                     valid = false;
                 }
                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
@@ -325,13 +325,13 @@
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
                     message.append("\n");
-                    message.append("Expected output outCos: ");
-                    message.append(args.outCos.toString());
+                    message.append("Expected output outCosptr: ");
+                    message.append(args.outCosptr.toString());
                     message.append("\n");
-                    message.append("Actual   output outCos: ");
+                    message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOutCos[i * 4 + j], Float.floatToRawIntBits(arrayOutCos[i * 4 + j]), arrayOutCos[i * 4 + j]));
-                    if (!args.outCos.couldBe(arrayOutCos[i * 4 + j])) {
+                            arrayOutCosptr[i * 4 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 4 + j]), arrayOutCosptr[i * 4 + j]));
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSincos.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSincos.rs
similarity index 69%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSincos.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestSincos.rs
index 8bad9df..82ff9cd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSincos.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSincos.rs
@@ -19,32 +19,32 @@
 
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
-rs_allocation gAllocOutCos;
+rs_allocation gAllocOutCosptr;
 
 float __attribute__((kernel)) testSincosFloatFloatFloat(float inV, unsigned int x) {
-    float outCos = 0;
-    float out = sincos(inV, &outCos);
-    rsSetElementAt_float(gAllocOutCos, outCos, x);
+    float outCosptr = 0;
+    float out = sincos(inV, &outCosptr);
+    rsSetElementAt_float(gAllocOutCosptr, outCosptr, x);
     return out;
 }
 
 float2 __attribute__((kernel)) testSincosFloat2Float2Float2(float2 inV, unsigned int x) {
-    float2 outCos = 0;
-    float2 out = sincos(inV, &outCos);
-    rsSetElementAt_float2(gAllocOutCos, outCos, x);
+    float2 outCosptr = 0;
+    float2 out = sincos(inV, &outCosptr);
+    rsSetElementAt_float2(gAllocOutCosptr, outCosptr, x);
     return out;
 }
 
 float3 __attribute__((kernel)) testSincosFloat3Float3Float3(float3 inV, unsigned int x) {
-    float3 outCos = 0;
-    float3 out = sincos(inV, &outCos);
-    rsSetElementAt_float3(gAllocOutCos, outCos, x);
+    float3 outCosptr = 0;
+    float3 out = sincos(inV, &outCosptr);
+    rsSetElementAt_float3(gAllocOutCosptr, outCosptr, x);
     return out;
 }
 
 float4 __attribute__((kernel)) testSincosFloat4Float4Float4(float4 inV, unsigned int x) {
-    float4 outCos = 0;
-    float4 out = sincos(inV, &outCos);
-    rsSetElementAt_float4(gAllocOutCos, outCos, x);
+    float4 outCosptr = 0;
+    float4 out = sincos(inV, &outCosptr);
+    rsSetElementAt_float4(gAllocOutCosptr, outCosptr, x);
     return out;
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSincosRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestSincosRelaxed.rs
index 6660366..56cb9fc 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSincosRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestSincos.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestSinh.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestSinh.java
index 459da75..1ebcba2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSinh.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestSinh extends RSBaseCompute {
+public class TestSinh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestSinh script;
-    private ScriptC_GeneratedTestSinhRelaxed scriptRelaxed;
+    private ScriptC_TestSinh script;
+    private ScriptC_TestSinhRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestSinh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestSinhRelaxed(mRS);
+        script = new ScriptC_TestSinh(mRS);
+        scriptRelaxed = new ScriptC_TestSinhRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkSinhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x20bbe226bda70dd1l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x541c2eef0a5d2ff1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testSinhFloatFloat(inV, out);
-            verifyResultsSinhFloatFloat(inV, out, false);
+            script.forEach_testSinhFloatFloat(in, out);
+            verifyResultsSinhFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinhFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testSinhFloatFloat(inV, out);
-            verifyResultsSinhFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testSinhFloatFloat(in, out);
+            verifyResultsSinhFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinhFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsSinhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinhFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSinh(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkSinhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6cdf1f16900d0b6dl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7f8e1e7d8c47bec5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testSinhFloat2Float2(inV, out);
-            verifyResultsSinhFloat2Float2(inV, out, false);
+            script.forEach_testSinhFloat2Float2(in, out);
+            verifyResultsSinhFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinhFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testSinhFloat2Float2(inV, out);
-            verifyResultsSinhFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testSinhFloat2Float2(in, out);
+            verifyResultsSinhFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinhFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsSinhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinhFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSinh(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkSinhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6ce0e83186282c4bl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7f8e291eeb4e545fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testSinhFloat3Float3(inV, out);
-            verifyResultsSinhFloat3Float3(inV, out, false);
+            script.forEach_testSinhFloat3Float3(in, out);
+            verifyResultsSinhFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinhFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testSinhFloat3Float3(inV, out);
-            verifyResultsSinhFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testSinhFloat3Float3(in, out);
+            verifyResultsSinhFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinhFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsSinhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinhFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSinh(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkSinhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6ce2b14c7c434d29l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7f8e33c04a54e9f9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testSinhFloat4Float4(inV, out);
-            verifyResultsSinhFloat4Float4(inV, out, false);
+            script.forEach_testSinhFloat4Float4(in, out);
+            verifyResultsSinhFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinhFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testSinhFloat4Float4(inV, out);
-            verifyResultsSinhFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testSinhFloat4Float4(in, out);
+            verifyResultsSinhFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinhFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsSinhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinhFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSinh(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSinh.rs
similarity index 70%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestSinh.rs
index d7e22fa..bd94f0d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSinh.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testSinhFloatFloat(float in) {
+    return sinh(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testSinhFloat2Float2(float2 in) {
+    return sinh(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testSinhFloat3Float3(float3 in) {
+    return sinh(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testSinhFloat4Float4(float4 in) {
+    return sinh(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSinhRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestSinhRelaxed.rs
index 6660366..8ca3390 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSinhRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestSinh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestSinpi.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinpi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestSinpi.java
index 12a4c12..2df09b8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSinpi.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestSinpi extends RSBaseCompute {
+public class TestSinpi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestSinpi script;
-    private ScriptC_GeneratedTestSinpiRelaxed scriptRelaxed;
+    private ScriptC_TestSinpi script;
+    private ScriptC_TestSinpiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestSinpi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestSinpiRelaxed(mRS);
+        script = new ScriptC_TestSinpi(mRS);
+        scriptRelaxed = new ScriptC_TestSinpiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkSinpiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xde281c14dfd6b42cl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x34cb59f49416da82l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testSinpiFloatFloat(inV, out);
-            verifyResultsSinpiFloatFloat(inV, out, false);
+            script.forEach_testSinpiFloatFloat(in, out);
+            verifyResultsSinpiFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinpiFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testSinpiFloatFloat(inV, out);
-            verifyResultsSinpiFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testSinpiFloatFloat(in, out);
+            verifyResultsSinpiFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinpiFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsSinpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinpiFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSinpi(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkSinpiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8f8d880b7a3592b0l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x50bbd97d4a48b00el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testSinpiFloat2Float2(inV, out);
-            verifyResultsSinpiFloat2Float2(inV, out, false);
+            script.forEach_testSinpiFloat2Float2(in, out);
+            verifyResultsSinpiFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinpiFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testSinpiFloat2Float2(inV, out);
-            verifyResultsSinpiFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testSinpiFloat2Float2(in, out);
+            verifyResultsSinpiFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinpiFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsSinpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinpiFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSinpi(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkSinpiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8f8f51267050b38el, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x50bbe41ea94f45a8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testSinpiFloat3Float3(inV, out);
-            verifyResultsSinpiFloat3Float3(inV, out, false);
+            script.forEach_testSinpiFloat3Float3(in, out);
+            verifyResultsSinpiFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinpiFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testSinpiFloat3Float3(inV, out);
-            verifyResultsSinpiFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testSinpiFloat3Float3(in, out);
+            verifyResultsSinpiFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinpiFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsSinpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinpiFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSinpi(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkSinpiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8f911a41666bd46cl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x50bbeec00855db42l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testSinpiFloat4Float4(inV, out);
-            verifyResultsSinpiFloat4Float4(inV, out, false);
+            script.forEach_testSinpiFloat4Float4(in, out);
+            verifyResultsSinpiFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinpiFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testSinpiFloat4Float4(inV, out);
-            verifyResultsSinpiFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testSinpiFloat4Float4(in, out);
+            verifyResultsSinpiFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSinpiFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsSinpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSinpiFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSinpi(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSinpi.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestSinpi.rs
index d7e22fa..367040e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSinpi.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testSinpiFloatFloat(float in) {
+    return sinpi(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testSinpiFloat2Float2(float2 in) {
+    return sinpi(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testSinpiFloat3Float3(float3 in) {
+    return sinpi(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testSinpiFloat4Float4(float4 in) {
+    return sinpi(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSinpiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestSinpiRelaxed.rs
index 6660366..dd611a7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSinpiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestSinpi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/TestSqrt.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSqrt.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestSqrt.java
index cbe47fe..4537c3d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestSqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSqrt.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestSqrt extends RSBaseCompute {
+public class TestSqrt extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestSqrt script;
-    private ScriptC_GeneratedTestSqrtRelaxed scriptRelaxed;
+    private ScriptC_TestSqrt script;
+    private ScriptC_TestSqrtRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestSqrt(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestSqrtRelaxed(mRS);
+        script = new ScriptC_TestSqrt(mRS);
+        scriptRelaxed = new ScriptC_TestSqrtRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkSqrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdd88d60ed07c9951l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x940922bedb2c9271l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testSqrtFloatFloat(inV, out);
-            verifyResultsSqrtFloatFloat(inV, out, false);
+            script.forEach_testSqrtFloatFloat(in, out);
+            verifyResultsSqrtFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSqrtFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testSqrtFloatFloat(inV, out);
-            verifyResultsSqrtFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testSqrtFloatFloat(in, out);
+            verifyResultsSqrtFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSqrtFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsSqrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSqrtFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSqrt(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkSqrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x112cc64698699aedl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x35fb1678b6262d45l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testSqrtFloat2Float2(inV, out);
-            verifyResultsSqrtFloat2Float2(inV, out, false);
+            script.forEach_testSqrtFloat2Float2(in, out);
+            verifyResultsSqrtFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSqrtFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testSqrtFloat2Float2(inV, out);
-            verifyResultsSqrtFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testSqrtFloat2Float2(in, out);
+            verifyResultsSqrtFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSqrtFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsSqrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSqrtFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSqrt(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkSqrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x112e8f618e84bbcbl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x35fb211a152cc2dfl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testSqrtFloat3Float3(inV, out);
-            verifyResultsSqrtFloat3Float3(inV, out, false);
+            script.forEach_testSqrtFloat3Float3(in, out);
+            verifyResultsSqrtFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSqrtFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testSqrtFloat3Float3(inV, out);
-            verifyResultsSqrtFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testSqrtFloat3Float3(in, out);
+            verifyResultsSqrtFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSqrtFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsSqrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSqrtFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSqrt(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkSqrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1130587c849fdca9l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x35fb2bbb74335879l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testSqrtFloat4Float4(inV, out);
-            verifyResultsSqrtFloat4Float4(inV, out, false);
+            script.forEach_testSqrtFloat4Float4(in, out);
+            verifyResultsSqrtFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSqrtFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testSqrtFloat4Float4(inV, out);
-            verifyResultsSqrtFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testSqrtFloat4Float4(in, out);
+            verifyResultsSqrtFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testSqrtFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsSqrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsSqrtFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeSqrt(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSqrt.rs
similarity index 70%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestSqrt.rs
index d7e22fa..f1c163b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSqrt.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testSqrtFloatFloat(float in) {
+    return sqrt(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testSqrtFloat2Float2(float2 in) {
+    return sqrt(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testSqrtFloat3Float3(float3 in) {
+    return sqrt(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testSqrtFloat4Float4(float4 in) {
+    return sqrt(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestSqrtRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestSqrtRelaxed.rs
index 6660366..ee5b6a8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestSqrtRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestSqrt.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestStep.java b/tests/tests/renderscript/src/android/renderscript/cts/TestStep.java
similarity index 99%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestStep.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestStep.java
index 3873a2b..dabfd45 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestStep.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestStep.java
@@ -22,16 +22,16 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestStep extends RSBaseCompute {
+public class TestStep extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestStep script;
-    private ScriptC_GeneratedTestStepRelaxed scriptRelaxed;
+    private ScriptC_TestStep script;
+    private ScriptC_TestStepRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestStep(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestStepRelaxed(mRS);
+        script = new ScriptC_TestStep(mRS);
+        scriptRelaxed = new ScriptC_TestStepRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloatFloat {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestStep.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestStep.rs
similarity index 100%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestStep.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestStep.rs
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestStepRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestStepRelaxed.rs
index 6660366..b2bad68 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestStepRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestStep.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTan.java b/tests/tests/renderscript/src/android/renderscript/cts/TestTan.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTan.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestTan.java
index a90819d..29dae6f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTan.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestTan extends RSBaseCompute {
+public class TestTan extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestTan script;
-    private ScriptC_GeneratedTestTanRelaxed scriptRelaxed;
+    private ScriptC_TestTan script;
+    private ScriptC_TestTanRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestTan(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestTanRelaxed(mRS);
+        script = new ScriptC_TestTan(mRS);
+        scriptRelaxed = new ScriptC_TestTanRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkTanFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4222fe257bb50fa4l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfb95a6a791c2b8eal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testTanFloatFloat(inV, out);
-            verifyResultsTanFloatFloat(inV, out, false);
+            script.forEach_testTanFloatFloat(in, out);
+            verifyResultsTanFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testTanFloatFloat(inV, out);
-            verifyResultsTanFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testTanFloatFloat(in, out);
+            verifyResultsTanFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsTanFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTan(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkTanFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xae98520143383868l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1bdfd24778a20d36l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testTanFloat2Float2(inV, out);
-            verifyResultsTanFloat2Float2(inV, out, false);
+            script.forEach_testTanFloat2Float2(in, out);
+            verifyResultsTanFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testTanFloat2Float2(inV, out);
-            verifyResultsTanFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testTanFloat2Float2(in, out);
+            verifyResultsTanFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsTanFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTan(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkTanFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xae9a1b1c39535946l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1bdfdce8d7a8a2d0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testTanFloat3Float3(inV, out);
-            verifyResultsTanFloat3Float3(inV, out, false);
+            script.forEach_testTanFloat3Float3(in, out);
+            verifyResultsTanFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testTanFloat3Float3(inV, out);
-            verifyResultsTanFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testTanFloat3Float3(in, out);
+            verifyResultsTanFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsTanFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTan(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkTanFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xae9be4372f6e7a24l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1bdfe78a36af386al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testTanFloat4Float4(inV, out);
-            verifyResultsTanFloat4Float4(inV, out, false);
+            script.forEach_testTanFloat4Float4(in, out);
+            verifyResultsTanFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testTanFloat4Float4(inV, out);
-            verifyResultsTanFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testTanFloat4Float4(in, out);
+            verifyResultsTanFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsTanFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTan(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestTan.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestTan.rs
index d7e22fa..1024943 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTan.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testTanFloatFloat(float in) {
+    return tan(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testTanFloat2Float2(float2 in) {
+    return tan(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testTanFloat3Float3(float3 in) {
+    return tan(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testTanFloat4Float4(float4 in) {
+    return tan(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestTanRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestTanRelaxed.rs
index 6660366..9297033 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTanRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestTan.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestTanh.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanh.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestTanh.java
index bdfe88a..e554ad8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTanh.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestTanh extends RSBaseCompute {
+public class TestTanh extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestTanh script;
-    private ScriptC_GeneratedTestTanhRelaxed scriptRelaxed;
+    private ScriptC_TestTanh script;
+    private ScriptC_TestTanhRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestTanh(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestTanhRelaxed(mRS);
+        script = new ScriptC_TestTanh(mRS);
+        scriptRelaxed = new ScriptC_TestTanhRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkTanhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xaa47c1d7594bc87al, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfe01ab34a2d2226cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testTanhFloatFloat(inV, out);
-            verifyResultsTanhFloatFloat(inV, out, false);
+            script.forEach_testTanhFloatFloat(in, out);
+            verifyResultsTanhFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanhFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testTanhFloatFloat(inV, out);
-            verifyResultsTanhFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testTanhFloatFloat(in, out);
+            verifyResultsTanhFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanhFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsTanhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanhFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTanh(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkTanhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe021c1aab8d53a0el, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x9a0cb127b0f31928l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testTanhFloat2Float2(inV, out);
-            verifyResultsTanhFloat2Float2(inV, out, false);
+            script.forEach_testTanhFloat2Float2(in, out);
+            verifyResultsTanhFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanhFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testTanhFloat2Float2(inV, out);
-            verifyResultsTanhFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testTanhFloat2Float2(in, out);
+            verifyResultsTanhFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanhFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsTanhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanhFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTanh(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkTanhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe0238ac5aef05aecl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9a0cbbc90ff9aec2l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testTanhFloat3Float3(inV, out);
-            verifyResultsTanhFloat3Float3(inV, out, false);
+            script.forEach_testTanhFloat3Float3(in, out);
+            verifyResultsTanhFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanhFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testTanhFloat3Float3(inV, out);
-            verifyResultsTanhFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testTanhFloat3Float3(in, out);
+            verifyResultsTanhFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanhFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsTanhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanhFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTanh(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkTanhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe02553e0a50b7bcal, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x9a0cc66a6f00445cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testTanhFloat4Float4(inV, out);
-            verifyResultsTanhFloat4Float4(inV, out, false);
+            script.forEach_testTanhFloat4Float4(in, out);
+            verifyResultsTanhFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanhFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testTanhFloat4Float4(inV, out);
-            verifyResultsTanhFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testTanhFloat4Float4(in, out);
+            verifyResultsTanhFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanhFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsTanhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanhFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTanh(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestTanh.rs
similarity index 70%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestTanh.rs
index d7e22fa..a017c2b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTanh.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testTanhFloatFloat(float in) {
+    return tanh(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testTanhFloat2Float2(float2 in) {
+    return tanh(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testTanhFloat3Float3(float3 in) {
+    return tanh(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testTanhFloat4Float4(float4 in) {
+    return tanh(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestTanhRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestTanhRelaxed.rs
index 6660366..f99420a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTanhRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestTanh.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestTanpi.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanpi.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestTanpi.java
index f05b2c1..5e45440 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTanpi.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestTanpi extends RSBaseCompute {
+public class TestTanpi extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestTanpi script;
-    private ScriptC_GeneratedTestTanpiRelaxed scriptRelaxed;
+    private ScriptC_TestTanpi script;
+    private ScriptC_TestTanpiRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestTanpi(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestTanpiRelaxed(mRS);
+        script = new ScriptC_TestTanpi(mRS);
+        scriptRelaxed = new ScriptC_TestTanpiRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkTanpiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf8a6aebf04820e8fl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbe5739a52fbb952bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testTanpiFloatFloat(inV, out);
-            verifyResultsTanpiFloatFloat(inV, out, false);
+            script.forEach_testTanpiFloatFloat(in, out);
+            verifyResultsTanpiFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanpiFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testTanpiFloatFloat(inV, out);
-            verifyResultsTanpiFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testTanpiFloatFloat(in, out);
+            verifyResultsTanpiFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanpiFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsTanpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanpiFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTanpi(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkTanpiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xebbed6ee53d567bbl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc3fe7c117310deafl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testTanpiFloat2Float2(inV, out);
-            verifyResultsTanpiFloat2Float2(inV, out, false);
+            script.forEach_testTanpiFloat2Float2(in, out);
+            verifyResultsTanpiFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanpiFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testTanpiFloat2Float2(inV, out);
-            verifyResultsTanpiFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testTanpiFloat2Float2(in, out);
+            verifyResultsTanpiFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanpiFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsTanpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanpiFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTanpi(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkTanpiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xebc0a00949f08899l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc3fe86b2d2177449l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testTanpiFloat3Float3(inV, out);
-            verifyResultsTanpiFloat3Float3(inV, out, false);
+            script.forEach_testTanpiFloat3Float3(in, out);
+            verifyResultsTanpiFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanpiFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testTanpiFloat3Float3(inV, out);
-            verifyResultsTanpiFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testTanpiFloat3Float3(in, out);
+            verifyResultsTanpiFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanpiFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsTanpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanpiFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTanpi(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkTanpiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xebc26924400ba977l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc3fe9154311e09e3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testTanpiFloat4Float4(inV, out);
-            verifyResultsTanpiFloat4Float4(inV, out, false);
+            script.forEach_testTanpiFloat4Float4(in, out);
+            verifyResultsTanpiFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanpiFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testTanpiFloat4Float4(inV, out);
-            verifyResultsTanpiFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testTanpiFloat4Float4(in, out);
+            verifyResultsTanpiFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTanpiFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsTanpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTanpiFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTanpi(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestTanpi.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestTanpi.rs
index d7e22fa..883a571 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestExp.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTanpi.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testExpFloatFloat(float inV) {
-    return exp(inV);
+float __attribute__((kernel)) testTanpiFloatFloat(float in) {
+    return tanpi(in);
 }
 
-float2 __attribute__((kernel)) testExpFloat2Float2(float2 inV) {
-    return exp(inV);
+float2 __attribute__((kernel)) testTanpiFloat2Float2(float2 in) {
+    return tanpi(in);
 }
 
-float3 __attribute__((kernel)) testExpFloat3Float3(float3 inV) {
-    return exp(inV);
+float3 __attribute__((kernel)) testTanpiFloat3Float3(float3 in) {
+    return tanpi(in);
 }
 
-float4 __attribute__((kernel)) testExpFloat4Float4(float4 inV) {
-    return exp(inV);
+float4 __attribute__((kernel)) testTanpiFloat4Float4(float4 in) {
+    return tanpi(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestTanpiRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestTanpiRelaxed.rs
index 6660366..3fc9d28 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTanpiRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestTanpi.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTgamma.java b/tests/tests/renderscript/src/android/renderscript/cts/TestTgamma.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTgamma.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestTgamma.java
index feba850..c7bb7b5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTgamma.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTgamma.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestTgamma extends RSBaseCompute {
+public class TestTgamma extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestTgamma script;
-    private ScriptC_GeneratedTestTgammaRelaxed scriptRelaxed;
+    private ScriptC_TestTgamma script;
+    private ScriptC_TestTgammaRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestTgamma(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestTgammaRelaxed(mRS);
+        script = new ScriptC_TestTgamma(mRS);
+        scriptRelaxed = new ScriptC_TestTgammaRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkTgammaFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5c02c6a0eda55486l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe45f5203be15b490l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testTgammaFloatFloat(inV, out);
-            verifyResultsTgammaFloatFloat(inV, out, false);
+            script.forEach_testTgammaFloatFloat(in, out);
+            verifyResultsTgammaFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTgammaFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testTgammaFloatFloat(inV, out);
-            verifyResultsTgammaFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testTgammaFloatFloat(in, out);
+            verifyResultsTgammaFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTgammaFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsTgammaFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTgammaFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTgamma(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkTgammaFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8fe7559b3399bcbal, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x74767f039bfd9f2cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testTgammaFloat2Float2(inV, out);
-            verifyResultsTgammaFloat2Float2(inV, out, false);
+            script.forEach_testTgammaFloat2Float2(in, out);
+            verifyResultsTgammaFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTgammaFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testTgammaFloat2Float2(inV, out);
-            verifyResultsTgammaFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testTgammaFloat2Float2(in, out);
+            verifyResultsTgammaFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTgammaFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsTgammaFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTgammaFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTgamma(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkTgammaFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8fe91eb629b4dd98l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x747689a4fb0434c6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testTgammaFloat3Float3(inV, out);
-            verifyResultsTgammaFloat3Float3(inV, out, false);
+            script.forEach_testTgammaFloat3Float3(in, out);
+            verifyResultsTgammaFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTgammaFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testTgammaFloat3Float3(inV, out);
-            verifyResultsTgammaFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testTgammaFloat3Float3(in, out);
+            verifyResultsTgammaFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTgammaFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsTgammaFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTgammaFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTgamma(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkTgammaFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8feae7d11fcffe76l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x747694465a0aca60l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testTgammaFloat4Float4(inV, out);
-            verifyResultsTgammaFloat4Float4(inV, out, false);
+            script.forEach_testTgammaFloat4Float4(in, out);
+            verifyResultsTgammaFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTgammaFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testTgammaFloat4Float4(inV, out);
-            verifyResultsTgammaFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testTgammaFloat4Float4(in, out);
+            verifyResultsTgammaFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTgammaFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsTgammaFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTgammaFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTgamma(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTrunc.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestTgamma.rs
similarity index 69%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTrunc.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestTgamma.rs
index 89d959e..7dae4cf 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTrunc.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTgamma.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testTruncFloatFloat(float inV) {
-    return trunc(inV);
+float __attribute__((kernel)) testTgammaFloatFloat(float in) {
+    return tgamma(in);
 }
 
-float2 __attribute__((kernel)) testTruncFloat2Float2(float2 inV) {
-    return trunc(inV);
+float2 __attribute__((kernel)) testTgammaFloat2Float2(float2 in) {
+    return tgamma(in);
 }
 
-float3 __attribute__((kernel)) testTruncFloat3Float3(float3 inV) {
-    return trunc(inV);
+float3 __attribute__((kernel)) testTgammaFloat3Float3(float3 in) {
+    return tgamma(in);
 }
 
-float4 __attribute__((kernel)) testTruncFloat4Float4(float4 inV) {
-    return trunc(inV);
+float4 __attribute__((kernel)) testTgammaFloat4Float4(float4 in) {
+    return tgamma(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestTgammaRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestTgammaRelaxed.rs
index 6660366..7d57ba0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTgammaRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestTgamma.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTrunc.java b/tests/tests/renderscript/src/android/renderscript/cts/TestTrunc.java
similarity index 76%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTrunc.java
rename to tests/tests/renderscript/src/android/renderscript/cts/TestTrunc.java
index 0f80d61..0657844 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTrunc.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTrunc.java
@@ -22,51 +22,51 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
-public class GeneratedTestTrunc extends RSBaseCompute {
+public class TestTrunc extends RSBaseCompute {
 
-    private ScriptC_GeneratedTestTrunc script;
-    private ScriptC_GeneratedTestTruncRelaxed scriptRelaxed;
+    private ScriptC_TestTrunc script;
+    private ScriptC_TestTruncRelaxed scriptRelaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        script = new ScriptC_GeneratedTestTrunc(mRS);
-        scriptRelaxed = new ScriptC_GeneratedTestTruncRelaxed(mRS);
+        script = new ScriptC_TestTrunc(mRS);
+        scriptRelaxed = new ScriptC_TestTruncRelaxed(mRS);
     }
 
     public class ArgumentsFloatFloat {
-        public float inV;
+        public float in;
         public Target.Floaty out;
     }
 
     private void checkTruncFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb16f216b11eebe01l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6361d71a4dcff881l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            script.forEach_testTruncFloatFloat(inV, out);
-            verifyResultsTruncFloatFloat(inV, out, false);
+            script.forEach_testTruncFloatFloat(in, out);
+            verifyResultsTruncFloatFloat(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTruncFloatFloat: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
-            scriptRelaxed.forEach_testTruncFloatFloat(inV, out);
-            verifyResultsTruncFloatFloat(inV, out, true);
+            scriptRelaxed.forEach_testTruncFloatFloat(in, out);
+            verifyResultsTruncFloatFloat(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTruncFloatFloat: " + e.toString());
         }
     }
 
-    private void verifyResultsTruncFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 1];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTruncFloatFloat(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 1];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 1];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i];
+                args.in = arrayIn[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTrunc(args, target);
@@ -77,9 +77,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -99,33 +99,33 @@
     }
 
     private void checkTruncFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8b83139b49d4961dl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xcda9bef7b45256d5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            script.forEach_testTruncFloat2Float2(inV, out);
-            verifyResultsTruncFloat2Float2(inV, out, false);
+            script.forEach_testTruncFloat2Float2(in, out);
+            verifyResultsTruncFloat2Float2(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTruncFloat2Float2: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
-            scriptRelaxed.forEach_testTruncFloat2Float2(inV, out);
-            verifyResultsTruncFloat2Float2(inV, out, true);
+            scriptRelaxed.forEach_testTruncFloat2Float2(in, out);
+            verifyResultsTruncFloat2Float2(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTruncFloat2Float2: " + e.toString());
         }
     }
 
-    private void verifyResultsTruncFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 2];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTruncFloat2Float2(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 2];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 2 + j];
+                args.in = arrayIn[i * 2 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTrunc(args, target);
@@ -136,9 +136,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -158,33 +158,33 @@
     }
 
     private void checkTruncFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8b84dcb63fefb6fbl, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xcda9c9991358ec6fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            script.forEach_testTruncFloat3Float3(inV, out);
-            verifyResultsTruncFloat3Float3(inV, out, false);
+            script.forEach_testTruncFloat3Float3(in, out);
+            verifyResultsTruncFloat3Float3(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTruncFloat3Float3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
-            scriptRelaxed.forEach_testTruncFloat3Float3(inV, out);
-            verifyResultsTruncFloat3Float3(inV, out, true);
+            scriptRelaxed.forEach_testTruncFloat3Float3(in, out);
+            verifyResultsTruncFloat3Float3(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTruncFloat3Float3: " + e.toString());
         }
     }
 
-    private void verifyResultsTruncFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTruncFloat3Float3(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTrunc(args, target);
@@ -195,9 +195,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
@@ -217,33 +217,33 @@
     }
 
     private void checkTruncFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8b86a5d1360ad7d9l, false);
+        Allocation in = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xcda9d43a725f8209l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            script.forEach_testTruncFloat4Float4(inV, out);
-            verifyResultsTruncFloat4Float4(inV, out, false);
+            script.forEach_testTruncFloat4Float4(in, out);
+            verifyResultsTruncFloat4Float4(in, out, false);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTruncFloat4Float4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
-            scriptRelaxed.forEach_testTruncFloat4Float4(inV, out);
-            verifyResultsTruncFloat4Float4(inV, out, true);
+            scriptRelaxed.forEach_testTruncFloat4Float4(in, out);
+            verifyResultsTruncFloat4Float4(in, out, true);
         } catch (Exception e) {
             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testTruncFloat4Float4: " + e.toString());
         }
     }
 
-    private void verifyResultsTruncFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
-        float[] arrayInV = new float[INPUTSIZE * 4];
-        inV.copyTo(arrayInV);
+    private void verifyResultsTruncFloat4Float4(Allocation in, Allocation out, boolean relaxed) {
+        float[] arrayIn = new float[INPUTSIZE * 4];
+        in.copyTo(arrayIn);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
-                args.inV = arrayInV[i * 4 + j];
+                args.in = arrayIn[i * 4 + j];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeTrunc(args, target);
@@ -254,9 +254,9 @@
                 }
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
+                    message.append("Input in: ");
                     message.append(String.format("%14.8g {%8x} %15a",
-                            args.inV, Float.floatToRawIntBits(args.inV), args.inV));
+                            args.in, Float.floatToRawIntBits(args.in), args.in));
                     message.append("\n");
                     message.append("Expected output out: ");
                     message.append(args.out.toString());
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTrunc.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestTrunc.rs
similarity index 69%
rename from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTrunc.rs
rename to tests/tests/renderscript/src/android/renderscript/cts/TestTrunc.rs
index 89d959e..2422ae4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestTrunc.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTrunc.rs
@@ -20,18 +20,18 @@
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
 
-float __attribute__((kernel)) testTruncFloatFloat(float inV) {
-    return trunc(inV);
+float __attribute__((kernel)) testTruncFloatFloat(float in) {
+    return trunc(in);
 }
 
-float2 __attribute__((kernel)) testTruncFloat2Float2(float2 inV) {
-    return trunc(inV);
+float2 __attribute__((kernel)) testTruncFloat2Float2(float2 in) {
+    return trunc(in);
 }
 
-float3 __attribute__((kernel)) testTruncFloat3Float3(float3 inV) {
-    return trunc(inV);
+float3 __attribute__((kernel)) testTruncFloat3Float3(float3 in) {
+    return trunc(in);
 }
 
-float4 __attribute__((kernel)) testTruncFloat4Float4(float4 inV) {
-    return trunc(inV);
+float4 __attribute__((kernel)) testTruncFloat4Float4(float4 in) {
+    return trunc(in);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestTruncRelaxed.rs
similarity index 95%
copy from tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
copy to tests/tests/renderscript/src/android/renderscript/cts/TestTruncRelaxed.rs
index 6660366..b365243 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GeneratedTestFractRelaxed.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestTruncRelaxed.rs
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "GeneratedTestFract.rs"
+#include "TestTrunc.rs"
 #pragma rs_fp_relaxed
 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/YuvTest.java b/tests/tests/renderscript/src/android/renderscript/cts/YuvTest.java
index 5cdfe95..21f4417 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/YuvTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/YuvTest.java
@@ -72,9 +72,6 @@
         return Allocation.createTyped(mRS, Type.createXY(mRS, Element.RGBA_8888(mRS), width, height));
     }
 
-    public Allocation makeOutput_f4() {
-        return Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_4(mRS), width, height));
-    }
     // Test for the API 17 conversion path
     // This used a uchar buffer assuming nv21
     public void testV17() {
@@ -201,81 +198,4 @@
         checkForErrors();
     }
 
-    // Test for the API conversion to float4 RGBA using rsYuvToRGBA, YV12.
-    public void test_YV12_Float4() {
-        mVerify = new ScriptC_verify(mRS);
-        ScriptC_yuv script = new ScriptC_yuv(mRS);
-
-        makeYuvBuffer(512, 512);
-        Allocation aout = makeOutput_f4();
-        Allocation aref = makeOutput_f4();
-
-
-        Type.Builder tb = new Type.Builder(mRS, Element.YUV(mRS));
-        tb.setX(width);
-        tb.setY(height);
-        tb.setYuvFormat(android.graphics.ImageFormat.YV12);
-        Allocation ta = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_SCRIPT);
-
-        byte tmp[] = new byte[(width * height) + (getCWidth() * getCHeight() * 2)];
-        int i = 0;
-        for (int j = 0; j < (width * height); j++) {
-            tmp[i++] = by[j];
-        }
-        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
-            tmp[i++] = bu[j];
-        }
-        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
-            tmp[i++] = bv[j];
-        }
-        ta.copyFrom(tmp);
-        script.invoke_makeRef_f4(ay, au, av, aref);
-
-        script.set_mInput(ta);
-        script.forEach_cvt_f4(aout);
-        mVerify.invoke_verify(aref, aout, ay);
-
-        mRS.finish();
-        mVerify.invoke_checkError();
-        waitForMessage();
-        checkForErrors();
-    }
-
-    // Test for the API conversion to float4 RGBA using rsYuvToRGBA, NV21.
-    public void test_NV21_Float4() {
-        mVerify = new ScriptC_verify(mRS);
-        ScriptC_yuv script = new ScriptC_yuv(mRS);
-
-        makeYuvBuffer(512, 512);
-        Allocation aout = makeOutput_f4();
-        Allocation aref = makeOutput_f4();
-
-
-        Type.Builder tb = new Type.Builder(mRS, Element.YUV(mRS));
-        tb.setX(width);
-        tb.setY(height);
-        tb.setYuvFormat(android.graphics.ImageFormat.NV21);
-        Allocation ta = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_SCRIPT);
-
-        byte tmp[] = new byte[(width * height) + (getCWidth() * getCHeight() * 2)];
-        int i = 0;
-        for (int j = 0; j < (width * height); j++) {
-            tmp[i++] = by[j];
-        }
-        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
-            tmp[i++] = bv[j];
-            tmp[i++] = bu[j];
-        }
-        ta.copyFrom(tmp);
-        script.invoke_makeRef_f4(ay, au, av, aref);
-
-        script.set_mInput(ta);
-        script.forEach_cvt_f4(aout);
-        mVerify.invoke_verify(aref, aout, ay);
-
-        mRS.finish();
-        mVerify.invoke_checkError();
-        waitForMessage();
-        checkForErrors();
-    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_resize.rs b/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_resize.rs
index ccdf42f..fa8c8dd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_resize.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_resize.rs
@@ -242,203 +242,3 @@
     return (uchar)p;
 }
 
-float4 __attribute__((kernel)) bicubic_F4(uint32_t x, uint32_t y) {
-    float xf = (x + 0.5f) * scaleX - 0.5f;
-    float yf = (y + 0.5f) * scaleY - 0.5f;
-
-    int startx = (int) floor(xf - 1);
-    int starty = (int) floor(yf - 1);
-    xf = xf - floor(xf);
-    yf = yf - floor(yf);
-    int maxx = gWidthIn - 1;
-    int maxy = gHeightIn - 1;
-
-    uint32_t xs0 = (uint32_t) max(0, startx + 0);
-    uint32_t xs1 = (uint32_t) max(0, startx + 1);
-    uint32_t xs2 = (uint32_t) min(maxx, startx + 2);
-    uint32_t xs3 = (uint32_t) min(maxx, startx + 3);
-
-    uint32_t ys0 = (uint32_t) max(0, starty + 0);
-    uint32_t ys1 = (uint32_t) max(0, starty + 1);
-    uint32_t ys2 = (uint32_t) min(maxy, starty + 2);
-    uint32_t ys3 = (uint32_t) min(maxy, starty + 3);
-
-    float4 p00 = rsGetElementAt_float4(gIn, xs0, ys0);
-    float4 p01 = rsGetElementAt_float4(gIn, xs1, ys0);
-    float4 p02 = rsGetElementAt_float4(gIn, xs2, ys0);
-    float4 p03 = rsGetElementAt_float4(gIn, xs3, ys0);
-    float4 p0  = cubicInterpolate_F4(p00, p01, p02, p03, xf);
-
-    float4 p10 = rsGetElementAt_float4(gIn, xs0, ys1);
-    float4 p11 = rsGetElementAt_float4(gIn, xs1, ys1);
-    float4 p12 = rsGetElementAt_float4(gIn, xs2, ys1);
-    float4 p13 = rsGetElementAt_float4(gIn, xs3, ys1);
-    float4 p1  = cubicInterpolate_F4(p10, p11, p12, p13, xf);
-
-    float4 p20 = rsGetElementAt_float4(gIn, xs0, ys2);
-    float4 p21 = rsGetElementAt_float4(gIn, xs1, ys2);
-    float4 p22 = rsGetElementAt_float4(gIn, xs2, ys2);
-    float4 p23 = rsGetElementAt_float4(gIn, xs3, ys2);
-    float4 p2  = cubicInterpolate_F4(p20, p21, p22, p23, xf);
-
-    float4 p30 = rsGetElementAt_float4(gIn, xs0, ys3);
-    float4 p31 = rsGetElementAt_float4(gIn, xs1, ys3);
-    float4 p32 = rsGetElementAt_float4(gIn, xs2, ys3);
-    float4 p33 = rsGetElementAt_float4(gIn, xs3, ys3);
-    float4 p3  = cubicInterpolate_F4(p30, p31, p32, p33, xf);
-
-    float4 p  = cubicInterpolate_F4(p0, p1, p2, p3, yf);
-
-    return p;
-}
-
-float3 __attribute__((kernel)) bicubic_F3(uint32_t x, uint32_t y) {
-    float xf = (x + 0.5f) * scaleX - 0.5f;
-    float yf = (y + 0.5f) * scaleY - 0.5f;
-
-    int startx = (int) floor(xf - 1);
-    int starty = (int) floor(yf - 1);
-    xf = xf - floor(xf);
-    yf = yf - floor(yf);
-    int maxx = gWidthIn - 1;
-    int maxy = gHeightIn - 1;
-
-    uint32_t xs0 = (uint32_t) max(0, startx + 0);
-    uint32_t xs1 = (uint32_t) max(0, startx + 1);
-    uint32_t xs2 = (uint32_t) min(maxx, startx + 2);
-    uint32_t xs3 = (uint32_t) min(maxx, startx + 3);
-
-    uint32_t ys0 = (uint32_t) max(0, starty + 0);
-    uint32_t ys1 = (uint32_t) max(0, starty + 1);
-    uint32_t ys2 = (uint32_t) min(maxy, starty + 2);
-    uint32_t ys3 = (uint32_t) min(maxy, starty + 3);
-
-    float3 p00 = rsGetElementAt_float3(gIn, xs0, ys0);
-    float3 p01 = rsGetElementAt_float3(gIn, xs1, ys0);
-    float3 p02 = rsGetElementAt_float3(gIn, xs2, ys0);
-    float3 p03 = rsGetElementAt_float3(gIn, xs3, ys0);
-    float3 p0  = cubicInterpolate_F3(p00, p01, p02, p03, xf);
-
-    float3 p10 = rsGetElementAt_float3(gIn, xs0, ys1);
-    float3 p11 = rsGetElementAt_float3(gIn, xs1, ys1);
-    float3 p12 = rsGetElementAt_float3(gIn, xs2, ys1);
-    float3 p13 = rsGetElementAt_float3(gIn, xs3, ys1);
-    float3 p1  = cubicInterpolate_F3(p10, p11, p12, p13, xf);
-
-    float3 p20 = rsGetElementAt_float3(gIn, xs0, ys2);
-    float3 p21 = rsGetElementAt_float3(gIn, xs1, ys2);
-    float3 p22 = rsGetElementAt_float3(gIn, xs2, ys2);
-    float3 p23 = rsGetElementAt_float3(gIn, xs3, ys2);
-    float3 p2  = cubicInterpolate_F3(p20, p21, p22, p23, xf);
-
-    float3 p30 = rsGetElementAt_float3(gIn, xs0, ys3);
-    float3 p31 = rsGetElementAt_float3(gIn, xs1, ys3);
-    float3 p32 = rsGetElementAt_float3(gIn, xs2, ys3);
-    float3 p33 = rsGetElementAt_float3(gIn, xs3, ys3);
-    float3 p3  = cubicInterpolate_F3(p30, p31, p32, p33, xf);
-
-    float3 p  = cubicInterpolate_F3(p0, p1, p2, p3, yf);
-
-    return p;
-}
-
-float2 __attribute__((kernel)) bicubic_F2(uint32_t x, uint32_t y) {
-    float xf = (x + 0.5f) * scaleX - 0.5f;
-    float yf = (y + 0.5f) * scaleY - 0.5f;
-
-    int startx = (int) floor(xf - 1);
-    int starty = (int) floor(yf - 1);
-    xf = xf - floor(xf);
-    yf = yf - floor(yf);
-    int maxx = gWidthIn - 1;
-    int maxy = gHeightIn - 1;
-
-    uint32_t xs0 = (uint32_t) max(0, startx + 0);
-    uint32_t xs1 = (uint32_t) max(0, startx + 1);
-    uint32_t xs2 = (uint32_t) min(maxx, startx + 2);
-    uint32_t xs3 = (uint32_t) min(maxx, startx + 3);
-
-    uint32_t ys0 = (uint32_t) max(0, starty + 0);
-    uint32_t ys1 = (uint32_t) max(0, starty + 1);
-    uint32_t ys2 = (uint32_t) min(maxy, starty + 2);
-    uint32_t ys3 = (uint32_t) min(maxy, starty + 3);
-
-    float2 p00 = rsGetElementAt_float2(gIn, xs0, ys0);
-    float2 p01 = rsGetElementAt_float2(gIn, xs1, ys0);
-    float2 p02 = rsGetElementAt_float2(gIn, xs2, ys0);
-    float2 p03 = rsGetElementAt_float2(gIn, xs3, ys0);
-    float2 p0  = cubicInterpolate_F2(p00, p01, p02, p03, xf);
-
-    float2 p10 = rsGetElementAt_float2(gIn, xs0, ys1);
-    float2 p11 = rsGetElementAt_float2(gIn, xs1, ys1);
-    float2 p12 = rsGetElementAt_float2(gIn, xs2, ys1);
-    float2 p13 = rsGetElementAt_float2(gIn, xs3, ys1);
-    float2 p1  = cubicInterpolate_F2(p10, p11, p12, p13, xf);
-
-    float2 p20 = rsGetElementAt_float2(gIn, xs0, ys2);
-    float2 p21 = rsGetElementAt_float2(gIn, xs1, ys2);
-    float2 p22 = rsGetElementAt_float2(gIn, xs2, ys2);
-    float2 p23 = rsGetElementAt_float2(gIn, xs3, ys2);
-    float2 p2  = cubicInterpolate_F2(p20, p21, p22, p23, xf);
-
-    float2 p30 = rsGetElementAt_float2(gIn, xs0, ys3);
-    float2 p31 = rsGetElementAt_float2(gIn, xs1, ys3);
-    float2 p32 = rsGetElementAt_float2(gIn, xs2, ys3);
-    float2 p33 = rsGetElementAt_float2(gIn, xs3, ys3);
-    float2 p3  = cubicInterpolate_F2(p30, p31, p32, p33, xf);
-
-    float2 p  = cubicInterpolate_F2(p0, p1, p2, p3, yf);
-
-    return p;
-}
-
-float __attribute__((kernel)) bicubic_F1(uint32_t x, uint32_t y) {
-    float xf = (x + 0.5f) * scaleX - 0.5f;
-    float yf = (y + 0.5f) * scaleY - 0.5f;
-
-    int startx = (int) floor(xf - 1);
-    int starty = (int) floor(yf - 1);
-    xf = xf - floor(xf);
-    yf = yf - floor(yf);
-    int maxx = gWidthIn - 1;
-    int maxy = gHeightIn - 1;
-
-    uint32_t xs0 = (uint32_t) max(0, startx + 0);
-    uint32_t xs1 = (uint32_t) max(0, startx + 1);
-    uint32_t xs2 = (uint32_t) min(maxx, startx + 2);
-    uint32_t xs3 = (uint32_t) min(maxx, startx + 3);
-
-    uint32_t ys0 = (uint32_t) max(0, starty + 0);
-    uint32_t ys1 = (uint32_t) max(0, starty + 1);
-    uint32_t ys2 = (uint32_t) min(maxy, starty + 2);
-    uint32_t ys3 = (uint32_t) min(maxy, starty + 3);
-
-    float p00 = rsGetElementAt_float(gIn, xs0, ys0);
-    float p01 = rsGetElementAt_float(gIn, xs1, ys0);
-    float p02 = rsGetElementAt_float(gIn, xs2, ys0);
-    float p03 = rsGetElementAt_float(gIn, xs3, ys0);
-    float p0  = cubicInterpolate_F1(p00, p01, p02, p03, xf);
-
-    float p10 = rsGetElementAt_float(gIn, xs0, ys1);
-    float p11 = rsGetElementAt_float(gIn, xs1, ys1);
-    float p12 = rsGetElementAt_float(gIn, xs2, ys1);
-    float p13 = rsGetElementAt_float(gIn, xs3, ys1);
-    float p1  = cubicInterpolate_F1(p10, p11, p12, p13, xf);
-
-    float p20 = rsGetElementAt_float(gIn, xs0, ys2);
-    float p21 = rsGetElementAt_float(gIn, xs1, ys2);
-    float p22 = rsGetElementAt_float(gIn, xs2, ys2);
-    float p23 = rsGetElementAt_float(gIn, xs3, ys2);
-    float p2  = cubicInterpolate_F1(p20, p21, p22, p23, xf);
-
-    float p30 = rsGetElementAt_float(gIn, xs0, ys3);
-    float p31 = rsGetElementAt_float(gIn, xs1, ys3);
-    float p32 = rsGetElementAt_float(gIn, xs2, ys3);
-    float p33 = rsGetElementAt_float(gIn, xs3, ys3);
-    float p3  = cubicInterpolate_F1(p30, p31, p32, p33, xf);
-
-    float p  = cubicInterpolate_F1(p0, p1, p2, p3, yf);
-
-    return p;
-}
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/oob.rs b/tests/tests/renderscript/src/android/renderscript/cts/oob.rs
index 11b7cef..b191c69 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/oob.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/oob.rs
@@ -1,4 +1,5 @@
-#include "shared.rsh"
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
 
 rs_allocation aInt;
 
@@ -9,7 +10,3 @@
 void __attribute__((kernel)) write_k(int unused) {
     rsSetElementAt_int(aInt, 1, 1);
 }
-
-void send_msg() {
-    rsSendToClientBlocking(RS_MSG_TEST_PASSED);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/yuv.rs b/tests/tests/renderscript/src/android/renderscript/cts/yuv.rs
index 4aa1564..6d45331 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/yuv.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/yuv.rs
@@ -56,20 +56,6 @@
     return (uchar4){p.x, p.y, p.z, p.w};
 }
 
-static float4 yuvToRGBA_f4(uchar y, uchar u, uchar v) {
-    float4 yuv_U_values = {0.f, -0.392f * 0.003921569f, +2.02 * 0.003921569f, 0.f};
-    float4 yuv_V_values = {1.603f * 0.003921569f, -0.815f * 0.003921569f, 0.f, 0.f};
-
-    float4 color = (float)y * 0.003921569f;
-    float4 fU = ((float)u) - 128.f;
-    float4 fV = ((float)v) - 128.f;
-
-    color += fU * yuv_U_values;
-    color += fV * yuv_V_values;
-    color = clamp(color, 0.f, 1.f);
-    return color;
-}
-
 void makeRef(rs_allocation ay, rs_allocation au, rs_allocation av, rs_allocation aout) {
     uint32_t w = rsAllocationGetDimX(ay);
     uint32_t h = rsAllocationGetDimY(ay);
@@ -94,29 +80,6 @@
     }
 }
 
-void makeRef_f4(rs_allocation ay, rs_allocation au, rs_allocation av, rs_allocation aout) {
-    uint32_t w = rsAllocationGetDimX(ay);
-    uint32_t h = rsAllocationGetDimY(ay);
-
-    for (int y = 0; y < h; y++) {
-        //rsDebug("y", y);
-        for (int x = 0; x < w; x++) {
-
-            uchar py = rsGetElementAt_uchar(ay, x, y);
-            uchar pu = rsGetElementAt_uchar(au, x >> 1, y >> 1);
-            uchar pv = rsGetElementAt_uchar(av, x >> 1, y >> 1);
-
-            //rsDebug("py", py);
-            //rsDebug(" u", pu);
-            //rsDebug(" v", pv);
-
-            float4 rgb = yuvToRGBA_f4(py, pu, pv);
-            //rsDebug("  ", rgb);
-
-            rsSetElementAt_float4(aout, rgb, x, y);
-        }
-    }
-}
 
 uchar4 __attribute__((kernel)) cvt(uint32_t x, uint32_t y) {
 
@@ -131,16 +94,4 @@
     return yuvToRGBA4(py, pu, pv);
 }
 
-float4 __attribute__((kernel)) cvt_f4(uint32_t x, uint32_t y) {
-
-    uchar py = rsGetElementAtYuv_uchar_Y(mInput, x, y);
-    uchar pu = rsGetElementAtYuv_uchar_U(mInput, x, y);
-    uchar pv = rsGetElementAtYuv_uchar_V(mInput, x, y);
-
-    //rsDebug("py2", py);
-    //rsDebug(" u2", pu);
-    //rsDebug(" v2", pv);
-
-    return rsYuvToRGBA_float4(py, pu, pv);
-}
 
diff --git a/tests/tests/rscpp/librscpptest/Android.mk b/tests/tests/rscpp/librscpptest/Android.mk
index bc2f81e..9813ba6 100644
--- a/tests/tests/rscpp/librscpptest/Android.mk
+++ b/tests/tests/rscpp/librscpptest/Android.mk
@@ -17,8 +17,6 @@
 #
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-LOCAL_CLANG := true
 LOCAL_MODULE := librscpptest_jni
 LOCAL_MODULE_TAGS := optional
 LOCAL_SRC_FILES := rs_jni.cpp rs_jni_allocation.cpp
@@ -27,18 +25,10 @@
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
 LOCAL_C_INCLUDES += frameworks/rs/cpp
 LOCAL_C_INCLUDES += frameworks/rs
+LOCAL_C_INCLUDES += external/stlport/stlport bionic/ bionic/libstdc++/include
 
 LOCAL_SHARED_LIBRARIES := libdl liblog
-LOCAL_STATIC_LIBRARIES := libRScpp_static libcutils
-
-ifeq ($(my_32_64_bit_suffix),32)
-    LOCAL_SDK_VERSION := 8
-else
-    LOCAL_SDK_VERSION := 21
-endif
-
-LOCAL_NDK_STL_VARIANT := stlport_static
-
+LOCAL_STATIC_LIBRARIES := libRScpp_static libstlport_static libcutils
 include $(BUILD_SHARED_LIBRARY)
 
 
diff --git a/tests/tests/security/jni/android_security_cts_CharDeviceTest.cpp b/tests/tests/security/jni/android_security_cts_CharDeviceTest.cpp
index 32f204f..9aea4b3 100644
--- a/tests/tests/security/jni/android_security_cts_CharDeviceTest.cpp
+++ b/tests/tests/security/jni/android_security_cts_CharDeviceTest.cpp
@@ -15,7 +15,6 @@
  */
 
 #include <jni.h>
-#include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
diff --git a/tests/tests/security/jni/android_security_cts_KernelSettingsTest.cpp b/tests/tests/security/jni/android_security_cts_KernelSettingsTest.cpp
index bb5e042..bab7b57 100644
--- a/tests/tests/security/jni/android_security_cts_KernelSettingsTest.cpp
+++ b/tests/tests/security/jni/android_security_cts_KernelSettingsTest.cpp
@@ -20,10 +20,10 @@
 #include <sys/xattr.h>
 #include <errno.h>
 
-static jboolean android_security_cts_KernelSettingsTest_supportsXattr(JNIEnv* /* env */, jobject /* thiz */)
+static jboolean android_security_cts_KernelSettingsTest_supportsXattr(JNIEnv* env, jobject thiz)
 {
-    int result = getxattr("/system/bin/cat", "security.capability", NULL, 0);
-    return ((result != -1) || (errno == ENODATA));
+    int result = getxattr("/system/bin/toolbox", "security.capability", NULL, 0);
+    return ((result >= 0) || (errno == ENODATA));
 }
 
 static JNINativeMethod gMethods[] = {
diff --git a/tests/tests/security/jni/android_security_cts_LinuxRngTest.cpp b/tests/tests/security/jni/android_security_cts_LinuxRngTest.cpp
index 9b8016e..671226b 100644
--- a/tests/tests/security/jni/android_security_cts_LinuxRngTest.cpp
+++ b/tests/tests/security/jni/android_security_cts_LinuxRngTest.cpp
@@ -18,7 +18,6 @@
 #include <jni.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <sys/stat.h>
 
 /*
diff --git a/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp b/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
index 3b63ba9..a35581d 100644
--- a/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
+++ b/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
@@ -16,6 +16,10 @@
 
 #include <jni.h>
 #include <linux/futex.h>
+#include <linux/netlink.h>
+#include <linux/sock_diag.h>
+#include <stdio.h>
+#include <sys/socket.h>
 #include <sys/types.h>
 #include <sys/syscall.h>
 #include <unistd.h>
@@ -24,7 +28,6 @@
 #include <sys/wait.h>
 #include <signal.h>
 #include <stdlib.h>
-#include <string.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
 #include <sys/utsname.h>
@@ -35,6 +38,9 @@
 #include <inttypes.h>
 #include <linux/sysctl.h>
 
+#define PASSED 0
+#define UNKNOWN_ERROR -1
+
 /*
  * Returns true iff this device is vulnerable to CVE-2013-2094.
  * A patch for CVE-2013-2094 can be found at
@@ -84,6 +90,84 @@
 }
 
 /*
+ * Will hang if vulnerable, return 0 if successful, -1 on unforseen
+ * error.
+ */
+static jint android_security_cts_NativeCodeTest_doSockDiagTest(JNIEnv* env, jobject thiz)
+{
+    int fd, nlmsg_size, err, len;
+    char buf[1024];
+    struct sockaddr_nl nladdr;
+    struct nlmsghdr *nlh;
+    struct msghdr msg;
+    struct iovec iov;
+    struct sock_diag_req* sock_diag_data;
+
+    int major, minor;
+    struct utsname uts;
+    if (uname(&uts) != -1 &&
+        sscanf(uts.release, "%d.%d", &major, &minor) == 2 &&
+        ((major > 3) || ((major == 3) && (minor > 8)))) {
+        // Kernels above 3.8 are patched against CVE-2013-1763
+        // This test generates false positives if run on > 3.8.
+        // b/17253473
+        return PASSED;
+    }
+
+    fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG);
+    if (fd == -1) {
+        switch (errno) {
+            /* NETLINK_SOCK_DIAG not accessible, vector dne */
+            case EACCES:
+            case EAFNOSUPPORT:
+            case EPERM:
+            case EPROTONOSUPPORT:
+                return PASSED;
+            default:
+                return UNKNOWN_ERROR;
+        }
+    }
+    /* prepare and send netlink packet */
+    memset(&nladdr, 0, sizeof(nladdr));
+    nladdr.nl_family = AF_NETLINK;
+    nlmsg_size = NLMSG_ALIGN(NLMSG_HDRLEN + sizeof(sock_diag_data));
+    nlh = (nlmsghdr *)malloc(nlmsg_size);
+    nlh->nlmsg_len = nlmsg_size;
+    nlh->nlmsg_pid = 0;      //send packet to kernel
+    nlh->nlmsg_type = SOCK_DIAG_BY_FAMILY;
+    nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
+    iov = { (void *) nlh, nlmsg_size };
+    msg = { (void *) &nladdr, sizeof(nladdr), &iov, 1, NULL, 0, 0 };
+    sock_diag_data = (sock_diag_req *) NLMSG_DATA(nlh);
+    sock_diag_data->sdiag_family = AF_MAX+1;
+    if ((err = sendmsg(fd, &msg, 0)) == -1) {
+        /* SELinux blocked it */
+        if (errno == 22) {
+            return PASSED;
+        } else {
+            return UNKNOWN_ERROR;
+        }
+    }
+    free(nlh);
+
+    memset(&nladdr, 0, sizeof(nladdr));
+    iov = { buf, sizeof(buf) };
+    msg = { (void *) &nladdr, sizeof(nladdr), &iov, 1, NULL, 0, 0 };
+    if ((len = recvmsg(fd, &msg, 0)) == -1) {
+        return UNKNOWN_ERROR;
+    }
+    for (nlh = (struct nlmsghdr *) buf; NLMSG_OK(nlh, len); nlh = NLMSG_NEXT (nlh, len)){
+        if (nlh->nlmsg_type == NLMSG_ERROR) {
+            /* -22 = -EINVAL from kernel */
+            if (*(int *)NLMSG_DATA(nlh) == -22) {
+                return PASSED;
+            }
+        }
+    }
+    return UNKNOWN_ERROR;
+}
+
+/*
  * Prior to https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/arch/arm/include/asm/uaccess.h?id=8404663f81d212918ff85f493649a7991209fa04
  * there was a flaw in the kernel's handling of get_user and put_user
  * requests. Normally, get_user and put_user are supposed to guarantee
@@ -233,6 +317,8 @@
             (void *) android_security_cts_NativeCodeTest_doPerfEventTest },
     {  "doPerfEventTest2", "()Z",
             (void *) android_security_cts_NativeCodeTest_doPerfEventTest2 },
+    {  "doSockDiagTest", "()I",
+            (void *) android_security_cts_NativeCodeTest_doSockDiagTest },
     {  "doVrootTest", "()Z",
             (void *) android_security_cts_NativeCodeTest_doVrootTest },
     {  "doCVE20141710Test", "()Z",
diff --git a/tests/tests/security/jni/android_security_cts_SELinuxTest.cpp b/tests/tests/security/jni/android_security_cts_SELinuxTest.cpp
index daac7d9..c6ce1ef 100644
--- a/tests/tests/security/jni/android_security_cts_SELinuxTest.cpp
+++ b/tests/tests/security/jni/android_security_cts_SELinuxTest.cpp
@@ -71,19 +71,9 @@
             (void *) android_security_cts_SELinuxTest_checkSELinuxContext },
 };
 
-static int log_callback(int type __attribute__((unused)), const char *fmt __attribute__((unused)), ...)
-{
-    /* do nothing - silence the avc denials */
-    return 0;
-}
-
 int register_android_security_cts_SELinuxTest(JNIEnv* env)
 {
     jclass clazz = env->FindClass("android/security/cts/SELinuxTest");
-    union selinux_callback cb;
-    cb.func_log = log_callback;
-    selinux_set_callback(SELINUX_CB_LOG, cb);
-
     return env->RegisterNatives(clazz, gMethods,
             sizeof(gMethods) / sizeof(JNINativeMethod));
 }
diff --git a/tests/tests/security/src/android/security/cts/ARTBootASLRTest.java b/tests/tests/security/src/android/security/cts/ARTBootASLRTest.java
deleted file mode 100644
index c0d0c58..0000000
--- a/tests/tests/security/src/android/security/cts/ARTBootASLRTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.test.AndroidTestCase;
-
-import junit.framework.TestCase;
-
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-import java.io.BufferedReader;
-import java.nio.charset.Charset;
-
-/**
- * Verify that the boot.art isn't mapped out of the system partition.
- */
-public class ARTBootASLRTest extends AndroidTestCase {
-    public void testARTASLR() throws Exception {
-        FileInputStream ins = new FileInputStream("/proc/self/maps");
-        InputStreamReader reader = new InputStreamReader(ins, Charset.defaultCharset());
-        BufferedReader bufReader = new BufferedReader(reader);
-        String line;
-        boolean foundBootART = false;
-        while ((line = bufReader.readLine()) != null) {
-            // Check that we don't have /system/.*boot.art
-            if (line.matches("/system/.*boot\\.art")) {
-                fail("found " + line + " from system partition");
-            } else if (line.matches(".*boot\\.art")) {
-                foundBootART = true;
-            }
-        }
-        if (!foundBootART) {
-            fail("expected to find boot.art");
-        }
-        bufReader.close();
-        reader.close();
-        ins.close();
-    }
-}
diff --git a/tests/tests/security/src/android/security/cts/KernelSettingsTest.java b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
index e401e41..f3163be 100644
--- a/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
+++ b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
@@ -115,7 +115,7 @@
 
     private static native boolean supportsXattr();
 
-    static String getFile(String filename) throws IOException {
+    private String getFile(String filename) throws IOException {
         BufferedReader in = null;
         try {
             in = new BufferedReader(new FileReader(filename));
diff --git a/tests/tests/security/src/android/security/cts/NativeCodeTest.java b/tests/tests/security/src/android/security/cts/NativeCodeTest.java
index a2f8c09..0bb8d12 100644
--- a/tests/tests/security/src/android/security/cts/NativeCodeTest.java
+++ b/tests/tests/security/src/android/security/cts/NativeCodeTest.java
@@ -42,6 +42,12 @@
         assertTrue(doPerfEventTest2());
     }
 
+    public void testSockDiag() throws Exception {
+        int result = doSockDiagTest();
+        assertFalse("Encountered unexpected error: " + result + ".", (result == -1));
+        assertEquals(0, result);
+    }
+
     public void testFutex() throws Exception {
         assertTrue("Device is vulnerable to CVE-2014-3153, a vulnerability in the futex() system "
                    + "call. Please apply the security patch at "
@@ -81,6 +87,12 @@
     private static native boolean doPerfEventTest2();
 
     /**
+     * Hangs if device is vulnerable to CVE-2013-1763, returns -1 if
+     * unexpected error occurs, 0 otherwise.
+     */
+    private static native int doSockDiagTest();
+
+    /**
      * ANDROID-11234878 / CVE-2013-6282
      *
      * Returns true if the device is patched against the vroot vulnerability, false otherwise.
diff --git a/tests/tests/security/src/android/security/cts/SELinuxDomainTest.java b/tests/tests/security/src/android/security/cts/SELinuxDomainTest.java
new file mode 100644
index 0000000..66054f9
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/SELinuxDomainTest.java
@@ -0,0 +1,386 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.IOException;
+import java.io.FileNotFoundException;
+import java.io.InputStreamReader;
+import java.lang.Runtime;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.Scanner;
+import java.util.Set;
+
+/**
+ * Verify that the processes running within an SELinux domain are sane.
+ *
+ * TODO: Author the tests for the app contexts.
+ *
+ */
+public class SELinuxDomainTest extends TestCase {
+
+    /**
+     * Asserts that no processes are running in a domain.
+     *
+     * @param domain
+     *  The domain or SELinux context to check.
+     */
+    private void assertDomainEmpty(String domain) throws FileNotFoundException {
+        List<ProcessDetails> procs = ProcessDetails.getProcessMap().get(domain);
+        String msg = "Expected no processes in SELinux domain \"" + domain + "\""
+                + " Found: \"" + procs + "\"";
+        assertNull(msg, procs);
+    }
+
+    /**
+     * Asserts that a domain exists and that only one, well defined, process is
+     * running in that domain.
+     *
+     * @param domain
+     *  The domain or SELinux context to check.
+     * @param executable
+     *  The path of the executable or application package name.
+     */
+    private void assertDomainOne(String domain, String executable) throws FileNotFoundException {
+        List<ProcessDetails> procs = ProcessDetails.getProcessMap().get(domain);
+        String msg = "Expected 1 process in SELinux domain \"" + domain + "\""
+                + " Found \"" + procs + "\"";
+        assertNotNull(msg, procs);
+        assertEquals(msg, 1, procs.size());
+
+        msg = "Expected executable \"" + executable + "\" in SELinux domain \"" + domain + "\""
+                + "Found: \"" + procs + "\"";
+        assertEquals(msg, executable, procs.get(0).procTitle);
+    }
+
+    /**
+     * Asserts that a domain may exist. If a domain exists, the cardinality of
+     * the domain is verified to be 1 and that the correct process is running in
+     * that domain.
+     *
+     * @param domain
+     *  The domain or SELinux context to check.
+     * @param executable
+     *  The path of the executable or application package name.
+     */
+    private void assertDomainZeroOrOne(String domain, String executable)
+            throws FileNotFoundException {
+        List<ProcessDetails> procs = ProcessDetails.getProcessMap().get(domain);
+        if (procs == null) {
+            /* not on all devices */
+            return;
+        }
+
+        String msg = "Expected 1 process in SELinux domain \"" + domain + "\""
+                + " Found: \"" + procs + "\"";
+        assertEquals(msg, 1, procs.size());
+
+        msg = "Expected executable \"" + executable + "\" in SELinux domain \"" + domain + "\""
+                + "Found: \"" + procs.get(0) + "\"";
+        assertEquals(msg, executable, procs.get(0).procTitle);
+    }
+
+    /**
+     * Asserts that a domain must exist, and that the cardinality is greater
+     * than or equal to 1.
+     *
+     * @param domain
+     *  The domain or SELinux context to check.
+     * @param executables
+     *  The path of the allowed executables or application package names.
+     */
+    private void assertDomainN(String domain, String... executables)
+            throws FileNotFoundException {
+        List<ProcessDetails> procs = ProcessDetails.getProcessMap().get(domain);
+        String msg = "Expected 1 or more processes in SELinux domain \"" + domain + "\""
+                + " Found \"" + procs + "\"";
+        assertNotNull(msg, procs);
+
+        Set<String> execList = new HashSet<String>(Arrays.asList(executables));
+
+        for (ProcessDetails p : procs) {
+            msg = "Expected one of \"" + execList + "\" in SELinux domain \"" + domain + "\""
+                + " Found: \"" + p + "\"";
+            assertTrue(msg, execList.contains(p.procTitle));
+        }
+    }
+
+    /**
+     * Asserts that a domain, if it exists, is only running the listed executables.
+     *
+     * @param domain
+     *  The domain or SELinux context to check.
+     * @param executables
+     *  The path of the allowed executables or application package names.
+     */
+    private void assertDomainHasExecutable(String domain, String... executables)
+            throws FileNotFoundException {
+        List<ProcessDetails> procs = ProcessDetails.getProcessMap().get(domain);
+        if (procs == null) {
+            return; // domain doesn't exist
+        }
+
+        Set<String> execList = new HashSet<String>(Arrays.asList(executables));
+
+        for (ProcessDetails p : procs) {
+            String msg = "Expected one of \"" + execList + "\" in SELinux domain \""
+                + domain + "\"" + " Found: \"" + p + "\"";
+            assertTrue(msg, execList.contains(p.procTitle));
+        }
+    }
+
+    /* Init is always there */
+    public void testInitDomain() throws FileNotFoundException {
+        assertDomainOne("u:r:init:s0", "/init");
+    }
+
+    /* Ueventd is always there */
+    public void testUeventdDomain() throws FileNotFoundException {
+        assertDomainOne("u:r:ueventd:s0", "/sbin/ueventd");
+    }
+
+    /* Devices always have healthd */
+    public void testHealthdDomain() throws FileNotFoundException {
+        assertDomainOne("u:r:healthd:s0", "/sbin/healthd");
+    }
+
+    /* Servicemanager is always there */
+    public void testServicemanagerDomain() throws FileNotFoundException {
+        assertDomainOne("u:r:servicemanager:s0", "/system/bin/servicemanager");
+    }
+
+    /* Vold is always there */
+    public void testVoldDomain() throws FileNotFoundException {
+        assertDomainOne("u:r:vold:s0", "/system/bin/vold");
+    }
+
+    /* netd is always there */
+    public void testNetdDomain() throws FileNotFoundException {
+        assertDomainOne("u:r:netd:s0", "/system/bin/netd");
+    }
+
+    /* Debuggerd is always there */
+    public void testDebuggerdDomain() throws FileNotFoundException {
+        assertDomainN("u:r:debuggerd:s0", "/system/bin/debuggerd", "/system/bin/debuggerd64");
+    }
+
+    /* Surface flinger is always there */
+    public void testSurfaceflingerDomain() throws FileNotFoundException {
+        assertDomainOne("u:r:surfaceflinger:s0", "/system/bin/surfaceflinger");
+    }
+
+    /* Zygote is always running */
+    public void testZygoteDomain() throws FileNotFoundException {
+        assertDomainN("u:r:zygote:s0", "zygote", "zygote64");
+    }
+
+    /* drm server is always present */
+    public void testDrmServerDomain() throws FileNotFoundException {
+        assertDomainZeroOrOne("u:r:drmserver:s0", "/system/bin/drmserver");
+    }
+
+    /* Media server is always running */
+    public void testMediaserverDomain() throws FileNotFoundException {
+        assertDomainN("u:r:mediaserver:s0", "media.log", "/system/bin/mediaserver");
+    }
+
+    /* Installd is always running */
+    public void testInstalldDomain() throws FileNotFoundException {
+        assertDomainOne("u:r:installd:s0", "/system/bin/installd");
+    }
+
+    /* keystore is always running */
+    public void testKeystoreDomain() throws FileNotFoundException {
+        assertDomainOne("u:r:keystore:s0", "/system/bin/keystore");
+    }
+
+    /* System server better be running :-P */
+    public void testSystemServerDomain() throws FileNotFoundException {
+        assertDomainOne("u:r:system_server:s0", "system_server");
+    }
+
+    /*
+     * Some OEMs do not use sdcardd so transient. Other OEMs have multiple sdcards
+     * so they run the daemon multiple times.
+     */
+    public void testSdcarddDomain() throws FileNotFoundException {
+        assertDomainHasExecutable("u:r:sdcardd:s0", "/system/bin/sdcard");
+    }
+
+    /* Watchdogd may or may not be there */
+    public void testWatchdogdDomain() throws FileNotFoundException {
+        assertDomainZeroOrOne("u:r:watchdogd:s0", "/sbin/watchdogd");
+    }
+
+    /* Wifi may be off so cardinality of 0 or 1 is ok */
+    public void testWpaDomain() throws FileNotFoundException {
+        assertDomainZeroOrOne("u:r:wpa:s0", "/system/bin/wpa_supplicant");
+    }
+
+    /*
+     * Nothing should be running in this domain, cardinality test is all thats
+     * needed
+     */
+    public void testInitShellDomain() throws FileNotFoundException {
+        assertDomainEmpty("u:r:init_shell:s0");
+    }
+
+    /*
+     * Nothing should be running in this domain, cardinality test is all thats
+     * needed
+     */
+    public void testRecoveryDomain() throws FileNotFoundException {
+        assertDomainEmpty("u:r:recovery:s0");
+    }
+
+    /*
+     * Nothing should be running in this domain, cardinality test is all thats
+     * needed
+     */
+    public void testSuDomain() throws FileNotFoundException {
+        assertDomainEmpty("u:r:su:s0");
+    }
+
+    /*
+     * Their will at least be some kernel thread running and all kthreads should
+     * be in kernel context.
+     */
+    public void testKernelDomain() throws FileNotFoundException {
+        String domain = "u:r:kernel:s0";
+        List<ProcessDetails> procs = ProcessDetails.getProcessMap().get(domain);
+        assertNotNull(procs);
+        for (ProcessDetails p : procs) {
+            assertTrue("Non Kernel thread \"" + p + "\" found!", p.isKernel());
+        }
+    }
+
+    private static class ProcessDetails {
+        public String label;
+        public String procTitle;
+        public long vSize;
+        public int pid;
+
+        private ProcessDetails(String procTitle, String label, long vSize, int pid) {
+            this.label = label;
+            this.procTitle = procTitle;
+            this.vSize = vSize;
+            this.pid = pid;
+        }
+
+        @Override
+        public String toString() {
+            return "pid: \"" + pid + "\"\tproctitle: \"" + procTitle + "\"\tlabel: \"" + label
+                    + "\"\tvsize: " + vSize;
+        }
+
+        public boolean isKernel() {
+            return vSize == 0;
+        }
+
+        private static long getVsizeFromStat(String stat) {
+            // Get the vSize, item #23 from the stat file
+            //                   1        2             3   4    5    6    7      8    9   10   11
+            String pattern = "^\\d+ \\(\\p{Print}*\\) \\w \\d+ \\d+ \\d+ \\d+ -?\\d+ \\d+ \\d+ \\d+ "
+                //  12   13   14   15   16   17     18     19   20   21   22    23
+                + "\\d+ \\d+ \\d+ \\d+ \\d+ \\d+ -?\\d+ -?\\d+ \\d+ \\d+ \\d+ (\\d+) .*$";
+
+            Pattern p = Pattern.compile(pattern);
+            Matcher m = p.matcher(stat);
+            assertTrue("failed match: \"" + stat + "\"", m.matches());
+            return Long.parseLong(m.group(1));
+        }
+
+        private static HashMap<String, ArrayList<ProcessDetails>> getProcessMap()
+                throws FileNotFoundException {
+
+            HashMap<String, ArrayList<ProcessDetails>> map = new HashMap<String, ArrayList<ProcessDetails>>();
+
+            File root = new File("/proc");
+            if (!root.isDirectory()) {
+                throw new FileNotFoundException("/proc is not a directory!");
+            }
+
+            for (File f : root.listFiles()) {
+
+                // We only want the pid directory entries
+                if (!f.isDirectory()) {
+                    continue;
+                }
+
+                int pid;
+                try {
+                    pid = Integer.parseInt(f.getName());
+                } catch (NumberFormatException e) {
+                    continue;
+                }
+
+                try {
+                    ProcessDetails p = getProcessDetails(pid, f);
+                    ArrayList<ProcessDetails> l = map.get(p.label);
+                    if (l == null) {
+                        l = new ArrayList<ProcessDetails>();
+                        map.put(p.label, l);
+                    }
+                    l.add(p);
+                } catch (FileNotFoundException e) {
+                    // sometimes processes go away while the test is running.
+                    // Don't freak out if this happens
+                }
+            }
+            return map;
+        }
+
+        private static ProcessDetails getProcessDetails(int pid, File f) throws FileNotFoundException {
+            // Get the context via attr/current
+            String context = new Scanner(new File(f, "attr/current")).next();
+            context = context.trim();
+
+            // Get the vSize, item #23 from the stat file
+            String x = new Scanner(new File(f, "stat")).nextLine();
+            long vSize = getVsizeFromStat(x);
+
+            StringBuilder sb = new StringBuilder();
+            Scanner tmp = new Scanner(new File(f, "cmdline"));
+
+            // Java's scanner tends to return oddly when handling
+            // long binary blobs. Probably some caching optimization.
+            while (tmp.hasNext()) {
+                sb.append(tmp.next().replace('\0', ' '));
+            }
+            tmp.close();
+
+            // At this point we build up a valid proctitle, then split
+            // on whitespace to get the left portion. Which is either
+            // package name or process executable path. This avoids
+            // the comm 16 char width limitation and is limited to PAGE_SIZE
+            String cmdline = sb.toString().trim();
+            cmdline = cmdline.split("\\s+")[0];
+
+            return new ProcessDetails(cmdline, context, vSize, pid);
+        }
+
+    }
+}
diff --git a/tests/tests/security/src/android/security/cts/SELinuxTest.java b/tests/tests/security/src/android/security/cts/SELinuxTest.java
index baeeb6d..711cb91 100644
--- a/tests/tests/security/src/android/security/cts/SELinuxTest.java
+++ b/tests/tests/security/src/android/security/cts/SELinuxTest.java
@@ -71,6 +71,8 @@
 
     public void testZygote() {
         assertFalse(checkSELinuxAccess("u:r:zygote:s0", "u:object_r:runas_exec:s0", "file", "getattr", "/system/bin/run-as"));
+        // Also check init, just as a sanity check (init is unconfined, so it should pass)
+        assertTrue(checkSELinuxAccess("u:r:init:s0", "u:object_r:runas_exec:s0", "file", "getattr", "/system/bin/run-as"));
     }
 
     public void testNoBooleans() throws Exception {
@@ -79,14 +81,6 @@
         assertEquals(0, files.length);
     }
 
-    public void testCTSIsUntrustedApp() throws IOException {
-        String found = KernelSettingsTest.getFile("/proc/self/attr/current");
-        String expected = "u:r:untrusted_app:s0";
-        String msg = "Expected prefix context: \"" + expected + "\"" +
-                        ", Found: \"" + found + "\"";
-        assertTrue(msg, found.startsWith(expected));
-    }
-
     private static native boolean checkSELinuxAccess(String scon, String tcon, String tclass, String perm, String extra);
 
     private static native boolean checkSELinuxContext(String con);
diff --git a/tests/tests/security/tools/format_cert.sh b/tests/tests/security/tools/format_cert.sh
index 604c1bc..94407a0 100755
--- a/tests/tests/security/tools/format_cert.sh
+++ b/tests/tests/security/tools/format_cert.sh
@@ -26,17 +26,16 @@
 
 # Output file. If not specified, the file will be named <hash>.0 where "hash"
 # is the certificate's subject hash produced by:
-#   openssl x509 -in cert_file -subject_hash_old -noout
+#   openssl x509 -in cert_file -subject_hash -noout
 out_file="$2"
 
 # Detect whether the input file is PEM or DER.
-# It must use old_hash(MD5) function.
 in_form="pem"
-subject_hash=$("$OPENSSL" x509 -in "$in_file" -inform $in_form -subject_hash_old \
+subject_hash=$("$OPENSSL" x509 -in "$in_file" -inform $in_form -subject_hash \
     -noout 2>/dev/null)
 if [ "$?" != "0" ]; then
   in_form="der"
-  subject_hash=$("$OPENSSL" x509 -in "$in_file" -inform $in_form -subject_hash_old \
+  subject_hash=$("$OPENSSL" x509 -in "$in_file" -inform $in_form -subject_hash \
       -noout)
   if [ "$?" != "0" ]; then
     echo "Certificate file format is neither PEM nor DER"
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
index 0527e9a..67cdd24 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
@@ -20,7 +20,7 @@
 import android.content.pm.PackageManager;
 import android.test.InstrumentationTestCase;
 import android.test.UiThreadTest;
-import android.telephony.TelephonyManager;
+
 import com.android.internal.telephony.SmsUsageMonitor;
 
 /**
@@ -28,7 +28,6 @@
  */
 public class SmsUsageMonitorShortCodeTest extends InstrumentationTestCase {
 
-    private TelephonyManager mTelephonyManager;
     private PackageManager mPackageManager;
     private Context mContext;
 
@@ -486,12 +485,6 @@
         super.setUp();
         mContext = getInstrumentation().getTargetContext();
         mPackageManager = mContext.getPackageManager();
-        mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
-    }
-
-    private boolean isCDMA112(String address) {
-        return (mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA)
-                && "112".equals(address);
     }
 
     @UiThreadTest
@@ -504,8 +497,7 @@
         SmsUsageMonitor monitor = new SmsUsageMonitor(mContext);
         for (ShortCodeTest test : sShortCodeTests) {
             assertEquals("country: " + test.countryIso + " number: " + test.address,
-                    test.category, isCDMA112(test.address) ? CATEGORY_NOT_SHORT_CODE :
-                    monitor.checkDestination(test.address, test.countryIso));
+                    test.category, monitor.checkDestination(test.address, test.countryIso));
         }
     }
 }
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 61fa37d..9d739d3 100644
--- a/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
+++ b/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
@@ -46,6 +46,7 @@
 
     private boolean mIs24HourFormat;
     private Locale mDefaultLocale;
+    private String mDefaultFormat;
 
     @Override
     protected void setUp() throws Exception {
@@ -54,6 +55,8 @@
         mContentResolver = mContext.getContentResolver();
         mIs24HourFormat = DateFormat.is24HourFormat(mContext);
         mDefaultLocale = Locale.getDefault();
+        mDefaultFormat = Settings.System.getString(mContext.getContentResolver(),
+                Settings.System.DATE_FORMAT);
     }
 
     @Override
@@ -64,7 +67,7 @@
         if (!Locale.getDefault().equals(mDefaultLocale)) {
             Locale.setDefault(mDefaultLocale);
         }
-
+        Settings.System.putString(mContentResolver, Settings.System.DATE_FORMAT, mDefaultFormat);
         super.tearDown();
     }
 
@@ -143,6 +146,12 @@
         assertTrue(source.indexOf("5") >= 0);
         assertTrue(source.indexOf("30") >= 0);
 
+        String testFormat = "yyyy-MM-dd";
+        String testOrder = "yMd";
+        Settings.System.putString(mContentResolver, Settings.System.DATE_FORMAT, testFormat);
+        String actualOrder = String.valueOf(DateFormat.getDateFormatOrder(mContext));
+        assertEquals(testOrder, actualOrder);
+
         String format = "MM/dd/yy";
         String expectedString = "12/18/08";
         Calendar calendar = new GregorianCalendar(YEAR, MONTH, DAY);
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 6eb09eb..1e62819 100644
--- a/tests/tests/text/src/android/text/format/cts/DateUtilsTest.java
+++ b/tests/tests/text/src/android/text/format/cts/DateUtilsTest.java
@@ -83,9 +83,6 @@
         assertEquals("PM", DateUtils.getAMPMString(Calendar.PM));
     }
 
-    // This is to test the mapping between DateUtils' public API and
-    // libcore/icu4c's implementation. More tests, in different locales, are
-    // in libcore's CTS tests.
     public void test_getRelativeTimeSpanString() {
         if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) {
             return;
@@ -93,15 +90,22 @@
 
         final long ONE_SECOND_IN_MS = 1000;
         assertEquals("0 minutes ago",
-                DateUtils.getRelativeTimeSpanString(mBaseTime - ONE_SECOND_IN_MS));
+                     DateUtils.getRelativeTimeSpanString(mBaseTime - ONE_SECOND_IN_MS));
         assertEquals("in 0 minutes",
-                DateUtils.getRelativeTimeSpanString(mBaseTime + ONE_SECOND_IN_MS));
+                     DateUtils.getRelativeTimeSpanString(mBaseTime + ONE_SECOND_IN_MS));
 
         final long ONE_MINUTE_IN_MS = 60 * ONE_SECOND_IN_MS;
-        assertEquals("1 minute ago", DateUtils.getRelativeTimeSpanString(0, ONE_MINUTE_IN_MS,
-                DateUtils.MINUTE_IN_MILLIS));
-        assertEquals("in 1 minute", DateUtils.getRelativeTimeSpanString(ONE_MINUTE_IN_MS, 0,
-                DateUtils.MINUTE_IN_MILLIS));
+        assertEquals("1 minute ago",
+                     DateUtils.getRelativeTimeSpanString(0, ONE_MINUTE_IN_MS, DateUtils.MINUTE_IN_MILLIS));
+        assertEquals("in 1 minute",
+                     DateUtils.getRelativeTimeSpanString(ONE_MINUTE_IN_MS, 0, DateUtils.MINUTE_IN_MILLIS));
+
+        assertEquals("42 minutes ago",
+                     DateUtils.getRelativeTimeSpanString(mBaseTime - (42 * ONE_MINUTE_IN_MS),
+                                                         mBaseTime, DateUtils.MINUTE_IN_MILLIS));
+        assertEquals("in 42 minutes",
+                     DateUtils.getRelativeTimeSpanString(mBaseTime + (42 * ONE_MINUTE_IN_MS),
+                                                         mBaseTime, DateUtils.MINUTE_IN_MILLIS));
 
         final long ONE_HOUR_IN_MS = 60 * 60 * 1000;
         final long TWO_HOURS_IN_MS = 2 * ONE_HOUR_IN_MS;
@@ -109,16 +113,33 @@
                 mBaseTime, DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_NUMERIC_DATE));
         assertEquals("in 2 hours", DateUtils.getRelativeTimeSpanString(mBaseTime + TWO_HOURS_IN_MS,
                 mBaseTime, DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_NUMERIC_DATE));
+
+        assertEquals("in 42 mins", DateUtils.getRelativeTimeSpanString(mBaseTime + (42 * ONE_MINUTE_IN_MS),
+                mBaseTime, DateUtils.MINUTE_IN_MILLIS,
+                DateUtils.FORMAT_ABBREV_RELATIVE));
+
+        final long ONE_DAY_IN_MS = 24 * ONE_HOUR_IN_MS;
+        assertEquals("Tomorrow",
+                     DateUtils.getRelativeTimeSpanString(ONE_DAY_IN_MS, 0, DateUtils.DAY_IN_MILLIS, 0));
+        assertEquals("in 2 days",
+                     DateUtils.getRelativeTimeSpanString(2 * ONE_DAY_IN_MS, 0, DateUtils.DAY_IN_MILLIS, 0));
+        assertEquals("Yesterday",
+                     DateUtils.getRelativeTimeSpanString(0, ONE_DAY_IN_MS, DateUtils.DAY_IN_MILLIS, 0));
+        assertEquals("2 days ago",
+                     DateUtils.getRelativeTimeSpanString(0, 2 * ONE_DAY_IN_MS, DateUtils.DAY_IN_MILLIS, 0));
+
+        final long DAY_DURATION = 5 * 24 * 60 * 60 * 1000;
+        assertNotNull(DateUtils.getRelativeTimeSpanString(mContext, mBaseTime - DAY_DURATION, true));
+        assertNotNull(DateUtils.getRelativeTimeSpanString(mContext, mBaseTime - DAY_DURATION));
     }
 
-    // Similar to test_getRelativeTimeSpanString(). The function here is to
-    // test the mapping between DateUtils's public API and libcore/icu4c's
-    // implementation. More tests, in different locales, are in libcore's
-    // CTS tests.
     public void test_getRelativeDateTimeString() {
         final long DAY_DURATION = 5 * 24 * 60 * 60 * 1000;
-        assertNotNull(DateUtils.getRelativeDateTimeString(mContext, mBaseTime - DAY_DURATION,
-                DateUtils.MINUTE_IN_MILLIS, DateUtils.DAY_IN_MILLIS, DateUtils.FORMAT_NUMERIC_DATE));
+        assertNotNull(DateUtils.getRelativeDateTimeString(mContext,
+                                                          mBaseTime - DAY_DURATION,
+                                                          DateUtils.MINUTE_IN_MILLIS,
+                                                          DateUtils.DAY_IN_MILLIS,
+                                                          DateUtils.FORMAT_NUMERIC_DATE));
     }
 
     public void test_formatElapsedTime() {
@@ -190,7 +211,7 @@
         long fixedTime = date.getTime();
         final long HOUR_DURATION = 2 * 60 * 60 * 1000;
         assertEquals("Monday", DateUtils.formatDateRange(mContext, fixedTime,
-                fixedTime + HOUR_DURATION, DateUtils.FORMAT_SHOW_WEEKDAY));
+                     fixedTime + HOUR_DURATION, DateUtils.FORMAT_SHOW_WEEKDAY));
     }
 
     public void testIsToday() {
@@ -200,19 +221,15 @@
     }
 
     public void test_bug_7548161() {
-        if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) {
-            return;
-        }
-
         long now = System.currentTimeMillis();
         long today = now;
         long tomorrow = now + DateUtils.DAY_IN_MILLIS;
         long yesterday = now - DateUtils.DAY_IN_MILLIS;
         assertEquals("Tomorrow", DateUtils.getRelativeTimeSpanString(tomorrow, now,
-                DateUtils.DAY_IN_MILLIS, 0));
+                                                                     DateUtils.DAY_IN_MILLIS, 0));
         assertEquals("Yesterday", DateUtils.getRelativeTimeSpanString(yesterday, now,
-                DateUtils.DAY_IN_MILLIS, 0));
+                                                                      DateUtils.DAY_IN_MILLIS, 0));
         assertEquals("Today", DateUtils.getRelativeTimeSpanString(today, now,
-                DateUtils.DAY_IN_MILLIS, 0));
+                                                                  DateUtils.DAY_IN_MILLIS, 0));
     }
 }
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 cc73272..2d623e3 100644
--- a/tests/tests/text/src/android/text/format/cts/TimeTest.java
+++ b/tests/tests/text/src/android/text/format/cts/TimeTest.java
@@ -36,20 +36,16 @@
 
     private Locale originalLocale;
 
-    private static List<Locale> sSystemLocales;
-
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         originalLocale = Locale.getDefault();
-
-        maybeInitializeSystemLocales();
     }
 
     @Override
     public void tearDown() throws Exception {
         // The Locale may be changed by tests. Revert to the original.
-        changeJavaAndAndroidLocale(originalLocale, true /* force */);
+        changeJavaAndAndroidLocale(originalLocale);
         super.tearDown();
     }
 
@@ -775,10 +771,7 @@
     }
 
     public void testFormat_tokensUkLocale() throws Exception {
-        if (!changeJavaAndAndroidLocale(Locale.UK, false /* force */)) {
-            Log.w(TAG, "Skipping testFormat_tokensUkLocale: no assets found");
-            return;
-        }
+        changeJavaAndAndroidLocale(Locale.UK);
 
         Time t = new Time("Europe/London");
         Fields.setDateTime(t, 2005, 5, 1, 12, 30, 15);
@@ -870,10 +863,7 @@
     }
 
     public void testFormat_tokensUsLocale() throws Exception {
-        if (!changeJavaAndAndroidLocale(Locale.US, false /* force */)) {
-            Log.w(TAG, "Skipping testFormat_tokensUSLocale: no assets found");
-            return;
-        }
+        changeJavaAndAndroidLocale(Locale.US);
 
         Time t = new Time("America/New_York");
         Fields.setDateTime(t, 2005, 5, 1, 12, 30, 15);
@@ -965,10 +955,7 @@
     }
 
     public void testFormat_tokensFranceLocale() throws Exception {
-        if (!changeJavaAndAndroidLocale(Locale.FRANCE, false /* force */)) {
-            Log.w(TAG, "Skipping testFormat_tokensFranceLocale: no assets found");
-            return;
-        }
+        changeJavaAndAndroidLocale(Locale.FRANCE);
 
         Time t = new Time("Europe/Paris");
         Fields.setDateTime(t, 2005, 5, 1, 12, 30, 15);
@@ -1060,10 +1047,7 @@
     }
 
     public void testFormat_tokensJapanLocale() throws Exception {
-        if (!changeJavaAndAndroidLocale(Locale.JAPAN, false /* force */)) {
-            Log.w(TAG, "Skipping testFormat_tokensJapanLocale: no assets found");
-            return;
-        }
+        changeJavaAndAndroidLocale(Locale.JAPAN);
 
         Time t = new Time("Asia/Tokyo");
         Fields.setDateTime(t, 2005, 5, 1, 12, 30, 15);
@@ -2859,19 +2843,7 @@
         }
     }
 
-    private static void maybeInitializeSystemLocales() {
-        if (sSystemLocales == null) {
-            String[] locales = Resources.getSystem().getAssets().getLocales();
-            List<Locale> systemLocales = new ArrayList<Locale>(locales.length);
-            for (String localeStr : locales) {
-                systemLocales.add(Locale.forLanguageTag(localeStr));
-            }
-
-            sSystemLocales = systemLocales;
-        }
-    }
-
-    private static boolean changeJavaAndAndroidLocale(Locale locale, boolean force) {
+    private static void changeJavaAndAndroidLocale(Locale locale) {
         // The Time class uses the Android-managed locale for string resources containing format
         // patterns and the Java-managed locale for other things (e.g. month names, week days names)
         // that are placed into those patterns. For example the format "%c" expands to include
@@ -2884,10 +2856,6 @@
         // locales agree), when the Java-managed locale is changed during this test the locale in
         // the runtime-local copy of the system resources is modified as well.
 
-        if (!force && !sSystemLocales.contains(locale)) {
-            return false;
-        }
-
         // Change the Java-managed locale.
         Locale.setDefault(locale);
 
@@ -2896,6 +2864,5 @@
         Configuration configuration = Resources.getSystem().getConfiguration();
         configuration.locale = locale;
         Resources.getSystem().updateConfiguration(configuration, null);
-        return true;
     }
 }
diff --git a/tools/selinux/SELinuxNeverallowTestFrame.py b/tools/selinux/SELinuxNeverallowTestFrame.py
index 5eba5bb..932014a 100644
--- a/tools/selinux/SELinuxNeverallowTestFrame.py
+++ b/tools/selinux/SELinuxNeverallowTestFrame.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python
 
 src_header = """/*
  * Copyright (C) 2014 The Android Open Source Project
diff --git a/tools/selinux/SELinuxNeverallowTestGen.py b/tools/selinux/SELinuxNeverallowTestGen.py
index bc775d6..9cb1e24 100755
--- a/tools/selinux/SELinuxNeverallowTestGen.py
+++ b/tools/selinux/SELinuxNeverallowTestGen.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python
 
 import re
 import sys
diff --git a/tools/vm-tests-tf/etc/starttests b/tools/vm-tests-tf/etc/starttests
index 4c5c0b1..be8fad4 100755
--- a/tools/vm-tests-tf/etc/starttests
+++ b/tools/vm-tests-tf/etc/starttests
@@ -63,6 +63,7 @@
 scriptdata=$dalviktestdir/data/scriptdata
 report=$dalviktest/report.html
 curdate=`date`
+curmode=""
 datadir=/tmp/${USER}
 base=$OUT
 framework=$base/system/framework
@@ -99,6 +100,14 @@
 mkdir -p $datadir
 mkdir -p $datadir/dalvik-cache
 
+if [ "$TARGET_SIMULATOR" = "true" ]; then
+    echo "Simulator mode, $interpreter interpreter";
+    curmode="simulator"
+else
+    echo "Emulator mode, $interpreter interpreter";
+    curmode="emulator"
+fi
+
 echo ""
 
 pre_report="<html><head><style>
@@ -109,7 +118,7 @@
 </style></head>
 <body>
 <h1>Dalvik VM test suite results</h1>
-Generated $curdate (using the emulator)
+Generated $curdate (using the $curmode)
 <p>
 <table width='100%'>
 <tr><td>Status</td><td>Target</td><td>Category</td><td>Details</td></tr>"
@@ -127,8 +136,12 @@
 export jallcnt=0
 export jcolumns=0
 
-# TODO unhack; dimitry: unhack what?
-adb push $dexcore /data/local/tmp/dexcore.jar >> /dev/null 2>&1
+# TODO unhack
+if [ "$TARGET_SIMULATOR" = "true" ]; then
+    echo -n ""
+else
+    adb push $dexcore /data/local/tmp/dexcore.jar >> /dev/null 2>&1
+fi
 
 function classnameToJar()
 {
@@ -162,25 +175,40 @@
         # write dalvik output to file
         echo -n "mk_b:" > $datadir/dalvikout
 
-        classpath="/data/local/tmp/dexcore.jar"
-        deps=${deps}" "${mainclass}
-        pushedjars=""
-        for dep in ${deps}; do
-            depJar=`classnameToJar ${dep}`
-            depFileName=`basename ${depJar}`
-            deviceFileName=/data/local/tmp/${depFileName}
-            adb push ${depJar} ${deviceFileName} &> /dev/null
-            classpath=${classpath}:${deviceFileName}
-            pushedjars=${pushedjars}" "${deviceFileName}
-        done
+        if [ "$TARGET_SIMULATOR" = "true" ]; then
+            classpath=`classnameToJar ${mainclass}`
+            for dep in ${deps}; do
+                depJar=`classnameToJar ${dep}`
+                classpath=${classpath}:${depJar}
+            done
+            $valgrind $exe -Xmx512M -Xss32K -Xbootclasspath:$bpath $debug_opts \
+                -classpath $dexcore:$classpath $mainclass >> $datadir/dalvikout 2>&1
 
-        adb shell dalvikvm -Djava.io.tmpdir=/data/local/tmp \
-            -classpath $classpath $mainclass >> $datadir/dalvikout 2>&1 && \
-            echo -n dvmpassed: >> $datadir/dalvikout 2>&1
+            RESULTCODE=$?
+            if [ ${RESULTCODE} -ne 0 ]; then
+                echo "Dalvik VM failed, result=${RESULTCODE}" >> $datadir/dalvikout 2>&1
+            fi
+        else
+            classpath="/data/local/tmp/dexcore.jar"
+            deps=${deps}" "${mainclass}
+            pushedjars=""
+            for dep in ${deps}; do
+                depJar=`classnameToJar ${dep}`
+                depFileName=`basename ${depJar}`
+                deviceFileName=/data/local/tmp/${depFileName}
+                adb push ${depJar} ${deviceFileName} &> /dev/null
+                classpath=${classpath}:${deviceFileName}
+                pushedjars=${pushedjars}" "${deviceFileName}
+            done
 
-        for jar in ${pushedjars}; do
-            adb shell rm ${jar} &> /dev/null
-        done
+            adb shell dalvikvm -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
diff --git a/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
index c772c33..63794df 100644
--- a/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
+++ b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
@@ -211,6 +211,8 @@
         curJunitFileData = getWarningMessage() +
         "package " + pName + ";\n" +
         "import java.io.IOException;\n" +
+        "import java.util.concurrent.TimeUnit;\n\n" +
+        "import com.android.tradefed.device.CollectingOutputReceiver;\n" +
         "import com.android.tradefed.testtype.IAbi;\n" +
         "import com.android.tradefed.testtype.IAbiReceiver;\n" +
         "import com.android.tradefed.testtype.DeviceTestCase;\n" +
@@ -223,10 +225,15 @@
       String cmd = String.format("ANDROID_DATA=%s dalvikvm|#ABI#| -Xmx512M -Xss32K " +
               "-Djava.io.tmpdir=%s -classpath %s %s", TARGET_JAR_ROOT_PATH, TARGET_JAR_ROOT_PATH,
               classpath, mainclass);
-      return "    String cmd = AbiFormatter.formatCmdForAbi(\"" + cmd + "\", mAbi.getBitness());\n" +
-              "    String res = getDevice().executeShellCommand(cmd);\n" +
-              "    // A sucessful adb shell command returns an empty string.\n" +
-              "    assertEquals(cmd, \"\", res);";
+      StringBuilder code = new StringBuilder();
+      code.append("    String cmd = AbiFormatter.formatCmdForAbi(\"")
+          .append(cmd)
+          .append("\", mAbi.getBitness());\n")
+          .append("    CollectingOutputReceiver receiver = new CollectingOutputReceiver();\n")
+          .append("    getDevice().executeShellCommand(cmd, receiver, 6, TimeUnit.MINUTES, 1);\n")
+          .append("    // A sucessful adb shell command returns an empty string.\n")
+          .append("    assertEquals(cmd, \"\", receiver.getOutput());");
+      return code.toString();
     }
 
     private String getWarningMessage() {
