gen_runtime.cpp revision bcd5b9af756d10317faf54fa3742f89dfacef152
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 43bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet#include <math.h> 44bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet#include <stdio.h> 45963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <cctype> 46963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <cstdlib> 47bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet#include <fstream> 48963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <functional> 49bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet#include <iomanip> 50135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <list> 51963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <map> 52963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <set> 5346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet#include <sstream> 54135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <string> 55963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <vector> 56135c4b747bce5898d98de964d7c453d215254d0dJason Sams 57135c4b747bce5898d98de964d7c453d215254d0dJason Samsusing namespace std; 58135c4b747bce5898d98de964d7c453d215254d0dJason Sams 59963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletnamespace { 60963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 61963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst char* AUTO_GENERATED_WARNING = 62963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "// Don't edit this file! It is auto-generated by " 63963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "frameworks/rs/api/gen_runtime.\n\n"; 64963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst char* LEGAL_NOTICE = 65963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "/*\n" 66963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * Copyright (C) 2014 The Android Open Source Project\n" 67963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " *\n" 68963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 69963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * you may not use this file except in compliance with the License.\n" 70963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * You may obtain a copy of the License at\n" 71963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " *\n" 72963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * http://www.apache.org/licenses/LICENSE-2.0\n" 73963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " *\n" 74963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * Unless required by applicable law or agreed to in writing, software\n" 75963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 76963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" 77963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * See the License for the specific language governing permissions and\n" 78963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * limitations under the License.\n" 79963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " */\n\n"; 80963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 81963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Function; 82963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Specification; 83963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Permutation; 84bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletstruct Type; 85963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 86963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Information about a parameter to a function. The values of all the fields should only be set by 87963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * parseParameterDefinition. 88963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 89963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstruct ParameterDefinition { 90963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsType; // The Renderscript type, e.g. "uint3" 91963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsBaseType; // As above but without the number, e.g. "uint" 92963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string javaBaseType; // The type we need to declare in Java, e.g. "unsigned int" 93963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 94963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The number of entries in the vector. It should be either "1", "2", "3", or "4". It's also 95963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * "1" for scalars. 96963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 97963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mVectorSize; 98963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The space the vector takes in an array. It's the same as the vector size, except for size 99963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * "3", where the width is "4". 100963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 101963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string vectorWidth; 102963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 10346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string specName; // e.g. x, as found in the spec file 104963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string variableName; // e.g. inX, used both in .rs and .java 105963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsAllocName; // e.g. gAllocInX 106963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string javaAllocName; // e.g. inX 107963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string javaArrayName; // e.g. arrayInX 108135c4b747bce5898d98de964d7c453d215254d0dJason Sams 10946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // If non empty, the mininum and maximum values to be used when generating the test data. 11046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string minValue; 11146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string maxValue; 11246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet /* If non empty, contains the name of another parameter that should be smaller or equal to this 11346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet * parameter, i.e. value(smallerParameter) <= value(this). This is used when testing clamp. 11446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet */ 11546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string smallerParameter; 11646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet 117bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet bool isOutParameter; // True if this parameter returns data from the script. 118bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet bool undefinedIfOutIsNan; // If true, we don't validate if 'out' is NaN. 119bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 120bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet int typeIndex; // Index in the TYPES array. 121bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet int compatibleTypeIndex; // Index in TYPES for which the test data must also fit. 122963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 123963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Parse the parameter definition found in the spec file. It will generate a name if none 124963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * are present in the file. One of the two counts will be incremented, and potentially 125963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * used to generate unique names. isReturn is true if we're processing the "return:" 126963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * definition. 127963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 128963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void parseParameterDefinition(string s, bool isReturn, int* inputCount, int* outputCount); 129963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 130963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 131963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// An entire spec file and the methods to process it. 132963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass SpecFile { 133135c4b747bce5898d98de964d7c453d215254d0dJason Samspublic: 134963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet explicit SpecFile(const string& specFileName) : mSpecFileName(specFileName) {} 135963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool process(int versionOfTestFiles); 136135c4b747bce5898d98de964d7c453d215254d0dJason Sams 137963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 138963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string mSpecFileName; 139963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The largest version number that we have found in all the specifications. 140963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mLargestVersionNumber; 141963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 142963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet map<string, Function*> mFunctionsMap; // All the known functions. 143963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet typedef map<string, Function*>::iterator FunctionsIterator; 144963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 145963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool readSpecFile(); 146963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* getFunction(const string& name); 147963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool generateFiles(int versionOfTestFiles); 148963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeAllFunctions(ofstream& headerFile, int versionOfTestFiles); 149963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 150963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 151963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Represents a function, like "clamp". Even though the spec file contains many entries for clamp, 152963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * we'll only have one clamp instance. 153963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 154963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Function { 155963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 156963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; // The lower case name, e.g. native_log 157963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCapitalizedName; // The capitalized name, e.g. NativeLog 158963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mTestName; // e.g. TestNativeLog 159963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mRelaxedTestName; // e.g. TestNativeLogRelaxed 160963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 161963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<Specification*> mSpecifications; 162963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet typedef vector<Specification*>::iterator SpecificationIterator; 163963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 164963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* We keep track of the allocations generated in the .rs file and the argument classes defined 165963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * in the Java file, as we share these between the functions created for each specification. 166963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 167963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set<string> mRsAllocationsGenerated; 168963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set<string> mJavaGeneratedArgumentClasses; 169963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 170963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaCallAllCheckMethods; // Lines of Java code to invoke the check methods. 171963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 172963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream mRsFile; // The Renderscript test file we're generating. 173963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream mJavaFile; // The Jave test file we're generating. 174963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 175963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool startRsFile(); // Open the mRsFile and writes its header. 176963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeRelaxedRsFile(); // Write the entire relaxed rs test file (an include essentially) 177963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool startJavaFile(); // Open the mJavaFile and writes the header. 178963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void finishJavaFile(); // Write the test method and closes the file. 179963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 180963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 181963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet explicit Function(const string& name); 182963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void addSpecification(Specification* spec) { mSpecifications.push_back(spec); } 183963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Write the .java and the two .rs test files. versionOfTestFiles is used to restrict which API 184963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * to test. Also writes the section of the header file. 185963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 186963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeFiles(ofstream& headerFile, int versionOfTestFiles); 187963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write an allocation and keep track of having it written, so it can be shared. 188963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeRsAllocationDefinition(const ParameterDefinition& param); 189963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write an argument class definiton and keep track of having it written, so it can be shared. 190963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaArgumentClassDefinition(const string& className, const string& definition); 191963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Add a call to mJavaCallAllCheckMethods to be used at the end of the file generation. 192963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void addJavaCheckCall(const string& call); 193963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 194963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 195963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Defines one of the many variations of the function. There's a one to one correspondance between 196963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * Specification objects and entries in the spec file. Some of the strings that are parts of a 197963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * Specification can include placeholders, which are "#1", "#2", "#3", and "#4". We'll replace 198963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * these by values before generating the files. 199963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 200963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Specification { 201963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 202963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The range of versions this specification applies to. 0 if there's no restriction, so an API 203963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * that became available at 9 and is still valid would have min:9 max:0. 204963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 205135c4b747bce5898d98de964d7c453d215254d0dJason Sams int mMinVersion; 206135c4b747bce5898d98de964d7c453d215254d0dJason Sams int mMaxVersion; 207135c4b747bce5898d98de964d7c453d215254d0dJason Sams 208963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The name of the function without #n, e.g. convert. As of this writing, it only differs for 209963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * convert. 210963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 211963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCleanName; 212bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string mTest; // How to test. One of "scalar", "vector", "noverify", "limited", and "none". 213bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string mPrecisionLimit; // Maximum precision required when checking output of this function. 214963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 215135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<vector<string> > mReplaceables; 216963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 217963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The following fields may contain placeholders that will be replaced using the mReplaceables. 218963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 219963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The name of this function, can include #, e.g. convert_#1_#2 220963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; 221963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 222963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mReturn; // The return type 223963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mComment; // The comments to be included in the header 224963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mInline; // The inline code to be included in the header 225963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mParam; // One entry per parameter defined 226963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 227963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Substitute the placeholders in the strings by the corresponding entries in mReplaceables. 228963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string expandString(string s, int i1, int i2, int i3, int i4) const; 229963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void expandStringVector(const vector<string>& in, int i1, int i2, int i3, int i4, 230963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* out) const; 231963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 232963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 233963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification() { 234963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mMinVersion = 0; 235963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mMaxVersion = 0; 236963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 237963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int getMinVersion() const { return mMinVersion; } 238963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int getMaxVersion() const { return mMaxVersion; } 239963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 240963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getName(int i1, int i2, int i3, int i4) const { 241963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandString(mName, i1, i2, i3, i4); 242963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 243963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getReturn(int i1, int i2, int i3, int i4) const { 244963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandString(mReturn, i1, i2, i3, i4); 245963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 246963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getComments(int i1, int i2, int i3, int i4, vector<string>* comments) const { 247963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mComment, i1, i2, i3, i4, comments); 248963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 249963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getInlines(int i1, int i2, int i3, int i4, vector<string>* inlines) const { 250963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mInline, i1, i2, i3, i4, inlines); 251963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 252963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getParams(int i1, int i2, int i3, int i4, vector<string>* params) const { 253963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mParam, i1, i2, i3, i4, params); 254963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 255963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getTest() const { return mTest; } 256bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string getPrecisionLimit() const { return mPrecisionLimit; } 257963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getCleanName() const { return mCleanName; } 258963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 259963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, Function* function, 260963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles); 261963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeRelaxedRsFile() const; 262963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Return true if this specification should be generated for this version. 263963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool relevantForVersion(int versionOfTestFiles) const; 264963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 265963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet static Specification* scanSpecification(FILE* in); 266963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 267963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 268963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// A concrete version of a specification, where all placeholders have been replaced by actual 269963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// values. 270963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Permutation { 271963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 272963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* mFunction; 273963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* mSpecification; 274963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 275963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // These are the expanded version of those found on Specification 276963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; 277963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCleanName; 278bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string mTest; // How to test. One of "scalar", "vector", "noverify", "limited", and "none". 279bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string mPrecisionLimit; // Maximum precision required when checking output of this function. 280135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> mInline; 281963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mComment; 282963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 283963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The inputs and outputs of the function. This include the return type, if present. 284963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<ParameterDefinition*> mParams; 285963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The index of the return value in mParams, -1 if the function is void. 286963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mReturnIndex; 287963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The index of the first input value in mParams, -1 if there's no input. 288963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mFirstInputIndex; 289963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The number of input and output parameters. 290963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mInputCount; 291963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mOutputCount; 292135c4b747bce5898d98de964d7c453d215254d0dJason Sams 293963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mRsKernelName; 294963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaArgumentsClassName; 295963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaArgumentsNClassName; 296963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaVerifierComputeMethodName; 297963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaCheckMethodName; 298963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaVerifyMethodName; 299963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 300963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeHeaderSection(ofstream& file) const; 301963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 302963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeRsSection(ofstream& rs) const; 303963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 304963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaSection(ofstream& file) const; 305963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaArgumentClass(ofstream& file, bool scalar) const; 306963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaCheckMethod(ofstream& file, bool generateCallToVerify) const; 307963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVerifyScalarMethod(ofstream& file) const; 308963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVerifyVectorMethod(ofstream& file) const; 309963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVerifyFunctionHeader(ofstream& file) const; 310963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaInputAllocationDefinition(ofstream& file, const string& indent, 31146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const; 312963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaOutputAllocationDefinition(ofstream& file, const string& indent, 31346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const; 314bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet // Write code to create a random allocation for which the data must be compatible for two types. 315bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaRandomCompatibleFloatAllocation(ofstream& file, const string& dataType, 316bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& seed, char vectorSize, 317bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& compatibleType, 318bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& generatedType) const; 319bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaRandomCompatibleIntegerAllocation(ofstream& file, const string& dataType, 320bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& seed, char vectorSize, 321bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& compatibleType, 322bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& generatedType) const; 323963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaCallToRs(ofstream& file, bool relaxed, bool generateCallToVerify) const; 324963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 325bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaTestAndSetValid(ofstream& file, int indent, const ParameterDefinition& p, 326bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& argsIndex, const string& actualIndex) const; 327bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaTestOneValue(ofstream& file, int indent, const ParameterDefinition& p, 328bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& argsIndex, const string& actualIndex) const; 329bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaAppendOutputToMessage(ofstream& file, int indent, const ParameterDefinition& p, 330bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& argsIndex, const string& actualIndex) const; 331963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendInputToMessage(ofstream& file, int indent, const string& rsBaseType, 332963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& name, const string& actual) const; 333963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendNewLineToMessage(ofstream& file, int indent) const; 334963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendVariableToMessage(ofstream& file, int indent, const string& rsBaseType, 335bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& value) const; 336bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaAppendFloatyVariableToMessage(ofstream& file, int indent, 337bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& value) const; 338963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVectorComparison(ofstream& file, int indent, const ParameterDefinition& p) const; 339963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendVectorInputToMessage(ofstream& file, int indent, 340963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const; 341963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendVectorOutputToMessage(ofstream& file, int indent, 342963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const; 343963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool passByAddressToSet(const string& name) const; 344963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void convertToRsType(const string& name, string* dataType, char* vectorSize) const; 345963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 346963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 347963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Permutation(Function* function, Specification* specification, int i1, int i2, int i3, int i4); 348963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 349963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles); 350963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool hasLongOrDoubleParameter() const; 351135c4b747bce5898d98de964d7c453d215254d0dJason Sams}; 352135c4b747bce5898d98de964d7c453d215254d0dJason Sams 353963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Table of type equivalences 354963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO: We should just be pulling this from a shared header. Slang does exactly the same thing. 355bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 356bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletenum NumberKind { SIGNED_INTEGER, UNSIGNED_INTEGER, FLOATING_POINT }; 357bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 358963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstruct Type { 359963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char* specType; // Name found in the .spec file 360963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsDataType; // RS data type 361963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string cType; // Type in a C file 362963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char* javaType; // Type in a Java file 363bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet NumberKind kind; 364bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet /* For integers, number of bits of the number, excluding the sign bit. 365bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet * For floats, number of bits of the exponent. 366bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet */ 367bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet int significantBits; 368963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 369135c4b747bce5898d98de964d7c453d215254d0dJason Sams 370bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletconst Type TYPES[] = {{"f16", "FLOAT_16", "half", "half", FLOATING_POINT, 5}, 371bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet {"f32", "FLOAT_32", "float", "float", FLOATING_POINT, 8}, 372bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet {"f64", "FLOAT_64", "double", "double", FLOATING_POINT, 11}, 373bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet {"i8", "SIGNED_8", "char", "byte", SIGNED_INTEGER, 7}, 374bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet {"u8", "UNSIGNED_8", "uchar", "byte", UNSIGNED_INTEGER, 8}, 375bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet {"i16", "SIGNED_16", "short", "short", SIGNED_INTEGER, 15}, 376bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet {"u16", "UNSIGNED_16", "ushort", "short", UNSIGNED_INTEGER, 16}, 377bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet {"i32", "SIGNED_32", "int", "int", SIGNED_INTEGER, 31}, 378bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet {"u32", "UNSIGNED_32", "uint", "int", UNSIGNED_INTEGER, 32}, 379bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet {"i64", "SIGNED_64", "long", "long", SIGNED_INTEGER, 63}, 380bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet {"u64", "UNSIGNED_64", "ulong", "long", UNSIGNED_INTEGER, 64}}; 381963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 382963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst int NUM_TYPES = sizeof(TYPES) / sizeof(TYPES[0]); 383963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 384bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet// Returns the index in TYPES for the provided cType 385bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletint FindCType(const string& cType) { 386bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 387bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (cType == TYPES[i].cType) { 388bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet return i; 389bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 390bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 391bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet return -1; 392bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet} 393bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 394963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Capitalizes and removes underscores. E.g. converts "native_log" to NativeLog. 395963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring capitalize(const string& source) { 396963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int length = source.length(); 397963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string result; 398963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool capitalize = true; 399963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int s = 0; s < length; s++) { 400963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (source[s] == '_') { 401963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet capitalize = true; 402963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (capitalize) { 403963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result += toupper(source[s]); 404963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet capitalize = false; 405963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 406963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result += source[s]; 407963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 408963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 409963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return result; 410963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 411963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 412963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring tab(int n) { return string(n * 4, ' '); } 413963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 414bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet// Returns a string that's an hexadecimal constant fo the hash of the string. 415bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletstring hashString(const string& s) { 416963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet long hash = 0; 417963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < s.length(); i++) { 418963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet hash = hash * 43 + s[i]; 419963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 420bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet stringstream stream; 421bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet stream << "0x" << std::hex << hash << "l"; 422bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet return stream.str(); 423963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 424963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 42546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet// Removes the character from present. Returns true if the string contained the character. 42646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouilletstatic bool charRemoved(char c, string* s) { 42746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t p = s->find(c); 42846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (p != string::npos) { 42946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet s->erase(p, 1); 43046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet return true; 43146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 43246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet return false; 43346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet} 43446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet 435963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return true if the string is already in the set. Inserts it if not. 436963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool testAndSet(const string& flag, set<string>* set) { 437963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (set->find(flag) == set->end()) { 438963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set->insert(flag); 439963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 440135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 441135c4b747bce5898d98de964d7c453d215254d0dJason Sams return true; 442135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 443135c4b747bce5898d98de964d7c453d215254d0dJason Sams 444963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Convert an int into a string. 445963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring toString(int n) { 446963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char buf[100]; 447963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet snprintf(buf, sizeof(buf), "%d", n); 448963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return string(buf); 449963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 450963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 451963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid trim(string* s, size_t start) { 452135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (start > 0) { 453135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(0, start); 454135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 455135c4b747bce5898d98de964d7c453d215254d0dJason Sams 456135c4b747bce5898d98de964d7c453d215254d0dJason Sams while (s->size() && (s->at(0) == ' ')) { 457135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(0, 1); 458135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 459135c4b747bce5898d98de964d7c453d215254d0dJason Sams 460135c4b747bce5898d98de964d7c453d215254d0dJason Sams size_t p = s->find_first_of("\n\r"); 461135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (p != string::npos) { 462135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(p); 463135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 464135c4b747bce5898d98de964d7c453d215254d0dJason Sams 465963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while ((s->size() > 0) && (s->at(s->size() - 1) == ' ')) { 466963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->erase(s->size() - 1); 467963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 468963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 469963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 470963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring stringReplace(string s, string match, string rep) { 471963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 472963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t p = s.find(match); 473963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p == string::npos) break; 474963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 475963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(p, match.size()); 476963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.insert(p, rep); 477963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 478963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return s; 479963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 480963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 481963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return the next line from the input file. 482963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool getNextLine(FILE* in, string* s) { 483963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->clear(); 484963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 485963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int c = fgetc(in); 486963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (c == EOF) return s->size() != 0; 487963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (c == '\n') break; 488963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->push_back((char)c); 489963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 490963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 491963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 492963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 493963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid writeIfdef(ofstream& file, string filename, bool isStart) { 494963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string t = "__"; 495963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t += filename; 496963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t += "__"; 497963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 498963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 2; i < t.size(); i++) { 499963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (t[i] == '.') { 500963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t[i] = '_'; 501963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 502963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 503963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 504963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (isStart) { 505963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#ifndef " << t << "\n"; 506963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#define " << t << "\n"; 507963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 508963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#endif // " << t << "\n"; 509963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 510963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 511963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 512963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid writeJavaArrayInitialization(ofstream& file, const ParameterDefinition& p) { 513963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << p.javaBaseType << "[] " << p.javaArrayName << " = new " << p.javaBaseType 514963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "[INPUTSIZE * " << p.vectorWidth << "];\n"; 515963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << p.javaAllocName << ".copyTo(" << p.javaArrayName << ");\n"; 516963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 517963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 518963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool parseCommandLine(int argc, char* argv[], int* versionOfTestFiles, 519963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* specFileNames) { 520963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 1; i < argc; i++) { 521963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (argv[i][0] == '-') { 522963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (argv[i][1] == 'v') { 523963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet i++; 524963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i < argc) { 525963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char* end; 526963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *versionOfTestFiles = strtol(argv[i], &end, 10); 527963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (*end != '\0') { 528963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Can't parse the version number %s\n", argv[i]); 529963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 530963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 531963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 532963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Missing version number after -v\n"); 533963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 534963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 535963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 536963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Unrecognized flag %s\n", argv[i]); 537963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 538963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 539963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 540963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet specFileNames->push_back(argv[i]); 541963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 542963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 543963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specFileNames->size() == 0) { 544963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("No spec file specified\n"); 545963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 546963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 547963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 548963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 549963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 550963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Parse a parameter definition. It's of the form "type [*][name]". The type 551963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * is required. The name is optional. The * indicates it's an output 552963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * parameter. We also pass the indexed of this parameter in the definition, so 553963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * we can create names like in2, in3, etc. */ 554963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid ParameterDefinition::parseParameterDefinition(string s, bool isReturn, int* inputCount, 555963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int* outputCount) { 55646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet istringstream stream(s); 55746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string name, type, option; 55846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet stream >> rsType; 55946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet stream >> specName; 56046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet stream >> option; 561963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 56246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Determine if this is an output. 56346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet isOutParameter = charRemoved('*', &rsType) || charRemoved('*', &specName) || isReturn; 564963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 56546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Extract the vector size out of the type. 566963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = rsType.size() - 1; 567963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = rsType[last]; 568963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (lastChar >= '0' && lastChar <= '9') { 569963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsBaseType = rsType.substr(0, last); 570963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mVectorSize = lastChar; 571963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 572963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsBaseType = rsType; 573963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mVectorSize = "1"; 574963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 575963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mVectorSize == "3") { 576963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorWidth = "4"; 577963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 578963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorWidth = mVectorSize; 579963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 580963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 581963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Create variable names to be used in the java and .rs files. Because x and 582963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * y are reserved in .rs files, we prefix variable names with "in" or "out". 583963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 584963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (isOutParameter) { 585963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName = "out"; 58646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!specName.empty()) { 58746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet variableName += capitalize(specName); 588963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (!isReturn) { 589963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName += toString(*outputCount); 590963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 591963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*outputCount)++; 592963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 593963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName = "in"; 59446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!specName.empty()) { 59546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet variableName += capitalize(specName); 596963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (*inputCount > 0) { 597963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName += toString(*inputCount); 598963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 599963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*inputCount)++; 600963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 601963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsAllocName = "gAlloc" + capitalize(variableName); 602963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet javaAllocName = variableName; 603963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet javaArrayName = "array" + capitalize(javaAllocName); 604963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 60546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Process the option. 606bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet undefinedIfOutIsNan = false; 607bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet compatibleTypeIndex = -1; 60846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!option.empty()) { 60946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (option.compare(0, 6, "range(") == 0) { 61046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t pComma = option.find(','); 61146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t pParen = option.find(')'); 61246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (pComma == string::npos || pParen == string::npos) { 61346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet printf("Incorrect range %s\n", option.c_str()); 61446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 61546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet minValue = option.substr(6, pComma - 6); 61646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet maxValue = option.substr(pComma + 1, pParen - pComma - 1); 61746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 61846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else if (option.compare(0, 6, "above(") == 0) { 61946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t pParen = option.find(')'); 62046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (pParen == string::npos) { 62146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet printf("Incorrect option %s\n", option.c_str()); 62246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 62346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet smallerParameter = option.substr(6, pParen - 6); 62446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 625bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else if (option.compare(0, 11, "compatible(") == 0) { 626bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet size_t pParen = option.find(')'); 627bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (pParen == string::npos) { 628bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet printf("Incorrect option %s\n", option.c_str()); 629bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 630bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet compatibleTypeIndex = FindCType(option.substr(11, pParen - 11)); 631bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 632bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else if (option.compare(0, 11, "conditional") == 0) { 633bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet undefinedIfOutIsNan = true; 63446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 63546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet printf("Unrecognized option %s\n", option.c_str()); 63646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 63746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 63846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet 639bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet typeIndex = FindCType(rsBaseType); 640bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (typeIndex < 0) { 641bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet // TODO set a global flag when we encounter an error & abort 642bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet printf("Error, could not find %s\n", rsBaseType.c_str()); 643bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 644bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet javaBaseType = TYPES[typeIndex].javaType; 645963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 646963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 647963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 648963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::process(int versionOfTestFiles) { 649963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!readSpecFile()) { 650963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 651963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 652963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (versionOfTestFiles == 0) { 653963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet versionOfTestFiles = mLargestVersionNumber; 654963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 655963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!generateFiles(versionOfTestFiles)) { 656963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 657963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 658963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("%s: %ld functions processed.\n", mSpecFileName.c_str(), mFunctionsMap.size()); 659963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 660963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 661963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 662963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Read the specification, adding the definitions to the global functions map. 663963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::readSpecFile() { 664963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FILE* specFile = fopen(mSpecFileName.c_str(), "rt"); 665963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!specFile) { 666963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening input file: %s\n", mSpecFileName.c_str()); 667963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 668963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 669963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 670963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = 0; 671963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 672963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* spec = Specification::scanSpecification(specFile); 673963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (spec == NULL) { 674963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet break; 675963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 676963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet getFunction(spec->getCleanName())->addSpecification(spec); 677963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int specMin = spec->getMinVersion(); 678963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int specMax = spec->getMaxVersion(); 679963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specMin && specMin > mLargestVersionNumber) { 680963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = specMin; 681963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 682963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specMax && specMax > mLargestVersionNumber) { 683963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = specMax; 684963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 685963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 686963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 687963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fclose(specFile); 688963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 689963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 690963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 691963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::generateFiles(int versionOfTestFiles) { 692963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("%s: Generating test files for version %d\n", mSpecFileName.c_str(), versionOfTestFiles); 693963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 694963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The header file name should have the same base but with a ".rsh" extension. 695963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string headerFileName = mSpecFileName; 696963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t l = headerFileName.length(); 697963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char SPEC[] = ".spec"; 698963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const int SPEC_SIZE = sizeof(SPEC) - 1; 699963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const int start = l - SPEC_SIZE; 700963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (start >= 0 && headerFileName.compare(start, SPEC_SIZE, SPEC) == 0) { 701963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFileName.erase(start); 702963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 703963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFileName += ".rsh"; 704963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 705963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the start of the header file. 706963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream headerFile; 707963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile.open(headerFileName.c_str(), ios::out | ios::trunc); 708963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!headerFile.is_open()) { 709963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening output file: %s\n", headerFileName.c_str()); 710963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 711963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 712963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile << LEGAL_NOTICE; 713963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile << AUTO_GENERATED_WARNING; 714963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeIfdef(headerFile, headerFileName, true); 715963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 716963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the functions to the header and test files. 717963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = writeAllFunctions(headerFile, versionOfTestFiles); 718963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 719963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Finish the header file. 720963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeIfdef(headerFile, headerFileName, false); 721963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile.close(); 722963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 723963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return success; 724963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 725963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 726963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return the named function from the map. Creates it if it's not there. 727963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletFunction* SpecFile::getFunction(const string& name) { 728963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FunctionsIterator iter = mFunctionsMap.find(name); 729963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (iter != mFunctionsMap.end()) { 730963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return iter->second; 731963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 732963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* f = new Function(name); 733963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunctionsMap[name] = f; 734963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return f; 735963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 736963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 737963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::writeAllFunctions(ofstream& headerFile, int versionOfTestFiles) { 738963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = true; 739963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (FunctionsIterator iter = mFunctionsMap.begin(); iter != mFunctionsMap.end(); iter++) { 740963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* func = iter->second; 741963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!func->writeFiles(headerFile, versionOfTestFiles)) { 742963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet success = false; 743963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 744963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 745963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return success; 746963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 747963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 748963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletFunction::Function(const string& name) { 749963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mName = name; 750963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mCapitalizedName = capitalize(mName); 751963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mTestName = "Test" + mCapitalizedName; 752963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRelaxedTestName = mTestName + "Relaxed"; 753963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 754963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 755963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::writeFiles(ofstream& headerFile, int versionOfTestFiles) { 756963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!startRsFile() || !startJavaFile() || !writeRelaxedRsFile()) { 757963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 758963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 759963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 760963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (SpecificationIterator i = mSpecifications.begin(); i < mSpecifications.end(); i++) { 761963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*i)->writeFiles(headerFile, mRsFile, mJavaFile, this, versionOfTestFiles); 762963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 763963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 764963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet finishJavaFile(); 765963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // There's no work to wrap-up in the .rs file. 766963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 767963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile.close(); 768963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile.close(); 769963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 770963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 771963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 772963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::startRsFile() { 773963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string fileName = mTestName + ".rs"; 774963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile.open(fileName.c_str(), ios::out | ios::trunc); 775963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mRsFile.is_open()) { 776963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", fileName.c_str()); 777963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 778963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 779963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << LEGAL_NOTICE; 780963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "#pragma version(1)\n"; 781963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "#pragma rs java_package_name(android.renderscript.cts)\n\n"; 782963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << AUTO_GENERATED_WARNING; 783963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 784963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 785963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 786963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Write an allocation definition if not already emitted in the .rs file. 787963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::writeRsAllocationDefinition(const ParameterDefinition& param) { 788963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!testAndSet(param.rsAllocName, &mRsAllocationsGenerated)) { 789963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "rs_allocation " << param.rsAllocName << ";\n"; 790963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 791963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 792963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 793963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Write the entire *Relaxed.rs test file, as it only depends on the name. 794963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::writeRelaxedRsFile() { 795963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string name = mRelaxedTestName + ".rs"; 796963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FILE* file = fopen(name.c_str(), "wt"); 797963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!file) { 798963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", name.c_str()); 799963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 800963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 801963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fputs(LEGAL_NOTICE, file); 802963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s; 803963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "#include \"" + mTestName + ".rs\"\n"; 804963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "#pragma rs_fp_relaxed\n"; 805963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += AUTO_GENERATED_WARNING; 806963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fputs(s.c_str(), file); 807963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fclose(file); 808963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 809963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 810963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 811963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::startJavaFile() { 812963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string fileName = mTestName + ".java"; 813963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile.open(fileName.c_str(), ios::out | ios::trunc); 814963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mJavaFile.is_open()) { 815963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", fileName.c_str()); 816963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 817963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 818963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << LEGAL_NOTICE; 819963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << AUTO_GENERATED_WARNING; 820963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "package android.renderscript.cts;\n\n"; 821963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 822963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.Allocation;\n"; 823963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.RSRuntimeException;\n"; 824963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.Element;\n\n"; 825963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 826963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "public class " << mTestName << " extends RSBaseCompute {\n\n"; 827963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 828963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "private ScriptC_" << mTestName << " script;\n"; 829963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "private ScriptC_" << mRelaxedTestName << " scriptRelaxed;\n\n"; 830963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 831963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "@Override\n"; 832963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "protected void setUp() throws Exception {\n"; 833963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "super.setUp();\n"; 834963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "script = new ScriptC_" << mTestName << "(mRS);\n"; 835963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "scriptRelaxed = new ScriptC_" << mRelaxedTestName << "(mRS);\n"; 836963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "}\n\n"; 837963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 838963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 839963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 840963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::writeJavaArgumentClassDefinition(const string& className, const string& definition) { 841963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!testAndSet(className, &mJavaGeneratedArgumentClasses)) { 842963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << definition; 843963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 844963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 845963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 846963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::addJavaCheckCall(const string& call) { 847963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCallAllCheckMethods += tab(2) + call + "\n"; 848963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 849963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 850963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::finishJavaFile() { 851963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "public void test" << mCapitalizedName << "() {\n"; 852963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << mJavaCallAllCheckMethods; 853963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "}\n"; 854963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "}\n"; 855963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 856963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 857963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Specification::expandStringVector(const vector<string>& in, int i1, int i2, int i3, int i4, 858963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* out) const { 859963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet out->clear(); 860963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (vector<string>::const_iterator iter = in.begin(); iter != in.end(); iter++) { 861963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet out->push_back(expandString(*iter, i1, i2, i3, i4)); 862135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 863135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 864135c4b747bce5898d98de964d7c453d215254d0dJason Sams 865963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletSpecification* Specification::scanSpecification(FILE* in) { 866963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* spec = new Specification(); 867963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mTest = "scalar"; // default 868135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool modeComment = false; 869135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool modeInline = false; 870963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = true; 871135c4b747bce5898d98de964d7c453d215254d0dJason Sams 872135c4b747bce5898d98de964d7c453d215254d0dJason Sams while (1) { 873135c4b747bce5898d98de964d7c453d215254d0dJason Sams string s; 874135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool ret = getNextLine(in, &s); 875135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!ret) break; 876135c4b747bce5898d98de964d7c453d215254d0dJason Sams 877135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (modeComment) { 878135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!s.size() || (s[0] == ' ')) { 879135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 0); 880963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mComment.push_back(s); 881135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 882135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 883135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeComment = false; 884135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 885135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 886135c4b747bce5898d98de964d7c453d215254d0dJason Sams 887135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (modeInline) { 888135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!s.size() || (s[0] == ' ')) { 889135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 0); 890963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mInline.push_back(s); 891135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 892135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 893135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeInline = false; 894135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 895135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 896135c4b747bce5898d98de964d7c453d215254d0dJason Sams 897135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s[0] == '#') { 898135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 899135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 900135c4b747bce5898d98de964d7c453d215254d0dJason Sams 901135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 5, "name:") == 0) { 902135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 5); 903963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mName = s; 904963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Some functions like convert have # part of the name. Truncate at that point. 905963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t p = s.find('#'); 906963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p != string::npos) { 907963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p > 0 && s[p - 1] == '_') { 908963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p--; 909963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 910963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(p); 911963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 912963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mCleanName = s; 913135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 914135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 915135c4b747bce5898d98de964d7c453d215254d0dJason Sams 916135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "arg:") == 0) { 917135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 4); 918963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mParam.push_back(s); 919135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 920135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 921135c4b747bce5898d98de964d7c453d215254d0dJason Sams 922135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "ret:") == 0) { 923135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 4); 924963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReturn = s; 925963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 926963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 927963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 928963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s.compare(0, 5, "test:") == 0) { 929963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet trim(&s, 5); 930963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s == "scalar" || s == "vector" || s == "noverify" || s == "none") { 931963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mTest = s; 932bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else if (s.compare(0, 7, "limited") == 0) { 933bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet spec->mTest = "limited"; 934bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (s.compare(7, 1, "(") == 0) { 935bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet size_t pParen = s.find(')'); 936bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (pParen == string::npos) { 937bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet printf("Incorrect test %s\n", s.c_str()); 938bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 939bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet spec->mPrecisionLimit = s.substr(8, pParen - 8); 940bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 941bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 942963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 943bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet printf("Error: Unrecognized test option: %s\n", s.c_str()); 944963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet success = false; 945963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 946135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 947135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 948135c4b747bce5898d98de964d7c453d215254d0dJason Sams 949135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "end:") == 0) { 950963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (success) { 951963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return spec; 952963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 953963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet delete spec; 954963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return NULL; 955963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 956135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 957135c4b747bce5898d98de964d7c453d215254d0dJason Sams 958135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "comment:") == 0) { 959135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeComment = true; 960135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 961135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 962135c4b747bce5898d98de964d7c453d215254d0dJason Sams 963135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 7, "inline:") == 0) { 964135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeInline = true; 965135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 966135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 967135c4b747bce5898d98de964d7c453d215254d0dJason Sams 968135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "version:") == 0) { 969135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 8); 970963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet sscanf(s.c_str(), "%i %i", &spec->mMinVersion, &spec->mMaxVersion); 971135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 972135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 973135c4b747bce5898d98de964d7c453d215254d0dJason Sams 974135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "start:") == 0) { 975135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 976135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 977135c4b747bce5898d98de964d7c453d215254d0dJason Sams 978135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 2, "w:") == 0) { 979135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> t; 980135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("1") != string::npos) { 981135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back(""); 982135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 983135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("2") != string::npos) { 984135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("2"); 985135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 986135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("3") != string::npos) { 987135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("3"); 988135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 989135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("4") != string::npos) { 990135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("4"); 991135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 992963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReplaceables.push_back(t); 993135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 994135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 995135c4b747bce5898d98de964d7c453d215254d0dJason Sams 996135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 2, "t:") == 0) { 997135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> t; 998963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 999963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s.find(TYPES[i].specType) != string::npos) { 1000963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t.push_back(TYPES[i].cType); 1001963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1002135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1003963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReplaceables.push_back(t); 1004135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 1005135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1006135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1007135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.size() == 0) { 1008135c4b747bce5898d98de964d7c453d215254d0dJason Sams // eat empty line 1009135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 1010135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1011135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1012135c4b747bce5898d98de964d7c453d215254d0dJason Sams printf("Error, line:\n"); 1013135c4b747bce5898d98de964d7c453d215254d0dJason Sams printf(" %s\n", s.c_str()); 1014135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1015135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1016963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet delete spec; 1017135c4b747bce5898d98de964d7c453d215254d0dJason Sams return NULL; 1018135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1019135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1020963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Specification::writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 1021963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* function, int versionOfTestFiles) { 1022963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int start[4]; 1023963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int end[4]; 1024963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < 4; i++) { 1025963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i < (int)mReplaceables.size()) { 1026963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet start[i] = 0; 1027963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet end[i] = mReplaceables[i].size(); 1028963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1029963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet start[i] = -1; 1030963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet end[i] = 0; 1031963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1032963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1033963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i4 = start[3]; i4 < end[3]; i4++) { 1034963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i3 = start[2]; i3 < end[2]; i3++) { 1035963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i2 = start[1]; i2 < end[1]; i2++) { 1036963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i1 = start[0]; i1 < end[0]; i1++) { 1037963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Permutation p(function, this, i1, i2, i3, i4); 1038963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.writeFiles(headerFile, rsFile, javaFile, versionOfTestFiles); 1039963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1040963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1041963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1042963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1043963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1044135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1045963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Specification::relevantForVersion(int versionOfTestFiles) const { 1046963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mMinVersion != 0 && mMinVersion > versionOfTestFiles) { 1047963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 1048135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1049963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mMaxVersion != 0 && mMaxVersion < versionOfTestFiles) { 1050963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 1051963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1052963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 1053135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1054135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1055963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring Specification::expandString(string s, int i1, int i2, int i3, int i4) const { 1056963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 0) { 1057963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#1", mReplaceables[0][i1]); 1058135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1059963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 1) { 1060963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#2", mReplaceables[1][i2]); 1061135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1062963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 2) { 1063963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#3", mReplaceables[2][i3]); 1064135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1065963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 3) { 1066963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#4", mReplaceables[3][i4]); 1067135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1068135c4b747bce5898d98de964d7c453d215254d0dJason Sams return s; 1069135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1070135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1071963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletPermutation::Permutation(Function* func, Specification* spec, int i1, int i2, int i3, int i4) 1072963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet : mFunction(func), 1073963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mSpecification(spec), 1074963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mReturnIndex(-1), 1075963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFirstInputIndex(-1), 1076963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mInputCount(0), 1077963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mOutputCount(0) { 1078963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // We expand the strings now to make capitalization easier. The previous code preserved the #n 1079963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // markers just before emitting, which made capitalization difficult. 1080963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mName = spec->getName(i1, i2, i3, i4); 1081963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mCleanName = spec->getCleanName(); 1082963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mTest = spec->getTest(); 1083bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet mPrecisionLimit = spec->getPrecisionLimit(); 1084963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getInlines(i1, i2, i3, i4, &mInline); 1085963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getComments(i1, i2, i3, i4, &mComment); 1086ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1087963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> paramDefinitions; 1088963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getParams(i1, i2, i3, i4, ¶mDefinitions); 1089963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < paramDefinitions.size(); i++) { 1090963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ParameterDefinition* def = new ParameterDefinition(); 1091963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet def->parseParameterDefinition(paramDefinitions[i], false, &mInputCount, &mOutputCount); 1092963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!def->isOutParameter && mFirstInputIndex < 0) { 1093963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFirstInputIndex = mParams.size(); 1094ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1095963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mParams.push_back(def); 1096ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1097ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1098963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string s = spec->getReturn(i1, i2, i3, i4); 1099963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!s.empty() && s != "void") { 1100963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ParameterDefinition* def = new ParameterDefinition(); 1101963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Adding "*" tells the parse method it's an output. 1102963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet def->parseParameterDefinition(s, true, &mInputCount, &mOutputCount); 1103963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mReturnIndex = mParams.size(); 1104963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mParams.push_back(def); 1105963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1106963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1107963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsKernelName = "test" + capitalize(mName); 1108963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsClassName = "Arguments"; 1109963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName = "Arguments"; 1110963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCheckMethodName = "check" + capitalize(mCleanName); 1111963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifyMethodName = "verifyResults" + capitalize(mCleanName); 1112963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1113963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1114963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsKernelName += capitalize(p.rsType); 1115963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsClassName += capitalize(p.rsBaseType); 1116963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName += capitalize(p.rsBaseType); 1117963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1") { 1118963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName += "N"; 1119963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1120963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCheckMethodName += capitalize(p.rsType); 1121963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifyMethodName += capitalize(p.rsType); 1122ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1123963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifierComputeMethodName = "compute" + capitalize(mCleanName); 1124ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams} 1125ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1126963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO Remove once we have long/double copyTo/copyFrom 1127963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Permutation::hasLongOrDoubleParameter() const { 1128963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1129963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1130963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.javaBaseType == "long" || p.javaBaseType == "double") { 1131963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 1132963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1133963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1134963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 1135963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1136ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1137963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 1138963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles) { 1139963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeHeaderSection(headerFile); 1140963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (hasLongOrDoubleParameter()) { 1141963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Warning: skipping a test for %s as we don't support long or double arguments (due " 1142963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "to Allocation not supporting them).\n", 1143963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mName.c_str()); 1144963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return; 1145963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1146ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1147963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mSpecification->relevantForVersion(versionOfTestFiles) && mTest != "none") { 1148963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeRsSection(rsFile); 1149963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaSection(javaFile); 1150963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1151963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1152135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1153963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeHeaderSection(ofstream& file) const { 1154963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int minVersion = mSpecification->getMinVersion(); 1155963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int maxVersion = mSpecification->getMaxVersion(); 1156963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool hasVersion = minVersion || maxVersion; 1157963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1158963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (hasVersion) { 1159963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (maxVersion) { 1160963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#if (defined(RS_VERSION) && (RS_VERSION >= " << minVersion 1161963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ") && (RS_VERSION <= " << maxVersion << "))\n"; 1162135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1163963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#if (defined(RS_VERSION) && (RS_VERSION >= " << minVersion << "))\n"; 1164135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1165135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1166135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1167963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "/*\n"; 1168963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t ct = 0; ct < mComment.size(); ct++) { 1169963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mComment[ct].empty()) { 1170963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * " << mComment[ct] << "\n"; 1171135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1172963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " *\n"; 1173135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1174135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1175963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " *\n"; 1176963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (minVersion || maxVersion) { 1177963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (maxVersion) { 1178963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * Suppored by API versions " << minVersion << " - " << maxVersion << "\n"; 1179135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1180963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * Supported by API versions " << minVersion << " and newer.\n"; 1181963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1182963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1183963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " */\n"; 1184963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mInline.size() > 0) { 1185963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "static "; 1186963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1187963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "extern "; 1188963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1189963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1190963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mReturnIndex]->rsType; 1191963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1192963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "void"; 1193963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1194963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " __attribute__(("; 1195963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount <= 1) { 1196963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "const, "; 1197963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1198963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "overloadable))"; 1199963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mName; 1200963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "("; 1201963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1202963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1203963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex) { 120446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1205963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1206963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ", "; 1207963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 120846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << p.rsType; 120946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (p.isOutParameter) { 121046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << "*"; 121146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 121246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!p.specName.empty()) { 121346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << " " << p.specName; 121446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 1215963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1216963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1217963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1218963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mInline.size() > 0) { 1219963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ") {\n"; 1220963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t ct = 0; ct < mInline.size(); ct++) { 1221963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " " << mInline[ct].c_str() << "\n"; 1222135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1223963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "}\n"; 1224963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1225963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ");\n"; 1226963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1227963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (hasVersion) { 1228963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#endif\n"; 1229135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1230963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "\n"; 1231963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1232135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1233963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Write the section of the .rs file for this permutation. 1234963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1235963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We communicate the extra input and output parameters via global allocations. 1236963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * For example, if we have a function that takes three arguments, two for input 1237963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * and one for output: 1238963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1239963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * start: 1240963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * name: gamn 1241963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * ret: float3 1242963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: float3 a 1243963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: int b 1244963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: float3 *c 1245963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * end: 1246963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1247963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We'll produce: 1248963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1249963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rs_allocation gAllocInB; 1250963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rs_allocation gAllocOutC; 1251963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1252963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float3 __attribute__((kernel)) test_gamn_float3_int_float3(float3 inA, unsigned int x) { 1253963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * int inB; 1254963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float3 outC; 1255963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float2 out; 1256963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * inB = rsGetElementAt_int(gAllocInB, x); 1257963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * out = gamn(a, in_b, &outC); 1258963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rsSetElementAt_float4(gAllocOutC, &outC, x); 1259963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * return out; 1260963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * } 1261963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1262963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We avoid re-using x and y from the definition because these have reserved 1263963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * meanings in a .rs file. 1264963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 1265963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeRsSection(ofstream& rs) const { 1266963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the allocation declarations we'll need. 1267963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1268963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1269963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Don't need allocation for one input and one return value. 1270963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex && i != mFirstInputIndex) { 1271963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->writeRsAllocationDefinition(p); 1272963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1273963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1274963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "\n"; 1275135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1276963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the function header. 1277963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1278963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mParams[mReturnIndex]->rsType; 1279ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } else { 1280963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "void"; 1281ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1282963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " __attribute__((kernel)) " << mRsKernelName; 1283963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "("; 1284963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1285963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mFirstInputIndex >= 0) { 1286963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mParams[mFirstInputIndex]->rsType << " " << mParams[mFirstInputIndex]->variableName; 1287963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1288135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1289963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1 || mInputCount > 1) { 1290963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1291963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ", "; 1292963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1293963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "unsigned int x"; 1294ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1295963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ") {\n"; 1296963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1297963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the local variable declarations and initializations. 1298963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1299963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i == mFirstInputIndex || i == mReturnIndex) { 1300963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 1301963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1302963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1303963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << p.rsType << " " << p.variableName; 1304963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1305963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " = 0;\n"; 1306963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1307963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " = rsGetElementAt_" << p.rsType << "(" << p.rsAllocName << ", x);\n"; 1308963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1309963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1310963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1311963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the function call. 1312963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1313963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1) { 1314963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << mParams[mReturnIndex]->rsType << " " 1315963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << mParams[mReturnIndex]->variableName << " = "; 1316963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1317963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "return "; 1318963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1319963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1320963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mName << "("; 1321963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = false; 1322963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1323963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1324963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i == mReturnIndex) { 1325963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 1326963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1327963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1328963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ", "; 1329963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1330963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1331963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "&"; 1332963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1333963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << p.variableName; 1334963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1335135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1336963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ");\n"; 1337135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1338963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1) { 1339963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write setting the extra out parameters into the allocations. 1340963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1341963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1342963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter && i != mReturnIndex) { 1343963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "rsSetElementAt_" << p.rsType << "(" << p.rsAllocName << ", "; 1344963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (passByAddressToSet(p.variableName)) { 1345963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "&"; 1346963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1347963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << p.variableName << ", x);\n"; 1348963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1349963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1350963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1351963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "return " << mParams[mReturnIndex]->variableName << ";\n"; 1352ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1353ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1354963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "}\n"; 1355963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1356963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1357963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Permutation::passByAddressToSet(const string& name) const { 1358963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s = name; 1359963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = s.size() - 1; 1360963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = s[last]; 1361963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return lastChar >= '0' && lastChar <= '9'; 1362963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1363135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1364963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaSection(ofstream& file) const { 1365963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // By default, we test the results using item by item comparison. 1366bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (mTest == "scalar" || mTest == "limited") { 1367963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArgumentClass(file, true); 1368963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, true); 1369963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyScalarMethod(file); 1370963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (mTest == "vector") { 1371963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArgumentClass(file, false); 1372963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, true); 1373963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyVectorMethod(file); 1374963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (mTest == "noverify") { 1375963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, false); 1376135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1377135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1378963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Register the check method to be called. This code will be written at the end. 1379963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->addJavaCheckCall(mJavaCheckMethodName + "();"); 1380135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1381135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1382963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaArgumentClass(ofstream& file, bool scalar) const { 1383963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string name; 1384963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (scalar) { 1385963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet name = mJavaArgumentsClassName; 1386963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1387963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet name = mJavaArgumentsNClassName; 1388963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1389963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s; 1390963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(1) + "public class " + name + " {\n"; 1391963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1392963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1393bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet s += tab(2) + "public "; 1394bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (p.isOutParameter && p.javaBaseType == "float") { 1395bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet s += "Floaty"; 1396bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 1397bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet s += p.javaBaseType; 1398bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1399963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!scalar && p.mVectorSize != "1") { 1400963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "[]"; 1401963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1402963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += " " + p.variableName + ";\n"; 1403963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1404963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(1) + "}\n\n"; 1405963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1406963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->writeJavaArgumentClassDefinition(name, s); 1407963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1408135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1409963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaCheckMethod(ofstream& file, bool generateCallToVerify) const { 1410963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "private void " << mJavaCheckMethodName << "() {\n"; 1411963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Generate the input allocations and initialization. 1412963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1413963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1414963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 141546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet writeJavaInputAllocationDefinition(file, tab(2), p); 141646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 141746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 141846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Enforce ordering if needed. 141946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 142046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 142146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!p.isOutParameter && !p.smallerParameter.empty()) { 142246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string smallerAlloc = "in" + capitalize(p.smallerParameter); 142346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(2) << "enforceOrdering(" << smallerAlloc << ", " << p.javaAllocName 142446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet << ");\n"; 1425135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1426963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1427963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCallToRs(file, false, generateCallToVerify); 1428963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCallToRs(file, true, generateCallToVerify); 1429963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1430963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1431963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1432963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaInputAllocationDefinition(ofstream& file, const string& indent, 143346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const { 1434963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string dataType; 1435963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char vectorSize; 143646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet convertToRsType(param.rsType, &dataType, &vectorSize); 1437bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1438bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string seed = hashString(mJavaCheckMethodName + param.javaAllocName); 1439bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << indent << "Allocation " << param.javaAllocName << " = "; 1440bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (param.compatibleTypeIndex >= 0) { 1441bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (TYPES[param.typeIndex].kind == FLOATING_POINT) { 1442bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaRandomCompatibleFloatAllocation(file, dataType, seed, vectorSize, 1443bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet TYPES[param.compatibleTypeIndex], 1444bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet TYPES[param.typeIndex]); 1445bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 1446bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaRandomCompatibleIntegerAllocation(file, dataType, seed, vectorSize, 1447bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet TYPES[param.compatibleTypeIndex], 1448bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet TYPES[param.typeIndex]); 1449bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1450bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else if (!param.minValue.empty()) { 1451bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (TYPES[param.typeIndex].kind != FLOATING_POINT) { 1452bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet printf("range(,) is only supported for floating point\n"); 1453bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 1454bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "createRandomFloatAllocation(mRS, Element.DataType." << dataType << ", " 1455bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << vectorSize << ", " << seed << ", " << param.minValue << ", " << param.maxValue 1456bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << ")"; 1457bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1458bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 1459bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "createRandomAllocation(mRS, Element.DataType." << dataType << ", " << vectorSize 1460bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << ", " << seed << ", false)"; // TODO set to false only for native 1461bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1462bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << ";\n"; 1463bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet} 1464bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1465bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletvoid Permutation::writeJavaRandomCompatibleFloatAllocation(ofstream& file, const string& dataType, 1466bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& seed, char vectorSize, 1467bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& compatibleType, 1468bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& generatedType) const { 1469bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "createRandomFloatAllocation" 1470bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << "(mRS, Element.DataType." << dataType << ", " << vectorSize << ", " << seed << ", "; 1471bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << scientific << std::setprecision(10); 1472bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet switch (compatibleType.kind) { 1473bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet case FLOATING_POINT: { 1474bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet // We're generating floating point values. We just have to worry about the 1475bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet // exponent. Subtract 1 for the sign. 1476bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet int bits = min(compatibleType.significantBits, generatedType.significantBits) - 1; 1477bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet double maxValue = ldexp(0.95, (1 << bits) - 1); 1478bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << -maxValue << ", " << maxValue; 1479bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet break; 1480bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1481bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet case UNSIGNED_INTEGER: 1482bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "0, " << ldexp(1, compatibleType.significantBits); 1483bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet break; 1484bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet case SIGNED_INTEGER: { 1485bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet double max = ldexp(1, compatibleType.significantBits); 1486bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << -max << ", " << (max - 1); 1487bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet break; 1488bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1489bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1490bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file.unsetf(ios_base::floatfield); 1491bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << ")"; 1492bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet} 1493bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1494bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletvoid Permutation::writeJavaRandomCompatibleIntegerAllocation(ofstream& file, const string& dataType, 1495bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& seed, char vectorSize, 1496bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& compatibleType, 1497bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& generatedType) const { 1498bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "createRandomIntegerAllocation" 1499bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << "(mRS, Element.DataType." << dataType << ", " << vectorSize << ", " << seed << ", "; 1500bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1501bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (compatibleType.kind == FLOATING_POINT) { 1502bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet // Currently, all floating points can take any number we generate. 1503bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet bool isSigned = generatedType.kind == SIGNED_INTEGER; 1504bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << (isSigned ? "true" : "false") << ", " << generatedType.significantBits; 150546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 1506bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet bool isSigned = 1507bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet compatibleType.kind == SIGNED_INTEGER && generatedType.kind == SIGNED_INTEGER; 1508bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << (isSigned ? "true" : "false") << ", " 1509bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << min(compatibleType.significantBits, generatedType.significantBits); 151046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 1511bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << ")"; 1512963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1513963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1514963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaOutputAllocationDefinition(ofstream& file, const string& indent, 151546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const { 1516963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string dataType; 1517963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char vectorSize; 151846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet convertToRsType(param.rsType, &dataType, &vectorSize); 151946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << indent << "Allocation " << param.javaAllocName << " = Allocation.createSized(mRS, " 152046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet << "getElement(mRS, Element.DataType." << dataType << ", " << vectorSize 1521963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "), INPUTSIZE);\n"; 1522963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1523963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1524963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Converts float2 to FLOAT_32 and 2, etc. 1525963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::convertToRsType(const string& name, string* dataType, char* vectorSize) const { 1526963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s = name; 1527963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = s.size() - 1; 1528963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = s[last]; 1529963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (lastChar >= '1' && lastChar <= '4') { 1530963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(last); 1531963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *vectorSize = lastChar; 1532963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1533963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *vectorSize = '1'; 1534963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1535963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet dataType->clear(); 1536963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 1537963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s == TYPES[i].cType) { 1538963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *dataType = TYPES[i].rsDataType; 1539963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet break; 1540135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1541963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1542963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1543963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1544963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVerifyScalarMethod(ofstream& file) const { 1545963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyFunctionHeader(file); 1546963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string vectorSize = "1"; 1547963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1548963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1549963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArrayInitialization(file, p); 1550963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1" && p.mVectorSize != vectorSize) { 1551963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (vectorSize == "1") { 1552963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorSize = p.mVectorSize; 1553963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1554963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Yikes, had vector %s and %s\n", vectorSize.c_str(), p.mVectorSize.c_str()); 1555135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1556135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1557963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1558963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1559963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "for (int i = 0; i < INPUTSIZE; i++) {\n"; 1560963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "for (int j = 0; j < " << vectorSize << " ; j++) {\n"; 1561963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1562963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "// Extract the inputs.\n"; 1563963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << mJavaArgumentsClassName << " args = new " << mJavaArgumentsClassName 1564963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "();\n"; 1565963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1566963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1567963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 1568963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "args." << p.variableName << " = " << p.javaArrayName << "[i"; 1569963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.vectorWidth != "1") { 1570963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * " << p.vectorWidth << " + j"; 1571135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1572963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "];\n"; 1573135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1574135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1575963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1576963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "// Figure out what the outputs should have been.\n"; 1577bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(4) << "Floaty.setRelaxed(relaxed);\n"; 1578963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "CoreMathVerifier." << mJavaVerifierComputeMethodName << "(args);\n"; 1579963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1580963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "// Figure out what the outputs should have been.\n"; 1581963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "boolean valid = true;\n"; 1582963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1583963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1584963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1585bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaTestAndSetValid(file, 4, p, "", "[i * " + p.vectorWidth + " + j]"); 1586963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1587963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1588963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1589963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "if (!valid) {\n"; 1590963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(5) << "StringBuilder message = new StringBuilder();\n"; 1591963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1592963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1593963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1594bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaAppendOutputToMessage(file, 5, p, "", "[i * " + p.vectorWidth + " + j]"); 1595963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1596963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendInputToMessage(file, 5, p.rsBaseType, p.variableName, 1597963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "args." + p.variableName); 1598963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1599963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1600963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 160146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(5) << "assertTrue(\"Incorrect output for " << mJavaCheckMethodName << "\" +\n"; 160246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(7) << "(relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), valid);\n"; 1603963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "}\n"; 1604963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1605963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1606963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1607135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1608135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1609963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVerifyFunctionHeader(ofstream& file) const { 1610963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "private void " << mJavaVerifyMethodName << "("; 1611963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1612963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1613963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "Allocation " << p.javaAllocName << ", "; 1614963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1615963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "boolean relaxed) {\n"; 1616963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1617135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1618bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletvoid Permutation::writeJavaTestAndSetValid(ofstream& file, int indent, const ParameterDefinition& p, 1619bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& argsIndex, 1620bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& actualIndex) const { 1621bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaTestOneValue(file, indent, p, argsIndex, actualIndex); 1622bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent + 1) << "valid = false;\n"; 1623bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "}\n"; 1624bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet} 1625bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1626bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletvoid Permutation::writeJavaTestOneValue(ofstream& file, int indent, const ParameterDefinition& p, 1627bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& argsIndex, const string& actualIndex) const { 1628bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "if ("; 1629bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (p.rsBaseType[0] == 'f') { 1630bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "!args." << p.variableName << argsIndex << ".couldBe(" << p.javaArrayName 1631bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << actualIndex; 1632bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (!mPrecisionLimit.empty()) { 1633bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << ", " << mPrecisionLimit; 1634bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1635bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << ")"; 1636963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1637bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "args." << p.variableName << argsIndex << " != " << p.javaArrayName << actualIndex; 1638bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1639bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (p.undefinedIfOutIsNan && mReturnIndex >= 0) { 1640bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << " && args." << mParams[mReturnIndex]->variableName << argsIndex << ".isNaN()"; 1641963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1642bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << ") {\n"; 1643963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1644135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1645963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendOutputToMessage(ofstream& file, int indent, 1646bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const ParameterDefinition& p, 1647bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& argsIndex, 1648bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& actualIndex) const { 1649bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string expected = "args." + p.variableName + argsIndex; 1650bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string actual = p.javaArrayName + actualIndex; 1651bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "message.append(\"Expected output " + p.variableName + ": \");\n"; 1652bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (p.rsBaseType[0] == 'f') { 1653bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaAppendFloatyVariableToMessage(file, indent, expected); 1654963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1655bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, p.rsBaseType, expected); 1656963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1657963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 1658bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "message.append(\"Actual output " + p.variableName + ": \");\n"; 1659bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, p.rsBaseType, actual); 1660bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1661bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaTestOneValue(file, indent, p, argsIndex, actualIndex); 1662bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent + 1) << "message.append(\" FAIL\");\n"; 1663bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "}\n"; 1664bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 1665963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1666135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1667963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendInputToMessage(ofstream& file, int indent, 1668963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& rsBaseType, const string& name, 1669963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const { 1670bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "message.append(\"Input " + name + ": \");\n"; 1671bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, rsBaseType, actual); 1672963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 1673963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1674963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1675963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendNewLineToMessage(ofstream& file, int indent) const { 1676963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "message.append(\"\\n\");\n"; 1677963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1678963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1679963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVariableToMessage(ofstream& file, int indent, 1680bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& rsBaseType, 1681963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& value) const { 1682963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (rsBaseType[0] == 'f') { 1683bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "message.append(String.format(\"%14.8g %8x %15a\",\n"; 168446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(indent + 2) << value << ", " 1685bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << "Float.floatToRawIntBits(" << value << "), " << value << "));\n"; 1686963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (rsBaseType[0] == 'u') { 1687bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "message.append(String.format(\"0x%x\", " << value << "));\n"; 1688963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1689bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "message.append(String.format(\"%d\", " << value << "));\n"; 1690135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1691bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet} 1692bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1693bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletvoid Permutation::writeJavaAppendFloatyVariableToMessage(ofstream& file, int indent, 1694bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& value) const { 1695bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "message.append(" << value << ".toString());\n"; 1696963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1697135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1698963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVectorComparison(ofstream& file, int indent, 1699963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1700963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1701bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaTestAndSetValid(file, indent, p, "", "[i]"); 1702963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1703963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1704963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1705bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaTestAndSetValid(file, indent + 1, p, "[j]", "[i * " + p.vectorWidth + " + j]"); 1706963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1707963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1708963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1709963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1710963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVectorInputToMessage(ofstream& file, int indent, 1711963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1712963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1713963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendInputToMessage(file, indent, p.rsBaseType, p.variableName, 1714963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i]"); 1715963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1716963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1717963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendInputToMessage(file, indent + 1, p.rsBaseType, p.variableName, 1718963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1719963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1720963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1721963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1722963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1723963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVectorOutputToMessage(ofstream& file, int indent, 1724963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1725963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1726bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaAppendOutputToMessage(file, indent, p, "", "[i]"); 1727963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1728963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1729963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1730bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaAppendOutputToMessage(file, indent + 1, p, "[j]", 1731bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet "[i * " + p.vectorWidth + " + j]"); 1732963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1733963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1734963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1735963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1736963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVerifyVectorMethod(ofstream& file) const { 1737963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyFunctionHeader(file); 1738963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1739963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1740963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArrayInitialization(file, p); 1741963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1742963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) + "for (int i = 0; i < INPUTSIZE; i++) {\n"; 1743963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << mJavaArgumentsNClassName << " args = new " << mJavaArgumentsNClassName 1744963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "();\n"; 1745963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1746963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Create the appropriate sized arrays in args\n"; 1747963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1748963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1749963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1") { 1750bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string type = p.javaBaseType; 1751bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (p.isOutParameter && type == "float") { 1752bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet type = "Floaty"; 1753bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1754bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(3) << "args." << p.variableName << " = new " << type << "[" << p.mVectorSize 1755bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << "];\n"; 1756963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1757963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1758963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1759963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Fill args with the input values\n"; 1760963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1761963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1762963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 1763963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1764963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "args." << p.variableName << " = " << p.javaArrayName + "[i]" 1765963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ";\n"; 1766963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1767963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1768963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "args." << p.variableName + "[j] = " 1769963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << p.javaArrayName + "[i * " + p.vectorWidth + " + j]" 1770963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ";\n"; 1771963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1772963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1773963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1774963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1775bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(3) << "Floaty.setRelaxed(relaxed);\n"; 1776963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "CoreMathVerifier." << mJavaVerifierComputeMethodName << "(args);\n\n"; 1777963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1778963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Compare the expected outputs to the actual values returned by RS.\n"; 1779963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "boolean valid = true;\n"; 1780963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1781963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1782963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1783963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVectorComparison(file, 3, p); 1784963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1785963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1786963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1787963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "if (!valid) {\n"; 1788963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "StringBuilder message = new StringBuilder();\n"; 1789963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1790963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1791963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1792963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVectorOutputToMessage(file, 4, p); 1793135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1794963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVectorInputToMessage(file, 4, p); 1795135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1796135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1797135c4b747bce5898d98de964d7c453d215254d0dJason Sams 179846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(4) << "assertTrue(\"Incorrect output for " << mJavaCheckMethodName << "\" +\n"; 179946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(6) << "(relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), valid);\n"; 1800963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1801963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1802963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1803963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1804963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1805963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaCallToRs(ofstream& file, bool relaxed, bool generateCallToVerify) const { 1806963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string script = "script"; 1807963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (relaxed) { 1808963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet script += "Relaxed"; 1809135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1810135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1811963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "try {\n"; 1812963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1813963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1814963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 181546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet writeJavaOutputAllocationDefinition(file, tab(3), p); 1816963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1817135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1818135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1819963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1820963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1821963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex && i != mFirstInputIndex) { 1822963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << script << ".set_" << p.rsAllocName << "(" << p.javaAllocName 1823963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ");\n"; 1824963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1825963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1826135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1827963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << script << ".forEach_" << mRsKernelName << "("; 1828963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1829963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mFirstInputIndex >= 0) { 1830963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mFirstInputIndex]->javaAllocName; 1831963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1832963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1833963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1834963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1835963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ", "; 1836963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1837963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mReturnIndex]->variableName << ");\n"; 1838963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1839135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1840963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (generateCallToVerify) { 1841963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << mJavaVerifyMethodName << "("; 1842963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1843963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1844963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << p.variableName << ", "; 1845963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1846963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1847963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (relaxed) { 1848963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "true"; 1849963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1850963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "false"; 1851963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1852963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ");\n"; 1853963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1854963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "} catch (Exception e) {\n"; 1855963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "throw new RSRuntimeException(\"RenderScript. Can't invoke forEach_" 1856963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << mRsKernelName << ": \" + e.toString());\n"; 1857963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1858135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1859135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1860963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} // namespace 1861135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1862963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletint main(int argc, char* argv[]) { 1863963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles = 0; 1864963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> specFileNames; 1865963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!parseCommandLine(argc, argv, &versionOfTestFiles, &specFileNames)) { 1866963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Usage: gen_runtime spec_file [spec_file...] [-v version_of_test_files]\n"); 1867963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return -1; 1868963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1869963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int result = 0; 1870963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < specFileNames.size(); i++) { 1871963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet SpecFile specFile(specFileNames[i]); 1872963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!specFile.process(versionOfTestFiles)) { 1873963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result = -1; 1874963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1875963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1876963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return result; 1877963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1878