gen_runtime.cpp revision 46341434b4a766d9dee33a93469564a1de8b0793
1135c4b747bce5898d98de964d7c453d215254d0dJason Sams/* 2135c4b747bce5898d98de964d7c453d215254d0dJason Sams * Copyright (C) 2013 The Android Open Source Project 3135c4b747bce5898d98de964d7c453d215254d0dJason Sams * 4135c4b747bce5898d98de964d7c453d215254d0dJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5135c4b747bce5898d98de964d7c453d215254d0dJason Sams * you may not use this file except in compliance with the License. 6135c4b747bce5898d98de964d7c453d215254d0dJason Sams * You may obtain a copy of the License at 7135c4b747bce5898d98de964d7c453d215254d0dJason Sams * 8135c4b747bce5898d98de964d7c453d215254d0dJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9135c4b747bce5898d98de964d7c453d215254d0dJason Sams * 10135c4b747bce5898d98de964d7c453d215254d0dJason Sams * Unless required by applicable law or agreed to in writing, software 11135c4b747bce5898d98de964d7c453d215254d0dJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12135c4b747bce5898d98de964d7c453d215254d0dJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13135c4b747bce5898d98de964d7c453d215254d0dJason Sams * See the License for the specific language governing permissions and 14135c4b747bce5898d98de964d7c453d215254d0dJason Sams * limitations under the License. 15135c4b747bce5898d98de964d7c453d215254d0dJason Sams */ 16135c4b747bce5898d98de964d7c453d215254d0dJason Sams 17963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* This program processes Renderscript function definitions described in spec files. 18963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * For each spec file provided on the command line, it generates a corresponding 19963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * Renderscript header (*.rsh) which is meant for inclusion in client scripts. 20963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 21963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * This program also generates Junit test files to automatically test each of the 22963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * functions using randomly generated data. We create two files for each function: 23963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - a Renderscript file named Test{Function}.rs, 24963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - a Junit file named Test{function}.java, which calls the above RS file. 25963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 26963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * This program takes an optional -v parameter, the RS version to target the 27963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * test files for. The header file will always contain all the functions. 28963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 29963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * This program contains five main classes: 30963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - SpecFile: Represents on spec file. 31963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - Function: Each instance represents a function, like clamp. Even though the 32963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * spec file contains many entries for clamp, we'll only have one clamp instance. 33963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - Specification: Defines one of the many variations of the function. There's 34963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * a one to one correspondance between Specification objects and entries in the 35963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * spec file. Strings that are parts of a Specification can include placeholders, 36963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * which are "#1", "#2", "#3", and "#4". We'll replace these by values before 37963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * generating the files. 38963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - Permutation: A concrete version of a specification, where all placeholders have 39963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * been replaced by actual values. 40963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - ParameterDefinition: A definition of a parameter of a concrete function. 41963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 42963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 43963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO Rename runtime.spec to rs_core_math.spec. 44963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO Handle NaN, +Inf, -Inf correctly. 45963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO Add range(,) as an option for test values. 46963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 47963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <cctype> 48963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <cstdlib> 49135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <stdio.h> 50963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <functional> 51135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <list> 52963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <map> 53963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <set> 54963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <fstream> 5546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet#include <sstream> 56135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <string> 57963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <vector> 58135c4b747bce5898d98de964d7c453d215254d0dJason Sams 59135c4b747bce5898d98de964d7c453d215254d0dJason Samsusing namespace std; 60135c4b747bce5898d98de964d7c453d215254d0dJason Sams 61963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletnamespace { 62963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 63963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst char* AUTO_GENERATED_WARNING = 64963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "// Don't edit this file! It is auto-generated by " 65963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "frameworks/rs/api/gen_runtime.\n\n"; 66963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst char* LEGAL_NOTICE = 67963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "/*\n" 68963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * Copyright (C) 2014 The Android Open Source Project\n" 69963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " *\n" 70963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 71963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * you may not use this file except in compliance with the License.\n" 72963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * You may obtain a copy of the License at\n" 73963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " *\n" 74963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * http://www.apache.org/licenses/LICENSE-2.0\n" 75963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " *\n" 76963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * Unless required by applicable law or agreed to in writing, software\n" 77963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 78963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" 79963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * See the License for the specific language governing permissions and\n" 80963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * limitations under the License.\n" 81963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " */\n\n"; 82963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 83963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Function; 84963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Specification; 85963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Permutation; 86963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 87963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Information about a parameter to a function. The values of all the fields should only be set by 88963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * parseParameterDefinition. 89963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 90963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstruct ParameterDefinition { 91963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsType; // The Renderscript type, e.g. "uint3" 92963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsBaseType; // As above but without the number, e.g. "uint" 93963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string javaBaseType; // The type we need to declare in Java, e.g. "unsigned int" 94963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 95963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The number of entries in the vector. It should be either "1", "2", "3", or "4". It's also 96963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * "1" for scalars. 97963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 98963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mVectorSize; 99963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The space the vector takes in an array. It's the same as the vector size, except for size 100963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * "3", where the width is "4". 101963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 102963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string vectorWidth; 103963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 10446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string specName; // e.g. x, as found in the spec file 105963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string variableName; // e.g. inX, used both in .rs and .java 106963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsAllocName; // e.g. gAllocInX 107963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string javaAllocName; // e.g. inX 108963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string javaArrayName; // e.g. arrayInX 109135c4b747bce5898d98de964d7c453d215254d0dJason Sams 11046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // If non empty, the mininum and maximum values to be used when generating the test data. 11146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string minValue; 11246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string maxValue; 11346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet /* If non empty, contains the name of another parameter that should be smaller or equal to this 11446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet * parameter, i.e. value(smallerParameter) <= value(this). This is used when testing clamp. 11546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet */ 11646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string smallerParameter; 11746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet 118963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool isOutParameter; // True if this parameter returns data from the script. 119963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 120963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Parse the parameter definition found in the spec file. It will generate a name if none 121963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * are present in the file. One of the two counts will be incremented, and potentially 122963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * used to generate unique names. isReturn is true if we're processing the "return:" 123963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * definition. 124963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 125963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void parseParameterDefinition(string s, bool isReturn, int* inputCount, int* outputCount); 126963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 127963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 128963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// An entire spec file and the methods to process it. 129963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass SpecFile { 130135c4b747bce5898d98de964d7c453d215254d0dJason Samspublic: 131963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet explicit SpecFile(const string& specFileName) : mSpecFileName(specFileName) {} 132963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool process(int versionOfTestFiles); 133135c4b747bce5898d98de964d7c453d215254d0dJason Sams 134963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 135963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string mSpecFileName; 136963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The largest version number that we have found in all the specifications. 137963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mLargestVersionNumber; 138963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 139963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet map<string, Function*> mFunctionsMap; // All the known functions. 140963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet typedef map<string, Function*>::iterator FunctionsIterator; 141963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 142963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool readSpecFile(); 143963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* getFunction(const string& name); 144963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool generateFiles(int versionOfTestFiles); 145963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeAllFunctions(ofstream& headerFile, int versionOfTestFiles); 146963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 147963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 148963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Represents a function, like "clamp". Even though the spec file contains many entries for clamp, 149963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * we'll only have one clamp instance. 150963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 151963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Function { 152963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 153963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; // The lower case name, e.g. native_log 154963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCapitalizedName; // The capitalized name, e.g. NativeLog 155963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mTestName; // e.g. TestNativeLog 156963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mRelaxedTestName; // e.g. TestNativeLogRelaxed 157963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 158963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<Specification*> mSpecifications; 159963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet typedef vector<Specification*>::iterator SpecificationIterator; 160963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 161963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* We keep track of the allocations generated in the .rs file and the argument classes defined 162963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * in the Java file, as we share these between the functions created for each specification. 163963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 164963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set<string> mRsAllocationsGenerated; 165963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set<string> mJavaGeneratedArgumentClasses; 166963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 167963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaCallAllCheckMethods; // Lines of Java code to invoke the check methods. 168963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 169963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream mRsFile; // The Renderscript test file we're generating. 170963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream mJavaFile; // The Jave test file we're generating. 171963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 172963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool startRsFile(); // Open the mRsFile and writes its header. 173963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeRelaxedRsFile(); // Write the entire relaxed rs test file (an include essentially) 174963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool startJavaFile(); // Open the mJavaFile and writes the header. 175963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void finishJavaFile(); // Write the test method and closes the file. 176963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 177963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 178963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet explicit Function(const string& name); 179963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void addSpecification(Specification* spec) { mSpecifications.push_back(spec); } 180963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Write the .java and the two .rs test files. versionOfTestFiles is used to restrict which API 181963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * to test. Also writes the section of the header file. 182963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 183963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeFiles(ofstream& headerFile, int versionOfTestFiles); 184963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write an allocation and keep track of having it written, so it can be shared. 185963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeRsAllocationDefinition(const ParameterDefinition& param); 186963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write an argument class definiton and keep track of having it written, so it can be shared. 187963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaArgumentClassDefinition(const string& className, const string& definition); 188963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Add a call to mJavaCallAllCheckMethods to be used at the end of the file generation. 189963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void addJavaCheckCall(const string& call); 190963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 191963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 192963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Defines one of the many variations of the function. There's a one to one correspondance between 193963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * Specification objects and entries in the spec file. Some of the strings that are parts of a 194963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * Specification can include placeholders, which are "#1", "#2", "#3", and "#4". We'll replace 195963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * these by values before generating the files. 196963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 197963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Specification { 198963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 199963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The range of versions this specification applies to. 0 if there's no restriction, so an API 200963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * that became available at 9 and is still valid would have min:9 max:0. 201963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 202135c4b747bce5898d98de964d7c453d215254d0dJason Sams int mMinVersion; 203135c4b747bce5898d98de964d7c453d215254d0dJason Sams int mMaxVersion; 204135c4b747bce5898d98de964d7c453d215254d0dJason Sams 205963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The name of the function without #n, e.g. convert. As of this writing, it only differs for 206963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * convert. 207963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 208963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCleanName; 209963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mTest; // How to test. One of "scalar", "vector", "noverify", and "none". 210963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 211135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<vector<string> > mReplaceables; 212963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 213963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The following fields may contain placeholders that will be replaced using the mReplaceables. 214963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 215963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The name of this function, can include #, e.g. convert_#1_#2 216963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; 217963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 218963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mReturn; // The return type 219963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mComment; // The comments to be included in the header 220963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mInline; // The inline code to be included in the header 221963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mParam; // One entry per parameter defined 222963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 223963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Substitute the placeholders in the strings by the corresponding entries in mReplaceables. 224963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string expandString(string s, int i1, int i2, int i3, int i4) const; 225963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void expandStringVector(const vector<string>& in, int i1, int i2, int i3, int i4, 226963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* out) const; 227963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 228963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 229963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification() { 230963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mMinVersion = 0; 231963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mMaxVersion = 0; 232963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 233963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int getMinVersion() const { return mMinVersion; } 234963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int getMaxVersion() const { return mMaxVersion; } 235963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 236963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getName(int i1, int i2, int i3, int i4) const { 237963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandString(mName, i1, i2, i3, i4); 238963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 239963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getReturn(int i1, int i2, int i3, int i4) const { 240963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandString(mReturn, i1, i2, i3, i4); 241963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 242963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getComments(int i1, int i2, int i3, int i4, vector<string>* comments) const { 243963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mComment, i1, i2, i3, i4, comments); 244963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 245963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getInlines(int i1, int i2, int i3, int i4, vector<string>* inlines) const { 246963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mInline, i1, i2, i3, i4, inlines); 247963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 248963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getParams(int i1, int i2, int i3, int i4, vector<string>* params) const { 249963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mParam, i1, i2, i3, i4, params); 250963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 251963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getTest() const { return mTest; } 252963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getCleanName() const { return mCleanName; } 253963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 254963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, Function* function, 255963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles); 256963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeRelaxedRsFile() const; 257963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Return true if this specification should be generated for this version. 258963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool relevantForVersion(int versionOfTestFiles) const; 259963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 260963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet static Specification* scanSpecification(FILE* in); 261963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 262963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 263963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// A concrete version of a specification, where all placeholders have been replaced by actual 264963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// values. 265963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Permutation { 266963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 267963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* mFunction; 268963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* mSpecification; 269963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 270963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // These are the expanded version of those found on Specification 271963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; 272963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCleanName; 273963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mTest; // How to test. One of "scalar", "vector", "noverify", and "none". 274135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> mInline; 275963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mComment; 276963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 277963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The inputs and outputs of the function. This include the return type, if present. 278963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<ParameterDefinition*> mParams; 279963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The index of the return value in mParams, -1 if the function is void. 280963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mReturnIndex; 281963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The index of the first input value in mParams, -1 if there's no input. 282963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mFirstInputIndex; 283963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The number of input and output parameters. 284963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mInputCount; 285963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mOutputCount; 286135c4b747bce5898d98de964d7c453d215254d0dJason Sams 287963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mRsKernelName; 288963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaArgumentsClassName; 289963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaArgumentsNClassName; 290963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaVerifierComputeMethodName; 291963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaCheckMethodName; 292963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaVerifyMethodName; 293963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 294963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeHeaderSection(ofstream& file) const; 295963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 296963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeRsSection(ofstream& rs) const; 297963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 298963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaSection(ofstream& file) const; 299963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaArgumentClass(ofstream& file, bool scalar) const; 300963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaCheckMethod(ofstream& file, bool generateCallToVerify) const; 301963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVerifyScalarMethod(ofstream& file) const; 302963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVerifyVectorMethod(ofstream& file) const; 303963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVerifyFunctionHeader(ofstream& file) const; 304963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaInputAllocationDefinition(ofstream& file, const string& indent, 30546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const; 306963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaOutputAllocationDefinition(ofstream& file, const string& indent, 30746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const; 308963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaCallToRs(ofstream& file, bool relaxed, bool generateCallToVerify) const; 309963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 310963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaTestOneValue(ofstream& file, int indent, const string& rsBaseType, 311963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& expected, const string& actual) const; 312963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendOutputToMessage(ofstream& file, int indent, const string& rsBaseType, 313963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& name, const string& expected, 314963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const; 315963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendInputToMessage(ofstream& file, int indent, const string& rsBaseType, 316963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& name, const string& actual) const; 317963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaComputeNeededUlf(ofstream& file, int indent, const string& expected, 318963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const; 319963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendNewLineToMessage(ofstream& file, int indent) const; 320963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendVariableToMessage(ofstream& file, int indent, const string& rsBaseType, 321963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& legend, const string& value) const; 322963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVectorComparison(ofstream& file, int indent, const ParameterDefinition& p) const; 323963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendVectorInputToMessage(ofstream& file, int indent, 324963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const; 325963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendVectorOutputToMessage(ofstream& file, int indent, 326963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const; 327963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool passByAddressToSet(const string& name) const; 328963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void convertToRsType(const string& name, string* dataType, char* vectorSize) const; 329963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 330963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 331963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Permutation(Function* function, Specification* specification, int i1, int i2, int i3, int i4); 332963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 333963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles); 334963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool hasLongOrDoubleParameter() const; 335135c4b747bce5898d98de964d7c453d215254d0dJason Sams}; 336135c4b747bce5898d98de964d7c453d215254d0dJason Sams 337963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Table of type equivalences 338963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO: We should just be pulling this from a shared header. Slang does exactly the same thing. 339963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstruct Type { 340963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char* specType; // Name found in the .spec file 341963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsDataType; // RS data type 342963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string cType; // Type in a C file 343963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char* javaType; // Type in a Java file 344963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 345135c4b747bce5898d98de964d7c453d215254d0dJason Sams 346963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst Type TYPES[] = {{"f16", "FLOAT_16", "half", "half"}, 347963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"f32", "FLOAT_32", "float", "float"}, 348963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"f64", "FLOAT_64", "double", "double"}, 349963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"i8", "SIGNED_8", "char", "byte"}, 350963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"u8", "UNSIGNED_8", "uchar", "byte"}, 351963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"i16", "SIGNED_16", "short", "short"}, 352963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"u16", "UNSIGNED_16", "ushort", "short"}, 353963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"i32", "SIGNED_32", "int", "int"}, 354963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"u32", "UNSIGNED_32", "uint", "int"}, 355963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"i64", "SIGNED_64", "long", "long"}, 356963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"u64", "UNSIGNED_64", "ulong", "long"}}; 357963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 358963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst int NUM_TYPES = sizeof(TYPES) / sizeof(TYPES[0]); 359963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 360963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Capitalizes and removes underscores. E.g. converts "native_log" to NativeLog. 361963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring capitalize(const string& source) { 362963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int length = source.length(); 363963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string result; 364963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool capitalize = true; 365963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int s = 0; s < length; s++) { 366963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (source[s] == '_') { 367963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet capitalize = true; 368963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (capitalize) { 369963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result += toupper(source[s]); 370963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet capitalize = false; 371963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 372963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result += source[s]; 373963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 374963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 375963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return result; 376963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 377963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 378963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring tab(int n) { return string(n * 4, ' '); } 379963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 380963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletlong hashString(const string& s) { 381963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet long hash = 0; 382963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < s.length(); i++) { 383963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet hash = hash * 43 + s[i]; 384963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 385963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return hash; 386963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 387963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 38846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet// Removes the character from present. Returns true if the string contained the character. 38946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouilletstatic bool charRemoved(char c, string* s) { 39046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t p = s->find(c); 39146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (p != string::npos) { 39246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet s->erase(p, 1); 39346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet return true; 39446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 39546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet return false; 39646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet} 39746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet 398963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return true if the string is already in the set. Inserts it if not. 399963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool testAndSet(const string& flag, set<string>* set) { 400963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (set->find(flag) == set->end()) { 401963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set->insert(flag); 402963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 403135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 404135c4b747bce5898d98de964d7c453d215254d0dJason Sams return true; 405135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 406135c4b747bce5898d98de964d7c453d215254d0dJason Sams 407963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Convert an int into a string. 408963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring toString(int n) { 409963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char buf[100]; 410963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet snprintf(buf, sizeof(buf), "%d", n); 411963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return string(buf); 412963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 413963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 414963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid trim(string* s, size_t start) { 415135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (start > 0) { 416135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(0, start); 417135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 418135c4b747bce5898d98de964d7c453d215254d0dJason Sams 419135c4b747bce5898d98de964d7c453d215254d0dJason Sams while (s->size() && (s->at(0) == ' ')) { 420135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(0, 1); 421135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 422135c4b747bce5898d98de964d7c453d215254d0dJason Sams 423135c4b747bce5898d98de964d7c453d215254d0dJason Sams size_t p = s->find_first_of("\n\r"); 424135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (p != string::npos) { 425135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(p); 426135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 427135c4b747bce5898d98de964d7c453d215254d0dJason Sams 428963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while ((s->size() > 0) && (s->at(s->size() - 1) == ' ')) { 429963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->erase(s->size() - 1); 430963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 431963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 432963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 433963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring stringReplace(string s, string match, string rep) { 434963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 435963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t p = s.find(match); 436963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p == string::npos) break; 437963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 438963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(p, match.size()); 439963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.insert(p, rep); 440963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 441963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return s; 442963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 443963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 444963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return the next line from the input file. 445963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool getNextLine(FILE* in, string* s) { 446963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->clear(); 447963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 448963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int c = fgetc(in); 449963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (c == EOF) return s->size() != 0; 450963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (c == '\n') break; 451963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->push_back((char)c); 452963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 453963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 454963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 455963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 456963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid writeIfdef(ofstream& file, string filename, bool isStart) { 457963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string t = "__"; 458963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t += filename; 459963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t += "__"; 460963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 461963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 2; i < t.size(); i++) { 462963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (t[i] == '.') { 463963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t[i] = '_'; 464963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 465963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 466963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 467963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (isStart) { 468963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#ifndef " << t << "\n"; 469963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#define " << t << "\n"; 470963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 471963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#endif // " << t << "\n"; 472963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 473963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 474963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 475963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid writeJavaArrayInitialization(ofstream& file, const ParameterDefinition& p) { 476963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << p.javaBaseType << "[] " << p.javaArrayName << " = new " << p.javaBaseType 477963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "[INPUTSIZE * " << p.vectorWidth << "];\n"; 478963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << p.javaAllocName << ".copyTo(" << p.javaArrayName << ");\n"; 479963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 480963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 481963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool parseCommandLine(int argc, char* argv[], int* versionOfTestFiles, 482963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* specFileNames) { 483963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 1; i < argc; i++) { 484963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (argv[i][0] == '-') { 485963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (argv[i][1] == 'v') { 486963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet i++; 487963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i < argc) { 488963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char* end; 489963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *versionOfTestFiles = strtol(argv[i], &end, 10); 490963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (*end != '\0') { 491963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Can't parse the version number %s\n", argv[i]); 492963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 493963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 494963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 495963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Missing version number after -v\n"); 496963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 497963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 498963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 499963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Unrecognized flag %s\n", argv[i]); 500963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 501963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 502963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 503963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet specFileNames->push_back(argv[i]); 504963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 505963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 506963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specFileNames->size() == 0) { 507963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("No spec file specified\n"); 508963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 509963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 510963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 511963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 512963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 513963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Parse a parameter definition. It's of the form "type [*][name]". The type 514963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * is required. The name is optional. The * indicates it's an output 515963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * parameter. We also pass the indexed of this parameter in the definition, so 516963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * we can create names like in2, in3, etc. */ 517963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid ParameterDefinition::parseParameterDefinition(string s, bool isReturn, int* inputCount, 518963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int* outputCount) { 51946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet istringstream stream(s); 52046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string name, type, option; 52146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet stream >> rsType; 52246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet stream >> specName; 52346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet stream >> option; 524963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 52546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Determine if this is an output. 52646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet isOutParameter = charRemoved('*', &rsType) || charRemoved('*', &specName) || isReturn; 527963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 52846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Extract the vector size out of the type. 529963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = rsType.size() - 1; 530963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = rsType[last]; 531963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (lastChar >= '0' && lastChar <= '9') { 532963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsBaseType = rsType.substr(0, last); 533963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mVectorSize = lastChar; 534963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 535963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsBaseType = rsType; 536963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mVectorSize = "1"; 537963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 538963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mVectorSize == "3") { 539963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorWidth = "4"; 540963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 541963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorWidth = mVectorSize; 542963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 543963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 544963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Create variable names to be used in the java and .rs files. Because x and 545963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * y are reserved in .rs files, we prefix variable names with "in" or "out". 546963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 547963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (isOutParameter) { 548963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName = "out"; 54946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!specName.empty()) { 55046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet variableName += capitalize(specName); 551963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (!isReturn) { 552963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName += toString(*outputCount); 553963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 554963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*outputCount)++; 555963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 556963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName = "in"; 55746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!specName.empty()) { 55846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet variableName += capitalize(specName); 559963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (*inputCount > 0) { 560963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName += toString(*inputCount); 561963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 562963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*inputCount)++; 563963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 564963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsAllocName = "gAlloc" + capitalize(variableName); 565963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet javaAllocName = variableName; 566963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet javaArrayName = "array" + capitalize(javaAllocName); 567963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 56846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Process the option. 56946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!option.empty()) { 57046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (option.compare(0, 6, "range(") == 0) { 57146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t pComma = option.find(','); 57246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t pParen = option.find(')'); 57346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (pComma == string::npos || pParen == string::npos) { 57446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet printf("Incorrect range %s\n", option.c_str()); 57546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 57646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet minValue = option.substr(6, pComma - 6); 57746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet maxValue = option.substr(pComma + 1, pParen - pComma - 1); 57846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 57946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else if (option.compare(0, 6, "above(") == 0) { 58046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t pParen = option.find(')'); 58146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (pParen == string::npos) { 58246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet printf("Incorrect option %s\n", option.c_str()); 58346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 58446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet smallerParameter = option.substr(6, pParen - 6); 58546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 58646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 58746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet printf("Unrecognized option %s\n", option.c_str()); 58846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 58946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 59046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet 591963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 592963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (rsBaseType == TYPES[i].cType) { 593963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet javaBaseType = TYPES[i].javaType; 594963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet break; 595963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 596963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 597963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 598963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 599963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::process(int versionOfTestFiles) { 600963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!readSpecFile()) { 601963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 602963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 603963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (versionOfTestFiles == 0) { 604963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet versionOfTestFiles = mLargestVersionNumber; 605963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 606963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!generateFiles(versionOfTestFiles)) { 607963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 608963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 609963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("%s: %ld functions processed.\n", mSpecFileName.c_str(), mFunctionsMap.size()); 610963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 611963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 612963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 613963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Read the specification, adding the definitions to the global functions map. 614963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::readSpecFile() { 615963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FILE* specFile = fopen(mSpecFileName.c_str(), "rt"); 616963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!specFile) { 617963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening input file: %s\n", mSpecFileName.c_str()); 618963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 619963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 620963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 621963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = 0; 622963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 623963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* spec = Specification::scanSpecification(specFile); 624963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (spec == NULL) { 625963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet break; 626963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 627963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet getFunction(spec->getCleanName())->addSpecification(spec); 628963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int specMin = spec->getMinVersion(); 629963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int specMax = spec->getMaxVersion(); 630963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specMin && specMin > mLargestVersionNumber) { 631963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = specMin; 632963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 633963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specMax && specMax > mLargestVersionNumber) { 634963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = specMax; 635963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 636963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 637963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 638963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fclose(specFile); 639963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 640963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 641963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 642963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::generateFiles(int versionOfTestFiles) { 643963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("%s: Generating test files for version %d\n", mSpecFileName.c_str(), versionOfTestFiles); 644963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 645963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The header file name should have the same base but with a ".rsh" extension. 646963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string headerFileName = mSpecFileName; 647963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t l = headerFileName.length(); 648963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char SPEC[] = ".spec"; 649963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const int SPEC_SIZE = sizeof(SPEC) - 1; 650963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const int start = l - SPEC_SIZE; 651963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (start >= 0 && headerFileName.compare(start, SPEC_SIZE, SPEC) == 0) { 652963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFileName.erase(start); 653963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 654963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFileName += ".rsh"; 655963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 656963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the start of the header file. 657963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream headerFile; 658963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile.open(headerFileName.c_str(), ios::out | ios::trunc); 659963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!headerFile.is_open()) { 660963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening output file: %s\n", headerFileName.c_str()); 661963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 662963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 663963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile << LEGAL_NOTICE; 664963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile << AUTO_GENERATED_WARNING; 665963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeIfdef(headerFile, headerFileName, true); 666963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 667963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the functions to the header and test files. 668963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = writeAllFunctions(headerFile, versionOfTestFiles); 669963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 670963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Finish the header file. 671963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeIfdef(headerFile, headerFileName, false); 672963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile.close(); 673963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 674963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return success; 675963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 676963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 677963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return the named function from the map. Creates it if it's not there. 678963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletFunction* SpecFile::getFunction(const string& name) { 679963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FunctionsIterator iter = mFunctionsMap.find(name); 680963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (iter != mFunctionsMap.end()) { 681963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return iter->second; 682963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 683963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* f = new Function(name); 684963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunctionsMap[name] = f; 685963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return f; 686963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 687963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 688963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::writeAllFunctions(ofstream& headerFile, int versionOfTestFiles) { 689963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = true; 690963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (FunctionsIterator iter = mFunctionsMap.begin(); iter != mFunctionsMap.end(); iter++) { 691963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* func = iter->second; 692963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!func->writeFiles(headerFile, versionOfTestFiles)) { 693963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet success = false; 694963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 695963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 696963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return success; 697963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 698963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 699963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletFunction::Function(const string& name) { 700963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mName = name; 701963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mCapitalizedName = capitalize(mName); 702963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mTestName = "Test" + mCapitalizedName; 703963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRelaxedTestName = mTestName + "Relaxed"; 704963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 705963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 706963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::writeFiles(ofstream& headerFile, int versionOfTestFiles) { 707963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!startRsFile() || !startJavaFile() || !writeRelaxedRsFile()) { 708963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 709963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 710963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 711963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (SpecificationIterator i = mSpecifications.begin(); i < mSpecifications.end(); i++) { 712963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*i)->writeFiles(headerFile, mRsFile, mJavaFile, this, versionOfTestFiles); 713963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 714963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 715963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet finishJavaFile(); 716963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // There's no work to wrap-up in the .rs file. 717963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 718963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile.close(); 719963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile.close(); 720963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 721963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 722963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 723963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::startRsFile() { 724963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string fileName = mTestName + ".rs"; 725963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile.open(fileName.c_str(), ios::out | ios::trunc); 726963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mRsFile.is_open()) { 727963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", fileName.c_str()); 728963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 729963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 730963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << LEGAL_NOTICE; 731963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "#pragma version(1)\n"; 732963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "#pragma rs java_package_name(android.renderscript.cts)\n\n"; 733963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << AUTO_GENERATED_WARNING; 734963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 735963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 736963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 737963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Write an allocation definition if not already emitted in the .rs file. 738963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::writeRsAllocationDefinition(const ParameterDefinition& param) { 739963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!testAndSet(param.rsAllocName, &mRsAllocationsGenerated)) { 740963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "rs_allocation " << param.rsAllocName << ";\n"; 741963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 742963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 743963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 744963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Write the entire *Relaxed.rs test file, as it only depends on the name. 745963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::writeRelaxedRsFile() { 746963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string name = mRelaxedTestName + ".rs"; 747963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FILE* file = fopen(name.c_str(), "wt"); 748963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!file) { 749963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", name.c_str()); 750963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 751963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 752963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fputs(LEGAL_NOTICE, file); 753963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s; 754963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "#include \"" + mTestName + ".rs\"\n"; 755963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "#pragma rs_fp_relaxed\n"; 756963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += AUTO_GENERATED_WARNING; 757963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fputs(s.c_str(), file); 758963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fclose(file); 759963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 760963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 761963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 762963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::startJavaFile() { 763963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string fileName = mTestName + ".java"; 764963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile.open(fileName.c_str(), ios::out | ios::trunc); 765963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mJavaFile.is_open()) { 766963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", fileName.c_str()); 767963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 768963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 769963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << LEGAL_NOTICE; 770963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << AUTO_GENERATED_WARNING; 771963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "package android.renderscript.cts;\n\n"; 772963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 773963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.Allocation;\n"; 774963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.RSRuntimeException;\n"; 775963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.Element;\n\n"; 776963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 777963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "public class " << mTestName << " extends RSBaseCompute {\n\n"; 778963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 779963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "private ScriptC_" << mTestName << " script;\n"; 780963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "private ScriptC_" << mRelaxedTestName << " scriptRelaxed;\n\n"; 781963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 782963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "@Override\n"; 783963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "protected void setUp() throws Exception {\n"; 784963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "super.setUp();\n"; 785963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "script = new ScriptC_" << mTestName << "(mRS);\n"; 786963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "scriptRelaxed = new ScriptC_" << mRelaxedTestName << "(mRS);\n"; 787963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "}\n\n"; 788963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 789963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 790963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 791963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::writeJavaArgumentClassDefinition(const string& className, const string& definition) { 792963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!testAndSet(className, &mJavaGeneratedArgumentClasses)) { 793963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << definition; 794963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 795963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 796963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 797963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::addJavaCheckCall(const string& call) { 798963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCallAllCheckMethods += tab(2) + call + "\n"; 799963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 800963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 801963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::finishJavaFile() { 802963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "public void test" << mCapitalizedName << "() {\n"; 803963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << mJavaCallAllCheckMethods; 804963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "}\n"; 805963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "}\n"; 806963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 807963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 808963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Specification::expandStringVector(const vector<string>& in, int i1, int i2, int i3, int i4, 809963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* out) const { 810963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet out->clear(); 811963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (vector<string>::const_iterator iter = in.begin(); iter != in.end(); iter++) { 812963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet out->push_back(expandString(*iter, i1, i2, i3, i4)); 813135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 814135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 815135c4b747bce5898d98de964d7c453d215254d0dJason Sams 816963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletSpecification* Specification::scanSpecification(FILE* in) { 817963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* spec = new Specification(); 818963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mTest = "scalar"; // default 819135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool modeComment = false; 820135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool modeInline = false; 821963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = true; 822135c4b747bce5898d98de964d7c453d215254d0dJason Sams 823135c4b747bce5898d98de964d7c453d215254d0dJason Sams while (1) { 824135c4b747bce5898d98de964d7c453d215254d0dJason Sams string s; 825135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool ret = getNextLine(in, &s); 826135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!ret) break; 827135c4b747bce5898d98de964d7c453d215254d0dJason Sams 828135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (modeComment) { 829135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!s.size() || (s[0] == ' ')) { 830135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 0); 831963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mComment.push_back(s); 832135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 833135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 834135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeComment = false; 835135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 836135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 837135c4b747bce5898d98de964d7c453d215254d0dJason Sams 838135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (modeInline) { 839135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!s.size() || (s[0] == ' ')) { 840135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 0); 841963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mInline.push_back(s); 842135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 843135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 844135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeInline = false; 845135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 846135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 847135c4b747bce5898d98de964d7c453d215254d0dJason Sams 848135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s[0] == '#') { 849135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 850135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 851135c4b747bce5898d98de964d7c453d215254d0dJason Sams 852135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 5, "name:") == 0) { 853135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 5); 854963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mName = s; 855963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Some functions like convert have # part of the name. Truncate at that point. 856963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t p = s.find('#'); 857963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p != string::npos) { 858963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p > 0 && s[p - 1] == '_') { 859963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p--; 860963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 861963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(p); 862963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 863963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mCleanName = s; 864135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 865135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 866135c4b747bce5898d98de964d7c453d215254d0dJason Sams 867135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "arg:") == 0) { 868135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 4); 869963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mParam.push_back(s); 870135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 871135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 872135c4b747bce5898d98de964d7c453d215254d0dJason Sams 873135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "ret:") == 0) { 874135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 4); 875963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReturn = s; 876963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 877963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 878963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 879963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s.compare(0, 5, "test:") == 0) { 880963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet trim(&s, 5); 881963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s == "scalar" || s == "vector" || s == "noverify" || s == "none") { 882963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mTest = s; 883963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 884963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Unrecognized test option: %s\n", s.c_str()); 885963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet success = false; 886963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 887135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 888135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 889135c4b747bce5898d98de964d7c453d215254d0dJason Sams 890135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "end:") == 0) { 891963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (success) { 892963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return spec; 893963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 894963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet delete spec; 895963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return NULL; 896963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 897135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 898135c4b747bce5898d98de964d7c453d215254d0dJason Sams 899135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "comment:") == 0) { 900135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeComment = true; 901135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 902135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 903135c4b747bce5898d98de964d7c453d215254d0dJason Sams 904135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 7, "inline:") == 0) { 905135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeInline = true; 906135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 907135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 908135c4b747bce5898d98de964d7c453d215254d0dJason Sams 909135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "version:") == 0) { 910135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 8); 911963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet sscanf(s.c_str(), "%i %i", &spec->mMinVersion, &spec->mMaxVersion); 912135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 913135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 914135c4b747bce5898d98de964d7c453d215254d0dJason Sams 915135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "start:") == 0) { 916135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 917135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 918135c4b747bce5898d98de964d7c453d215254d0dJason Sams 919135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 2, "w:") == 0) { 920135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> t; 921135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("1") != string::npos) { 922135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back(""); 923135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 924135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("2") != string::npos) { 925135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("2"); 926135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 927135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("3") != string::npos) { 928135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("3"); 929135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 930135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("4") != string::npos) { 931135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("4"); 932135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 933963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReplaceables.push_back(t); 934135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 935135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 936135c4b747bce5898d98de964d7c453d215254d0dJason Sams 937135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 2, "t:") == 0) { 938135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> t; 939963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 940963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s.find(TYPES[i].specType) != string::npos) { 941963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t.push_back(TYPES[i].cType); 942963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 943135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 944963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReplaceables.push_back(t); 945135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 946135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 947135c4b747bce5898d98de964d7c453d215254d0dJason Sams 948135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.size() == 0) { 949135c4b747bce5898d98de964d7c453d215254d0dJason Sams // eat empty line 950135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 951135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 952135c4b747bce5898d98de964d7c453d215254d0dJason Sams 953135c4b747bce5898d98de964d7c453d215254d0dJason Sams printf("Error, line:\n"); 954135c4b747bce5898d98de964d7c453d215254d0dJason Sams printf(" %s\n", s.c_str()); 955135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 956135c4b747bce5898d98de964d7c453d215254d0dJason Sams 957963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet delete spec; 958135c4b747bce5898d98de964d7c453d215254d0dJason Sams return NULL; 959135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 960135c4b747bce5898d98de964d7c453d215254d0dJason Sams 961963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Specification::writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 962963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* function, int versionOfTestFiles) { 963963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int start[4]; 964963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int end[4]; 965963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < 4; i++) { 966963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i < (int)mReplaceables.size()) { 967963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet start[i] = 0; 968963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet end[i] = mReplaceables[i].size(); 969963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 970963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet start[i] = -1; 971963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet end[i] = 0; 972963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 973963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 974963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i4 = start[3]; i4 < end[3]; i4++) { 975963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i3 = start[2]; i3 < end[2]; i3++) { 976963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i2 = start[1]; i2 < end[1]; i2++) { 977963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i1 = start[0]; i1 < end[0]; i1++) { 978963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Permutation p(function, this, i1, i2, i3, i4); 979963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.writeFiles(headerFile, rsFile, javaFile, versionOfTestFiles); 980963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 981963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 982963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 983963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 984963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 985135c4b747bce5898d98de964d7c453d215254d0dJason Sams 986963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Specification::relevantForVersion(int versionOfTestFiles) const { 987963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mMinVersion != 0 && mMinVersion > versionOfTestFiles) { 988963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 989135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 990963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mMaxVersion != 0 && mMaxVersion < versionOfTestFiles) { 991963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 992963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 993963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 994135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 995135c4b747bce5898d98de964d7c453d215254d0dJason Sams 996963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring Specification::expandString(string s, int i1, int i2, int i3, int i4) const { 997963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 0) { 998963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#1", mReplaceables[0][i1]); 999135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1000963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 1) { 1001963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#2", mReplaceables[1][i2]); 1002135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1003963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 2) { 1004963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#3", mReplaceables[2][i3]); 1005135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1006963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 3) { 1007963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#4", mReplaceables[3][i4]); 1008135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1009135c4b747bce5898d98de964d7c453d215254d0dJason Sams return s; 1010135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1011135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1012963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletPermutation::Permutation(Function* func, Specification* spec, int i1, int i2, int i3, int i4) 1013963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet : mFunction(func), 1014963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mSpecification(spec), 1015963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mReturnIndex(-1), 1016963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFirstInputIndex(-1), 1017963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mInputCount(0), 1018963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mOutputCount(0) { 1019963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // We expand the strings now to make capitalization easier. The previous code preserved the #n 1020963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // markers just before emitting, which made capitalization difficult. 1021963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mName = spec->getName(i1, i2, i3, i4); 1022963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mCleanName = spec->getCleanName(); 1023963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mTest = spec->getTest(); 1024963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getInlines(i1, i2, i3, i4, &mInline); 1025963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getComments(i1, i2, i3, i4, &mComment); 1026ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1027963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> paramDefinitions; 1028963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getParams(i1, i2, i3, i4, ¶mDefinitions); 1029963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < paramDefinitions.size(); i++) { 1030963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ParameterDefinition* def = new ParameterDefinition(); 1031963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet def->parseParameterDefinition(paramDefinitions[i], false, &mInputCount, &mOutputCount); 1032963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!def->isOutParameter && mFirstInputIndex < 0) { 1033963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFirstInputIndex = mParams.size(); 1034ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1035963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mParams.push_back(def); 1036ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1037ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1038963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string s = spec->getReturn(i1, i2, i3, i4); 1039963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!s.empty() && s != "void") { 1040963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ParameterDefinition* def = new ParameterDefinition(); 1041963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Adding "*" tells the parse method it's an output. 1042963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet def->parseParameterDefinition(s, true, &mInputCount, &mOutputCount); 1043963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mReturnIndex = mParams.size(); 1044963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mParams.push_back(def); 1045963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1046963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1047963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsKernelName = "test" + capitalize(mName); 1048963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsClassName = "Arguments"; 1049963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName = "Arguments"; 1050963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCheckMethodName = "check" + capitalize(mCleanName); 1051963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifyMethodName = "verifyResults" + capitalize(mCleanName); 1052963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1053963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1054963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsKernelName += capitalize(p.rsType); 1055963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsClassName += capitalize(p.rsBaseType); 1056963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName += capitalize(p.rsBaseType); 1057963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1") { 1058963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName += "N"; 1059963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1060963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCheckMethodName += capitalize(p.rsType); 1061963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifyMethodName += capitalize(p.rsType); 1062ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1063963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifierComputeMethodName = "compute" + capitalize(mCleanName); 1064ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams} 1065ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1066963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO Remove once we have long/double copyTo/copyFrom 1067963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Permutation::hasLongOrDoubleParameter() const { 1068963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1069963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1070963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.javaBaseType == "long" || p.javaBaseType == "double") { 1071963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 1072963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1073963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1074963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 1075963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1076ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1077963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 1078963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles) { 1079963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeHeaderSection(headerFile); 1080963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (hasLongOrDoubleParameter()) { 1081963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Warning: skipping a test for %s as we don't support long or double arguments (due " 1082963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "to Allocation not supporting them).\n", 1083963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mName.c_str()); 1084963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return; 1085963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1086ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1087963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mSpecification->relevantForVersion(versionOfTestFiles) && mTest != "none") { 1088963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeRsSection(rsFile); 1089963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaSection(javaFile); 1090963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1091963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1092135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1093963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeHeaderSection(ofstream& file) const { 1094963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int minVersion = mSpecification->getMinVersion(); 1095963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int maxVersion = mSpecification->getMaxVersion(); 1096963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool hasVersion = minVersion || maxVersion; 1097963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1098963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (hasVersion) { 1099963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (maxVersion) { 1100963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#if (defined(RS_VERSION) && (RS_VERSION >= " << minVersion 1101963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ") && (RS_VERSION <= " << maxVersion << "))\n"; 1102135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1103963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#if (defined(RS_VERSION) && (RS_VERSION >= " << minVersion << "))\n"; 1104135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1105135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1106135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1107963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "/*\n"; 1108963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t ct = 0; ct < mComment.size(); ct++) { 1109963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mComment[ct].empty()) { 1110963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * " << mComment[ct] << "\n"; 1111135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1112963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " *\n"; 1113135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1114135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1115963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " *\n"; 1116963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (minVersion || maxVersion) { 1117963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (maxVersion) { 1118963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * Suppored by API versions " << minVersion << " - " << maxVersion << "\n"; 1119135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1120963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * Supported by API versions " << minVersion << " and newer.\n"; 1121963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1122963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1123963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " */\n"; 1124963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mInline.size() > 0) { 1125963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "static "; 1126963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1127963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "extern "; 1128963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1129963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1130963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mReturnIndex]->rsType; 1131963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1132963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "void"; 1133963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1134963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " __attribute__(("; 1135963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount <= 1) { 1136963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "const, "; 1137963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1138963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "overloadable))"; 1139963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mName; 1140963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "("; 1141963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1142963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1143963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex) { 114446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1145963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1146963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ", "; 1147963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 114846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << p.rsType; 114946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (p.isOutParameter) { 115046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << "*"; 115146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 115246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!p.specName.empty()) { 115346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << " " << p.specName; 115446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 1155963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1156963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1157963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1158963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mInline.size() > 0) { 1159963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ") {\n"; 1160963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t ct = 0; ct < mInline.size(); ct++) { 1161963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " " << mInline[ct].c_str() << "\n"; 1162135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1163963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "}\n"; 1164963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1165963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ");\n"; 1166963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1167963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (hasVersion) { 1168963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#endif\n"; 1169135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1170963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "\n"; 1171963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1172135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1173963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Write the section of the .rs file for this permutation. 1174963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1175963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We communicate the extra input and output parameters via global allocations. 1176963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * For example, if we have a function that takes three arguments, two for input 1177963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * and one for output: 1178963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1179963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * start: 1180963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * name: gamn 1181963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * ret: float3 1182963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: float3 a 1183963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: int b 1184963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: float3 *c 1185963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * end: 1186963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1187963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We'll produce: 1188963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1189963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rs_allocation gAllocInB; 1190963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rs_allocation gAllocOutC; 1191963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1192963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float3 __attribute__((kernel)) test_gamn_float3_int_float3(float3 inA, unsigned int x) { 1193963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * int inB; 1194963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float3 outC; 1195963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float2 out; 1196963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * inB = rsGetElementAt_int(gAllocInB, x); 1197963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * out = gamn(a, in_b, &outC); 1198963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rsSetElementAt_float4(gAllocOutC, &outC, x); 1199963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * return out; 1200963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * } 1201963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1202963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We avoid re-using x and y from the definition because these have reserved 1203963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * meanings in a .rs file. 1204963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 1205963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeRsSection(ofstream& rs) const { 1206963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the allocation declarations we'll need. 1207963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1208963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1209963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Don't need allocation for one input and one return value. 1210963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex && i != mFirstInputIndex) { 1211963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->writeRsAllocationDefinition(p); 1212963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1213963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1214963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "\n"; 1215135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1216963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the function header. 1217963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1218963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mParams[mReturnIndex]->rsType; 1219ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } else { 1220963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "void"; 1221ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1222963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " __attribute__((kernel)) " << mRsKernelName; 1223963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "("; 1224963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1225963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mFirstInputIndex >= 0) { 1226963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mParams[mFirstInputIndex]->rsType << " " << mParams[mFirstInputIndex]->variableName; 1227963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1228135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1229963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1 || mInputCount > 1) { 1230963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1231963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ", "; 1232963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1233963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "unsigned int x"; 1234ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1235963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ") {\n"; 1236963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1237963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the local variable declarations and initializations. 1238963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1239963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i == mFirstInputIndex || i == mReturnIndex) { 1240963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 1241963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1242963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1243963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << p.rsType << " " << p.variableName; 1244963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1245963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " = 0;\n"; 1246963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1247963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " = rsGetElementAt_" << p.rsType << "(" << p.rsAllocName << ", x);\n"; 1248963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1249963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1250963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1251963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the function call. 1252963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1253963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1) { 1254963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << mParams[mReturnIndex]->rsType << " " 1255963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << mParams[mReturnIndex]->variableName << " = "; 1256963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1257963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "return "; 1258963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1259963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1260963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mName << "("; 1261963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = false; 1262963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1263963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1264963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i == mReturnIndex) { 1265963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 1266963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1267963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1268963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ", "; 1269963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1270963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1271963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "&"; 1272963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1273963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << p.variableName; 1274963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1275135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1276963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ");\n"; 1277135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1278963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1) { 1279963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write setting the extra out parameters into the allocations. 1280963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1281963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1282963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter && i != mReturnIndex) { 1283963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "rsSetElementAt_" << p.rsType << "(" << p.rsAllocName << ", "; 1284963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (passByAddressToSet(p.variableName)) { 1285963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "&"; 1286963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1287963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << p.variableName << ", x);\n"; 1288963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1289963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1290963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1291963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "return " << mParams[mReturnIndex]->variableName << ";\n"; 1292ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1293ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1294963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "}\n"; 1295963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1296963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1297963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Permutation::passByAddressToSet(const string& name) const { 1298963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s = name; 1299963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = s.size() - 1; 1300963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = s[last]; 1301963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return lastChar >= '0' && lastChar <= '9'; 1302963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1303135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1304963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaSection(ofstream& file) const { 1305963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // By default, we test the results using item by item comparison. 1306963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mTest == "scalar") { 1307963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArgumentClass(file, true); 1308963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, true); 1309963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyScalarMethod(file); 1310963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (mTest == "vector") { 1311963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArgumentClass(file, false); 1312963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, true); 1313963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyVectorMethod(file); 1314963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (mTest == "noverify") { 1315963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, false); 1316135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1317135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1318963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Register the check method to be called. This code will be written at the end. 1319963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->addJavaCheckCall(mJavaCheckMethodName + "();"); 1320135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1321135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1322963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaArgumentClass(ofstream& file, bool scalar) const { 1323963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string name; 1324963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (scalar) { 1325963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet name = mJavaArgumentsClassName; 1326963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1327963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet name = mJavaArgumentsNClassName; 1328963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1329963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s; 1330963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(1) + "public class " + name + " {\n"; 1331963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1332963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1333963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(2) + "public " + p.javaBaseType; 1334963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!scalar && p.mVectorSize != "1") { 1335963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "[]"; 1336963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1337963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += " " + p.variableName + ";\n"; 1338963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1339963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "\n"; 1340963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(2) + "public int ulf;\n"; 1341963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(2) + "public int ulfRelaxed;\n"; 1342963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(1) + "}\n\n"; 1343963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1344963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->writeJavaArgumentClassDefinition(name, s); 1345963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1346135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1347963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaCheckMethod(ofstream& file, bool generateCallToVerify) const { 1348963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "private void " << mJavaCheckMethodName << "() {\n"; 1349963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Generate the input allocations and initialization. 1350963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1351963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1352963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 135346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet writeJavaInputAllocationDefinition(file, tab(2), p); 135446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 135546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 135646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Enforce ordering if needed. 135746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 135846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 135946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!p.isOutParameter && !p.smallerParameter.empty()) { 136046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string smallerAlloc = "in" + capitalize(p.smallerParameter); 136146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(2) << "enforceOrdering(" << smallerAlloc << ", " << p.javaAllocName 136246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet << ");\n"; 1363135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1364963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1365963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCallToRs(file, false, generateCallToVerify); 1366963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCallToRs(file, true, generateCallToVerify); 1367963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1368963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1369963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1370963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaInputAllocationDefinition(ofstream& file, const string& indent, 137146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const { 1372963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string dataType; 1373963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char vectorSize; 137446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet convertToRsType(param.rsType, &dataType, &vectorSize); 137546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet long seed = hashString(mJavaCheckMethodName + param.javaAllocName); 137646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << indent << "Allocation " << param.javaAllocName 137746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet << " = createRandomAllocation(mRS, Element.DataType." << dataType << ", " << vectorSize 137846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet << ", 0x" << std::hex << seed << "l"; 137946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!param.minValue.empty()) { 138046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << ", " << param.minValue << ", " << param.maxValue; 138146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 138246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << ", false"; // TODO set to false only for native 138346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 138446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << ");\n"; 1385963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1386963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1387963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaOutputAllocationDefinition(ofstream& file, const string& indent, 138846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const { 1389963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string dataType; 1390963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char vectorSize; 139146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet convertToRsType(param.rsType, &dataType, &vectorSize); 139246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << indent << "Allocation " << param.javaAllocName << " = Allocation.createSized(mRS, " 139346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet << "getElement(mRS, Element.DataType." << dataType << ", " << vectorSize 1394963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "), INPUTSIZE);\n"; 1395963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1396963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1397963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Converts float2 to FLOAT_32 and 2, etc. 1398963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::convertToRsType(const string& name, string* dataType, char* vectorSize) const { 1399963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s = name; 1400963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = s.size() - 1; 1401963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = s[last]; 1402963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (lastChar >= '1' && lastChar <= '4') { 1403963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(last); 1404963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *vectorSize = lastChar; 1405963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1406963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *vectorSize = '1'; 1407963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1408963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet dataType->clear(); 1409963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 1410963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s == TYPES[i].cType) { 1411963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *dataType = TYPES[i].rsDataType; 1412963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet break; 1413135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1414963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1415963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1416963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1417963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVerifyScalarMethod(ofstream& file) const { 1418963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyFunctionHeader(file); 1419963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string vectorSize = "1"; 1420963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1421963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1422963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArrayInitialization(file, p); 1423963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1" && p.mVectorSize != vectorSize) { 1424963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (vectorSize == "1") { 1425963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorSize = p.mVectorSize; 1426963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1427963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Yikes, had vector %s and %s\n", vectorSize.c_str(), p.mVectorSize.c_str()); 1428135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1429135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1430963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1431963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1432963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "for (int i = 0; i < INPUTSIZE; i++) {\n"; 1433963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "for (int j = 0; j < " << vectorSize << " ; j++) {\n"; 1434963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1435963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "// Extract the inputs.\n"; 1436963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << mJavaArgumentsClassName << " args = new " << mJavaArgumentsClassName 1437963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "();\n"; 1438963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1439963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1440963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 1441963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "args." << p.variableName << " = " << p.javaArrayName << "[i"; 1442963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.vectorWidth != "1") { 1443963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * " << p.vectorWidth << " + j"; 1444135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1445963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "];\n"; 1446135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1447135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1448963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1449963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "// Figure out what the outputs should have been.\n"; 1450963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "CoreMathVerifier." << mJavaVerifierComputeMethodName << "(args);\n"; 1451963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "int ulf = relaxed ? args.ulfRelaxed : args.ulf;\n"; 1452963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1453963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "// Figure out what the outputs should have been.\n"; 1454963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "boolean valid = true;\n"; 1455963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "int neededUlf = 0;\n"; 1456963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1457963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1458963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1459963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaTestOneValue(file, 4, p.rsBaseType, "args." + p.variableName, 1460963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1461963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1462963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1463963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1464963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "if (!valid) {\n"; 1465963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(5) << "StringBuilder message = new StringBuilder();\n"; 1466963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1467963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1468963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1469963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendOutputToMessage(file, 5, p.rsBaseType, p.variableName, 1470963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "args." + p.variableName, 1471963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1472963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1473963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendInputToMessage(file, 5, p.rsBaseType, p.variableName, 1474963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "args." + p.variableName); 1475963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1476963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1477963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 147846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(5) << "assertTrue(\"Incorrect output for " << mJavaCheckMethodName << "\" +\n"; 147946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(7) << "(relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), valid);\n"; 1480963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "}\n"; 1481963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1482963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1483963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1484135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1485135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1486963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVerifyFunctionHeader(ofstream& file) const { 1487963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "private void " << mJavaVerifyMethodName << "("; 1488963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1489963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1490963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "Allocation " << p.javaAllocName << ", "; 1491963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1492963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "boolean relaxed) {\n"; 1493963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1494135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1495963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaTestOneValue(ofstream& file, int indent, const string& rsBaseType, 1496963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& expected, const string& actual) const { 1497963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (rsBaseType[0] == 'f') { 1498963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaComputeNeededUlf(file, indent, expected, actual); 1499963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "if (neededUlf > ulf) {\n"; 1500963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent + 1) << "valid = false;\n"; 1501963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1502963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1503963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "if (" + expected + " != " + actual + ") {\n"; 1504963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent + 1) << "valid = false;\n"; 1505963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1506963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1507963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1508135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1509963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendOutputToMessage(ofstream& file, int indent, 1510963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& rsBaseType, const string& name, 1511963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& expected, 1512963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const { 1513963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, rsBaseType, "Expected output " + name, expected); 1514963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 1515963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, rsBaseType, "Actual output " + name, actual); 1516963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (rsBaseType[0] == 'f') { 1517963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaComputeNeededUlf(file, indent, expected, actual); 1518963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "if (neededUlf > ulf) {\n"; 1519963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent + 1) << "message.append(String.format(\" FAILED, ulf needed %d, " 1520963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "specified %d\", neededUlf, ulf));\n"; 1521963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1522963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1523963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "if (" + expected + " != " + actual + ") {\n"; 1524963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent + 1) << "message.append(\" FAIL\");\n"; 1525963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1526963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1527963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 1528963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1529135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1530963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendInputToMessage(ofstream& file, int indent, 1531963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& rsBaseType, const string& name, 1532963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const { 1533963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, rsBaseType, "Input " + name, actual); 1534963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 1535963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1536963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1537963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaComputeNeededUlf(ofstream& file, int indent, const string& expected, 1538963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const { 1539963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "neededUlf = (int) (Math.abs(" << expected << " - " << actual 1540963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ") / Math.ulp(" << expected << ") + 0.5);\n"; 1541963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1542963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1543963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendNewLineToMessage(ofstream& file, int indent) const { 1544963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "message.append(\"\\n\");\n"; 1545963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1546963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1547963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVariableToMessage(ofstream& file, int indent, 1548963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& rsBaseType, const string& legend, 1549963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& value) const { 1550963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "message.append(String.format(\"" + legend + ": "; 1551963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (rsBaseType[0] == 'f') { 155246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << "%14.8g %8x %15a\",\n"; 155346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(indent + 2) << value << ", " 155446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet << "Float.floatToRawIntBits(" << value << "), " << value; 1555963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (rsBaseType[0] == 'u') { 155646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << "0x%x\",\n"; 155746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(indent + 2) << value; 1558963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 155946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << "%d\",\n"; 156046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(indent + 2) << value; 1561135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1562963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "));\n"; 1563963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1564135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1565963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVectorComparison(ofstream& file, int indent, 1566963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1567963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1568963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaTestOneValue(file, indent, p.javaBaseType, "args." + p.variableName, 1569963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i]"); 1570963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1571963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1572963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1573963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaTestOneValue(file, indent + 1, p.rsBaseType, "args." + p.variableName + "[j]", 1574963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1575963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1576963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1577963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1578963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1579963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVectorInputToMessage(ofstream& file, int indent, 1580963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1581963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1582963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendInputToMessage(file, indent, p.rsBaseType, p.variableName, 1583963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i]"); 1584963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1585963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1586963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendInputToMessage(file, indent + 1, p.rsBaseType, p.variableName, 1587963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1588963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1589963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1590963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1591963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1592963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVectorOutputToMessage(ofstream& file, int indent, 1593963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1594963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1595963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendOutputToMessage(file, indent, p.rsBaseType, p.variableName, 1596963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "args." + p.variableName, p.javaArrayName + "[i]"); 1597963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1598963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1599963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1600963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendOutputToMessage(file, indent + 1, p.rsBaseType, p.variableName, 1601963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "args." + p.variableName + "[j]", 1602963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1603963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1604963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1605963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1606963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1607963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVerifyVectorMethod(ofstream& file) const { 1608963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyFunctionHeader(file); 1609963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1610963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1611963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArrayInitialization(file, p); 1612963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1613963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) + "for (int i = 0; i < INPUTSIZE; i++) {\n"; 1614963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << mJavaArgumentsNClassName << " args = new " << mJavaArgumentsNClassName 1615963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "();\n"; 1616963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1617963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Create the appropriate sized arrays in args\n"; 1618963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1619963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1620963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1") { 1621963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "args." << p.variableName << " = new " << p.javaBaseType << "[" 1622963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << p.mVectorSize << "];\n"; 1623963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1624963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1625963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1626963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Fill args with the input values\n"; 1627963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1628963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1629963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 1630963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1631963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "args." << p.variableName << " = " << p.javaArrayName + "[i]" 1632963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ";\n"; 1633963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1634963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1635963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "args." << p.variableName + "[j] = " 1636963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << p.javaArrayName + "[i * " + p.vectorWidth + " + j]" 1637963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ";\n"; 1638963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1639963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1640963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1641963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1642963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "CoreMathVerifier." << mJavaVerifierComputeMethodName << "(args);\n\n"; 1643963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "int ulf = relaxed ? args.ulfRelaxed : args.ulf;\n"; 1644963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1645963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Compare the expected outputs to the actual values returned by RS.\n"; 1646963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "boolean valid = true;\n"; 1647963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "int neededUlf;\n"; 1648963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1649963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1650963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1651963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVectorComparison(file, 3, p); 1652963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1653963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1654963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1655963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "if (!valid) {\n"; 1656963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "StringBuilder message = new StringBuilder();\n"; 1657963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1658963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1659963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1660963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVectorOutputToMessage(file, 4, p); 1661135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1662963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVectorInputToMessage(file, 4, p); 1663135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1664135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1665135c4b747bce5898d98de964d7c453d215254d0dJason Sams 166646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(4) << "assertTrue(\"Incorrect output for " << mJavaCheckMethodName << "\" +\n"; 166746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(6) << "(relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), valid);\n"; 1668963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1669963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1670963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1671963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1672963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1673963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaCallToRs(ofstream& file, bool relaxed, bool generateCallToVerify) const { 1674963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string script = "script"; 1675963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (relaxed) { 1676963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet script += "Relaxed"; 1677135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1678135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1679963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "try {\n"; 1680963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1681963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1682963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 168346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet writeJavaOutputAllocationDefinition(file, tab(3), p); 1684963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1685135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1686135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1687963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1688963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1689963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex && i != mFirstInputIndex) { 1690963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << script << ".set_" << p.rsAllocName << "(" << p.javaAllocName 1691963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ");\n"; 1692963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1693963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1694135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1695963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << script << ".forEach_" << mRsKernelName << "("; 1696963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1697963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mFirstInputIndex >= 0) { 1698963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mFirstInputIndex]->javaAllocName; 1699963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1700963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1701963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1702963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1703963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ", "; 1704963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1705963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mReturnIndex]->variableName << ");\n"; 1706963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1707135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1708963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (generateCallToVerify) { 1709963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << mJavaVerifyMethodName << "("; 1710963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1711963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1712963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << p.variableName << ", "; 1713963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1714963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1715963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (relaxed) { 1716963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "true"; 1717963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1718963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "false"; 1719963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1720963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ");\n"; 1721963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1722963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "} catch (Exception e) {\n"; 1723963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "throw new RSRuntimeException(\"RenderScript. Can't invoke forEach_" 1724963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << mRsKernelName << ": \" + e.toString());\n"; 1725963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1726135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1727135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1728963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} // namespace 1729135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1730963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletint main(int argc, char* argv[]) { 1731963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles = 0; 1732963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> specFileNames; 1733963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!parseCommandLine(argc, argv, &versionOfTestFiles, &specFileNames)) { 1734963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Usage: gen_runtime spec_file [spec_file...] [-v version_of_test_files]\n"); 1735963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return -1; 1736963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1737963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int result = 0; 1738963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < specFileNames.size(); i++) { 1739963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet SpecFile specFile(specFileNames[i]); 1740963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!specFile.process(versionOfTestFiles)) { 1741963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result = -1; 1742963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1743963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1744963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return result; 1745963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1746