gen_runtime.cpp revision 93906648166535b090ac9a16c5365f4ddfd360fe
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" 9346ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet string specType; // The type found in the spec, e.g. "f16" 9446ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet bool isFloatType; // True if it's a floating point value 95963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 96963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The number of entries in the vector. It should be either "1", "2", "3", or "4". It's also 97963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * "1" for scalars. 98963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 99963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mVectorSize; 100963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The space the vector takes in an array. It's the same as the vector size, except for size 101963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * "3", where the width is "4". 102963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 103963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string vectorWidth; 104963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 10546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string specName; // e.g. x, as found in the spec file 106963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string variableName; // e.g. inX, used both in .rs and .java 107963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsAllocName; // e.g. gAllocInX 108963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string javaAllocName; // e.g. inX 109963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string javaArrayName; // e.g. arrayInX 110135c4b747bce5898d98de964d7c453d215254d0dJason Sams 11146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // If non empty, the mininum and maximum values to be used when generating the test data. 11246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string minValue; 11346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string maxValue; 11446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet /* If non empty, contains the name of another parameter that should be smaller or equal to this 11546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet * parameter, i.e. value(smallerParameter) <= value(this). This is used when testing clamp. 11646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet */ 11746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string smallerParameter; 11846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet 119bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet bool isOutParameter; // True if this parameter returns data from the script. 120bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet bool undefinedIfOutIsNan; // If true, we don't validate if 'out' is NaN. 121bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 122bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet int typeIndex; // Index in the TYPES array. 123bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet int compatibleTypeIndex; // Index in TYPES for which the test data must also fit. 124963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 125963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Parse the parameter definition found in the spec file. It will generate a name if none 126963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * are present in the file. One of the two counts will be incremented, and potentially 127963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * used to generate unique names. isReturn is true if we're processing the "return:" 128963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * definition. 129963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 130963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void parseParameterDefinition(string s, bool isReturn, int* inputCount, int* outputCount); 131963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 132963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 133963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// An entire spec file and the methods to process it. 134963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass SpecFile { 135135c4b747bce5898d98de964d7c453d215254d0dJason Samspublic: 136963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet explicit SpecFile(const string& specFileName) : mSpecFileName(specFileName) {} 137963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool process(int versionOfTestFiles); 138135c4b747bce5898d98de964d7c453d215254d0dJason Sams 139963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 140963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string mSpecFileName; 141963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The largest version number that we have found in all the specifications. 142963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mLargestVersionNumber; 143963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 144963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet map<string, Function*> mFunctionsMap; // All the known functions. 145963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet typedef map<string, Function*>::iterator FunctionsIterator; 146963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 147963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool readSpecFile(); 148963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* getFunction(const string& name); 149963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool generateFiles(int versionOfTestFiles); 150963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeAllFunctions(ofstream& headerFile, int versionOfTestFiles); 151963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 152963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 153963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Represents a function, like "clamp". Even though the spec file contains many entries for clamp, 154963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * we'll only have one clamp instance. 155963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 156963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Function { 157963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 158963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; // The lower case name, e.g. native_log 159963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCapitalizedName; // The capitalized name, e.g. NativeLog 160963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mTestName; // e.g. TestNativeLog 161963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mRelaxedTestName; // e.g. TestNativeLogRelaxed 162963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 163963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<Specification*> mSpecifications; 164963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet typedef vector<Specification*>::iterator SpecificationIterator; 165963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 166963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* We keep track of the allocations generated in the .rs file and the argument classes defined 167963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * in the Java file, as we share these between the functions created for each specification. 168963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 169963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set<string> mRsAllocationsGenerated; 170963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set<string> mJavaGeneratedArgumentClasses; 171963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 172963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaCallAllCheckMethods; // Lines of Java code to invoke the check methods. 173963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 174963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream mRsFile; // The Renderscript test file we're generating. 175963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream mJavaFile; // The Jave test file we're generating. 176963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 177963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool startRsFile(); // Open the mRsFile and writes its header. 178963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeRelaxedRsFile(); // Write the entire relaxed rs test file (an include essentially) 179963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool startJavaFile(); // Open the mJavaFile and writes the header. 180963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void finishJavaFile(); // Write the test method and closes the file. 181963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 182963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 183963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet explicit Function(const string& name); 184963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void addSpecification(Specification* spec) { mSpecifications.push_back(spec); } 185963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Write the .java and the two .rs test files. versionOfTestFiles is used to restrict which API 186963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * to test. Also writes the section of the header file. 187963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 188963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeFiles(ofstream& headerFile, int versionOfTestFiles); 189963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write an allocation and keep track of having it written, so it can be shared. 190963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeRsAllocationDefinition(const ParameterDefinition& param); 191963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write an argument class definiton and keep track of having it written, so it can be shared. 192963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaArgumentClassDefinition(const string& className, const string& definition); 193963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Add a call to mJavaCallAllCheckMethods to be used at the end of the file generation. 194963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void addJavaCheckCall(const string& call); 195963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 196963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 197963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Defines one of the many variations of the function. There's a one to one correspondance between 198963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * Specification objects and entries in the spec file. Some of the strings that are parts of a 199963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * Specification can include placeholders, which are "#1", "#2", "#3", and "#4". We'll replace 200963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * these by values before generating the files. 201963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 202963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Specification { 203963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 204963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The range of versions this specification applies to. 0 if there's no restriction, so an API 205963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * that became available at 9 and is still valid would have min:9 max:0. 206963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 207135c4b747bce5898d98de964d7c453d215254d0dJason Sams int mMinVersion; 208135c4b747bce5898d98de964d7c453d215254d0dJason Sams int mMaxVersion; 209135c4b747bce5898d98de964d7c453d215254d0dJason Sams 210963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The name of the function without #n, e.g. convert. As of this writing, it only differs for 211963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * convert. 212963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 213963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCleanName; 21493906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet /* How to test. One of: 21593906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet * "scalar": Generate test code that checks entries of each vector indepently. E.g. for 21693906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet * sin(float3), the test code will call the CoreMathVerfier.computeSin 3 times. 21793906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet * "vector": Generate test code that calls the CoreMathVerifier only once for each vector. 21893906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet * This is useful for APIs like dot() or length(). 21993906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet * "noverify": Generate test code that calls the API but don't verify the returned value. 22093906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet * "limited": Like "scalar" but tests a limited range of input values. 22193906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet * "custom": Like "scalar" but instead of calling CoreMathVerifier.computeXXX() to compute 22293906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet * the expected value, we call instead CoreMathVerifier.verifyXXX(). This method 22393906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet * returns a string that contains the error message, null if there's no error. 22493906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet */ 22593906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet string mTest; 226bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string mPrecisionLimit; // Maximum precision required when checking output of this function. 227963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 228135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<vector<string> > mReplaceables; 229963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 230963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The following fields may contain placeholders that will be replaced using the mReplaceables. 231963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 232963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The name of this function, can include #, e.g. convert_#1_#2 233963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; 234963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 235963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mReturn; // The return type 236963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mComment; // The comments to be included in the header 237963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mInline; // The inline code to be included in the header 238963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mParam; // One entry per parameter defined 239963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 240963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Substitute the placeholders in the strings by the corresponding entries in mReplaceables. 241963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string expandString(string s, int i1, int i2, int i3, int i4) const; 242963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void expandStringVector(const vector<string>& in, int i1, int i2, int i3, int i4, 243963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* out) const; 244963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 245963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 246963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification() { 247963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mMinVersion = 0; 248963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mMaxVersion = 0; 249963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 250963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int getMinVersion() const { return mMinVersion; } 251963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int getMaxVersion() const { return mMaxVersion; } 252963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 253963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getName(int i1, int i2, int i3, int i4) const { 254963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandString(mName, i1, i2, i3, i4); 255963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 256963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getReturn(int i1, int i2, int i3, int i4) const { 257963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandString(mReturn, i1, i2, i3, i4); 258963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 259963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getComments(int i1, int i2, int i3, int i4, vector<string>* comments) const { 260963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mComment, i1, i2, i3, i4, comments); 261963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 262963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getInlines(int i1, int i2, int i3, int i4, vector<string>* inlines) const { 263963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mInline, i1, i2, i3, i4, inlines); 264963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 265963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getParams(int i1, int i2, int i3, int i4, vector<string>* params) const { 266963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mParam, i1, i2, i3, i4, params); 267963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 268963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getTest() const { return mTest; } 269bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string getPrecisionLimit() const { return mPrecisionLimit; } 270963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getCleanName() const { return mCleanName; } 271963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 272963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, Function* function, 273963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles); 274963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeRelaxedRsFile() const; 275963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Return true if this specification should be generated for this version. 276963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool relevantForVersion(int versionOfTestFiles) const; 277963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 278963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet static Specification* scanSpecification(FILE* in); 279963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 280963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 281963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// A concrete version of a specification, where all placeholders have been replaced by actual 282963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// values. 283963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Permutation { 284963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 285963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* mFunction; 286963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* mSpecification; 287963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 288963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // These are the expanded version of those found on Specification 289963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; 290963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCleanName; 291bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string mTest; // How to test. One of "scalar", "vector", "noverify", "limited", and "none". 292bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string mPrecisionLimit; // Maximum precision required when checking output of this function. 293135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> mInline; 294963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mComment; 295963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 296963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The inputs and outputs of the function. This include the return type, if present. 297963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<ParameterDefinition*> mParams; 298963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The index of the return value in mParams, -1 if the function is void. 299963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mReturnIndex; 300963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The index of the first input value in mParams, -1 if there's no input. 301963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mFirstInputIndex; 302963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The number of input and output parameters. 303963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mInputCount; 304963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mOutputCount; 305135c4b747bce5898d98de964d7c453d215254d0dJason Sams 306963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mRsKernelName; 307963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaArgumentsClassName; 308963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaArgumentsNClassName; 309963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaVerifierComputeMethodName; 31093906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet string mJavaVerifierVerifyMethodName; 311963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaCheckMethodName; 312963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaVerifyMethodName; 313963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 314963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeHeaderSection(ofstream& file) const; 315963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 316963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeRsSection(ofstream& rs) const; 317963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 318963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaSection(ofstream& file) const; 319963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaArgumentClass(ofstream& file, bool scalar) const; 32093906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet void writeJavaCheckMethod(ofstream& file, bool generateCallToVerifier) const; 32193906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet void writeJavaVerifyScalarMethod(ofstream& file, bool verifierValidates) const; 322963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVerifyVectorMethod(ofstream& file) const; 323963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVerifyFunctionHeader(ofstream& file) const; 324963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaInputAllocationDefinition(ofstream& file, const string& indent, 32546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const; 326963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaOutputAllocationDefinition(ofstream& file, const string& indent, 32746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const; 328bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet // Write code to create a random allocation for which the data must be compatible for two types. 329bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaRandomCompatibleFloatAllocation(ofstream& file, const string& dataType, 330bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& seed, char vectorSize, 331bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& compatibleType, 332bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& generatedType) const; 333bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaRandomCompatibleIntegerAllocation(ofstream& file, const string& dataType, 334bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& seed, char vectorSize, 335bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& compatibleType, 336bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& generatedType) const; 33793906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet void writeJavaCallToRs(ofstream& file, bool relaxed, bool generateCallToVerifier) const; 338963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 339bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaTestAndSetValid(ofstream& file, int indent, const ParameterDefinition& p, 340bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& argsIndex, const string& actualIndex) const; 341bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaTestOneValue(ofstream& file, int indent, const ParameterDefinition& p, 342bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& argsIndex, const string& actualIndex) const; 343bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaAppendOutputToMessage(ofstream& file, int indent, const ParameterDefinition& p, 34493906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet const string& argsIndex, const string& actualIndex, 34593906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet bool verifierValidates) const; 34646ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet void writeJavaAppendInputToMessage(ofstream& file, int indent, const ParameterDefinition& p, 34746ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet const string& actual) const; 348963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendNewLineToMessage(ofstream& file, int indent) const; 34946ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet void writeJavaAppendVariableToMessage(ofstream& file, int indent, const ParameterDefinition& p, 350bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& value) const; 351bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet void writeJavaAppendFloatyVariableToMessage(ofstream& file, int indent, 352bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& value) const; 353963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVectorComparison(ofstream& file, int indent, const ParameterDefinition& p) const; 354963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendVectorInputToMessage(ofstream& file, int indent, 355963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const; 356963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendVectorOutputToMessage(ofstream& file, int indent, 357963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const; 358963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool passByAddressToSet(const string& name) const; 359963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void convertToRsType(const string& name, string* dataType, char* vectorSize) const; 360963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 361963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 362963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Permutation(Function* function, Specification* specification, int i1, int i2, int i3, int i4); 363963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 364963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles); 365135c4b747bce5898d98de964d7c453d215254d0dJason Sams}; 366135c4b747bce5898d98de964d7c453d215254d0dJason Sams 367963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Table of type equivalences 368963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO: We should just be pulling this from a shared header. Slang does exactly the same thing. 369bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 370bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletenum NumberKind { SIGNED_INTEGER, UNSIGNED_INTEGER, FLOATING_POINT }; 371bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 372963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstruct Type { 373963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char* specType; // Name found in the .spec file 374963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsDataType; // RS data type 375963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string cType; // Type in a C file 376963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char* javaType; // Type in a Java file 377bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet NumberKind kind; 378bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet /* For integers, number of bits of the number, excluding the sign bit. 37946ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet * For floats, number of implied bits of the mantissa. 380bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet */ 381bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet int significantBits; 38246ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet // For floats, number of bits of the exponent. 0 for integer types. 38346ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet int exponentBits; 384963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 385135c4b747bce5898d98de964d7c453d215254d0dJason Sams 38646ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouilletconst Type TYPES[] = {{"f16", "FLOAT_16", "half", "half", FLOATING_POINT, 11, 5}, 38746ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet {"f32", "FLOAT_32", "float", "float", FLOATING_POINT, 24, 8}, 38846ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet {"f64", "FLOAT_64", "double", "double", FLOATING_POINT, 53, 11}, 38946ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet {"i8", "SIGNED_8", "char", "byte", SIGNED_INTEGER, 7, 0}, 39046ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet {"u8", "UNSIGNED_8", "uchar", "byte", UNSIGNED_INTEGER, 8, 0}, 39146ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet {"i16", "SIGNED_16", "short", "short", SIGNED_INTEGER, 15, 0}, 39246ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet {"u16", "UNSIGNED_16", "ushort", "short", UNSIGNED_INTEGER, 16, 0}, 39346ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet {"i32", "SIGNED_32", "int", "int", SIGNED_INTEGER, 31, 0}, 39446ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet {"u32", "UNSIGNED_32", "uint", "int", UNSIGNED_INTEGER, 32, 0}, 39546ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet {"i64", "SIGNED_64", "long", "long", SIGNED_INTEGER, 63, 0}, 39646ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet {"u64", "UNSIGNED_64", "ulong", "long", UNSIGNED_INTEGER, 64, 0}}; 397963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 398963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst int NUM_TYPES = sizeof(TYPES) / sizeof(TYPES[0]); 399963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 400bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet// Returns the index in TYPES for the provided cType 401bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletint FindCType(const string& cType) { 402bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 403bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (cType == TYPES[i].cType) { 404bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet return i; 405bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 406bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 407bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet return -1; 408bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet} 409bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 410963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Capitalizes and removes underscores. E.g. converts "native_log" to NativeLog. 411963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring capitalize(const string& source) { 412963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int length = source.length(); 413963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string result; 414963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool capitalize = true; 415963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int s = 0; s < length; s++) { 416963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (source[s] == '_') { 417963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet capitalize = true; 418963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (capitalize) { 419963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result += toupper(source[s]); 420963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet capitalize = false; 421963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 422963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result += source[s]; 423963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 424963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 425963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return result; 426963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 427963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 428963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring tab(int n) { return string(n * 4, ' '); } 429963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 430bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet// Returns a string that's an hexadecimal constant fo the hash of the string. 431bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletstring hashString(const string& s) { 432963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet long hash = 0; 433963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < s.length(); i++) { 434963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet hash = hash * 43 + s[i]; 435963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 436bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet stringstream stream; 437bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet stream << "0x" << std::hex << hash << "l"; 438bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet return stream.str(); 439963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 440963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 44146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet// Removes the character from present. Returns true if the string contained the character. 44246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouilletstatic bool charRemoved(char c, string* s) { 44346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t p = s->find(c); 44446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (p != string::npos) { 44546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet s->erase(p, 1); 44646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet return true; 44746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 44846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet return false; 44946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet} 45046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet 451963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return true if the string is already in the set. Inserts it if not. 452963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool testAndSet(const string& flag, set<string>* set) { 453963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (set->find(flag) == set->end()) { 454963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set->insert(flag); 455963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 456135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 457135c4b747bce5898d98de964d7c453d215254d0dJason Sams return true; 458135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 459135c4b747bce5898d98de964d7c453d215254d0dJason Sams 460963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Convert an int into a string. 461963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring toString(int n) { 462963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char buf[100]; 463963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet snprintf(buf, sizeof(buf), "%d", n); 464963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return string(buf); 465963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 466963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 467963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid trim(string* s, size_t start) { 468135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (start > 0) { 469135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(0, start); 470135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 471135c4b747bce5898d98de964d7c453d215254d0dJason Sams 472135c4b747bce5898d98de964d7c453d215254d0dJason Sams while (s->size() && (s->at(0) == ' ')) { 473135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(0, 1); 474135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 475135c4b747bce5898d98de964d7c453d215254d0dJason Sams 476135c4b747bce5898d98de964d7c453d215254d0dJason Sams size_t p = s->find_first_of("\n\r"); 477135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (p != string::npos) { 478135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(p); 479135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 480135c4b747bce5898d98de964d7c453d215254d0dJason Sams 481963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while ((s->size() > 0) && (s->at(s->size() - 1) == ' ')) { 482963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->erase(s->size() - 1); 483963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 484963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 485963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 486963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring stringReplace(string s, string match, string rep) { 487963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 488963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t p = s.find(match); 489963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p == string::npos) break; 490963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 491963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(p, match.size()); 492963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.insert(p, rep); 493963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 494963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return s; 495963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 496963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 497963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return the next line from the input file. 498963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool getNextLine(FILE* in, string* s) { 499963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->clear(); 500963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 501963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int c = fgetc(in); 502963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (c == EOF) return s->size() != 0; 503963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (c == '\n') break; 504963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->push_back((char)c); 505963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 506963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 507963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 508963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 509963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid writeIfdef(ofstream& file, string filename, bool isStart) { 510963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string t = "__"; 511963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t += filename; 512963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t += "__"; 513963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 514963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 2; i < t.size(); i++) { 515963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (t[i] == '.') { 516963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t[i] = '_'; 517963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 518963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 519963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 520963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (isStart) { 521963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#ifndef " << t << "\n"; 522963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#define " << t << "\n"; 523963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 524963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#endif // " << t << "\n"; 525963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 526963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 527963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 528963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid writeJavaArrayInitialization(ofstream& file, const ParameterDefinition& p) { 529963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << p.javaBaseType << "[] " << p.javaArrayName << " = new " << p.javaBaseType 530963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "[INPUTSIZE * " << p.vectorWidth << "];\n"; 531963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << p.javaAllocName << ".copyTo(" << p.javaArrayName << ");\n"; 532963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 533963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 534963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool parseCommandLine(int argc, char* argv[], int* versionOfTestFiles, 535963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* specFileNames) { 536963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 1; i < argc; i++) { 537963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (argv[i][0] == '-') { 538963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (argv[i][1] == 'v') { 539963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet i++; 540963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i < argc) { 541963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char* end; 542963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *versionOfTestFiles = strtol(argv[i], &end, 10); 543963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (*end != '\0') { 544963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Can't parse the version number %s\n", argv[i]); 545963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 546963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 547963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 548963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Missing version number after -v\n"); 549963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 550963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 551963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 552963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Unrecognized flag %s\n", argv[i]); 553963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 554963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 555963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 556963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet specFileNames->push_back(argv[i]); 557963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 558963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 559963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specFileNames->size() == 0) { 560963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("No spec file specified\n"); 561963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 562963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 563963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 564963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 565963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 56646ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet/* Returns a double that should be able to be converted to an integer of size 56746ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet * numberOfIntegerBits. 56846ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet */ 56946ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouilletstatic double MaxDoubleForInteger(int numberOfIntegerBits, int mantissaSize) { 57046ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet /* Double has only 52 bits of precision (53 implied). So for longs, we want 57146ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet * to create smaller values to avoid a round up. Same for floats and halfs. 57246ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet */ 57346ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet int lowZeroBits = max(0, numberOfIntegerBits - mantissaSize); 57446ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet unsigned long l = (0xffffffffffffffff >> (64 - numberOfIntegerBits + lowZeroBits)) 57546ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet << lowZeroBits; 57646ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet return (double)l; 57746ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet} 57846ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet 579963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Parse a parameter definition. It's of the form "type [*][name]". The type 580963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * is required. The name is optional. The * indicates it's an output 581963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * parameter. We also pass the indexed of this parameter in the definition, so 582963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * we can create names like in2, in3, etc. */ 583963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid ParameterDefinition::parseParameterDefinition(string s, bool isReturn, int* inputCount, 584963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int* outputCount) { 58546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet istringstream stream(s); 58646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string name, type, option; 58746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet stream >> rsType; 58846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet stream >> specName; 58946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet stream >> option; 590963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 59146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Determine if this is an output. 59246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet isOutParameter = charRemoved('*', &rsType) || charRemoved('*', &specName) || isReturn; 593963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 59446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Extract the vector size out of the type. 595963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = rsType.size() - 1; 596963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = rsType[last]; 597963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (lastChar >= '0' && lastChar <= '9') { 598963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsBaseType = rsType.substr(0, last); 599963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mVectorSize = lastChar; 600963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 601963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsBaseType = rsType; 602963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mVectorSize = "1"; 603963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 604963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mVectorSize == "3") { 605963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorWidth = "4"; 606963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 607963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorWidth = mVectorSize; 608963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 609963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 610963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Create variable names to be used in the java and .rs files. Because x and 611963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * y are reserved in .rs files, we prefix variable names with "in" or "out". 612963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 613963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (isOutParameter) { 614963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName = "out"; 61546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!specName.empty()) { 61646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet variableName += capitalize(specName); 617963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (!isReturn) { 618963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName += toString(*outputCount); 619963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 620963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*outputCount)++; 621963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 622963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName = "in"; 62346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!specName.empty()) { 62446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet variableName += capitalize(specName); 625963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (*inputCount > 0) { 626963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName += toString(*inputCount); 627963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 628963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*inputCount)++; 629963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 630963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsAllocName = "gAlloc" + capitalize(variableName); 631963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet javaAllocName = variableName; 632963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet javaArrayName = "array" + capitalize(javaAllocName); 633963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 63446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Process the option. 635bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet undefinedIfOutIsNan = false; 636bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet compatibleTypeIndex = -1; 63746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!option.empty()) { 63846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (option.compare(0, 6, "range(") == 0) { 63946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t pComma = option.find(','); 64046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t pParen = option.find(')'); 64146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (pComma == string::npos || pParen == string::npos) { 64246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet printf("Incorrect range %s\n", option.c_str()); 64346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 64446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet minValue = option.substr(6, pComma - 6); 64546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet maxValue = option.substr(pComma + 1, pParen - pComma - 1); 64646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 64746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else if (option.compare(0, 6, "above(") == 0) { 64846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet size_t pParen = option.find(')'); 64946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (pParen == string::npos) { 65046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet printf("Incorrect option %s\n", option.c_str()); 65146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 65246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet smallerParameter = option.substr(6, pParen - 6); 65346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 654bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else if (option.compare(0, 11, "compatible(") == 0) { 655bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet size_t pParen = option.find(')'); 656bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (pParen == string::npos) { 657bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet printf("Incorrect option %s\n", option.c_str()); 658bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 659bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet compatibleTypeIndex = FindCType(option.substr(11, pParen - 11)); 660bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 661bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else if (option.compare(0, 11, "conditional") == 0) { 662bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet undefinedIfOutIsNan = true; 66346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 66446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet printf("Unrecognized option %s\n", option.c_str()); 66546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 66646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 66746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet 668bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet typeIndex = FindCType(rsBaseType); 66946ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet isFloatType = false; 670bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (typeIndex < 0) { 671bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet // TODO set a global flag when we encounter an error & abort 672bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet printf("Error, could not find %s\n", rsBaseType.c_str()); 673bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 674bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet javaBaseType = TYPES[typeIndex].javaType; 67546ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet specType = TYPES[typeIndex].specType; 67646ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet isFloatType = TYPES[typeIndex].exponentBits > 0; 677963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 678963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 679963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 680963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::process(int versionOfTestFiles) { 681963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!readSpecFile()) { 682963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 683963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 684963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (versionOfTestFiles == 0) { 685963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet versionOfTestFiles = mLargestVersionNumber; 686963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 687963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!generateFiles(versionOfTestFiles)) { 688963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 689963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 690963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("%s: %ld functions processed.\n", mSpecFileName.c_str(), mFunctionsMap.size()); 691963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 692963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 693963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 694963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Read the specification, adding the definitions to the global functions map. 695963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::readSpecFile() { 696963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FILE* specFile = fopen(mSpecFileName.c_str(), "rt"); 697963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!specFile) { 698963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening input file: %s\n", mSpecFileName.c_str()); 699963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 700963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 701963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 702963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = 0; 703963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 704963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* spec = Specification::scanSpecification(specFile); 705963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (spec == NULL) { 706963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet break; 707963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 708963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet getFunction(spec->getCleanName())->addSpecification(spec); 709963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int specMin = spec->getMinVersion(); 710963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int specMax = spec->getMaxVersion(); 711963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specMin && specMin > mLargestVersionNumber) { 712963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = specMin; 713963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 714963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specMax && specMax > mLargestVersionNumber) { 715963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = specMax; 716963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 717963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 718963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 719963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fclose(specFile); 720963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 721963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 722963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 723963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::generateFiles(int versionOfTestFiles) { 724963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("%s: Generating test files for version %d\n", mSpecFileName.c_str(), versionOfTestFiles); 725963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 726963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The header file name should have the same base but with a ".rsh" extension. 727963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string headerFileName = mSpecFileName; 728963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t l = headerFileName.length(); 729963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char SPEC[] = ".spec"; 730963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const int SPEC_SIZE = sizeof(SPEC) - 1; 731963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const int start = l - SPEC_SIZE; 732963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (start >= 0 && headerFileName.compare(start, SPEC_SIZE, SPEC) == 0) { 733963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFileName.erase(start); 734963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 735963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFileName += ".rsh"; 736963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 737963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the start of the header file. 738963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream headerFile; 739963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile.open(headerFileName.c_str(), ios::out | ios::trunc); 740963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!headerFile.is_open()) { 741963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening output file: %s\n", headerFileName.c_str()); 742963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 743963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 744963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile << LEGAL_NOTICE; 745963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile << AUTO_GENERATED_WARNING; 746963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeIfdef(headerFile, headerFileName, true); 747963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 748963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the functions to the header and test files. 749963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = writeAllFunctions(headerFile, versionOfTestFiles); 750963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 751963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Finish the header file. 752963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeIfdef(headerFile, headerFileName, false); 753963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile.close(); 754963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 755963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return success; 756963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 757963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 758963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return the named function from the map. Creates it if it's not there. 759963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletFunction* SpecFile::getFunction(const string& name) { 760963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FunctionsIterator iter = mFunctionsMap.find(name); 761963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (iter != mFunctionsMap.end()) { 762963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return iter->second; 763963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 764963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* f = new Function(name); 765963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunctionsMap[name] = f; 766963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return f; 767963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 768963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 769963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::writeAllFunctions(ofstream& headerFile, int versionOfTestFiles) { 770963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = true; 771963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (FunctionsIterator iter = mFunctionsMap.begin(); iter != mFunctionsMap.end(); iter++) { 772963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* func = iter->second; 773963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!func->writeFiles(headerFile, versionOfTestFiles)) { 774963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet success = false; 775963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 776963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 777963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return success; 778963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 779963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 780963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletFunction::Function(const string& name) { 781963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mName = name; 782963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mCapitalizedName = capitalize(mName); 783963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mTestName = "Test" + mCapitalizedName; 784963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRelaxedTestName = mTestName + "Relaxed"; 785963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 786963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 787963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::writeFiles(ofstream& headerFile, int versionOfTestFiles) { 788963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!startRsFile() || !startJavaFile() || !writeRelaxedRsFile()) { 789963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 790963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 791963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 792963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (SpecificationIterator i = mSpecifications.begin(); i < mSpecifications.end(); i++) { 793963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*i)->writeFiles(headerFile, mRsFile, mJavaFile, this, versionOfTestFiles); 794963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 795963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 796963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet finishJavaFile(); 797963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // There's no work to wrap-up in the .rs file. 798963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 799963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile.close(); 800963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile.close(); 801963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 802963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 803963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 804963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::startRsFile() { 805963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string fileName = mTestName + ".rs"; 806963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile.open(fileName.c_str(), ios::out | ios::trunc); 807963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mRsFile.is_open()) { 808963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", fileName.c_str()); 809963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 810963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 811963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << LEGAL_NOTICE; 812963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "#pragma version(1)\n"; 813963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "#pragma rs java_package_name(android.renderscript.cts)\n\n"; 814963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << AUTO_GENERATED_WARNING; 815963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 816963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 817963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 818963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Write an allocation definition if not already emitted in the .rs file. 819963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::writeRsAllocationDefinition(const ParameterDefinition& param) { 820963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!testAndSet(param.rsAllocName, &mRsAllocationsGenerated)) { 821963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "rs_allocation " << param.rsAllocName << ";\n"; 822963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 823963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 824963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 825963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Write the entire *Relaxed.rs test file, as it only depends on the name. 826963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::writeRelaxedRsFile() { 827963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string name = mRelaxedTestName + ".rs"; 828963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FILE* file = fopen(name.c_str(), "wt"); 829963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!file) { 830963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", name.c_str()); 831963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 832963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 833963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fputs(LEGAL_NOTICE, file); 834963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s; 835963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "#include \"" + mTestName + ".rs\"\n"; 836963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "#pragma rs_fp_relaxed\n"; 837963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += AUTO_GENERATED_WARNING; 838963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fputs(s.c_str(), file); 839963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fclose(file); 840963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 841963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 842963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 843963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::startJavaFile() { 844963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string fileName = mTestName + ".java"; 845963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile.open(fileName.c_str(), ios::out | ios::trunc); 846963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mJavaFile.is_open()) { 847963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", fileName.c_str()); 848963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 849963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 850963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << LEGAL_NOTICE; 851963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << AUTO_GENERATED_WARNING; 852963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "package android.renderscript.cts;\n\n"; 853963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 854963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.Allocation;\n"; 855963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.RSRuntimeException;\n"; 856963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.Element;\n\n"; 857963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 858963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "public class " << mTestName << " extends RSBaseCompute {\n\n"; 859963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 860963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "private ScriptC_" << mTestName << " script;\n"; 861963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "private ScriptC_" << mRelaxedTestName << " scriptRelaxed;\n\n"; 862963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 863963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "@Override\n"; 864963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "protected void setUp() throws Exception {\n"; 865963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "super.setUp();\n"; 866963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "script = new ScriptC_" << mTestName << "(mRS);\n"; 867963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "scriptRelaxed = new ScriptC_" << mRelaxedTestName << "(mRS);\n"; 868963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "}\n\n"; 869963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 870963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 871963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 872963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::writeJavaArgumentClassDefinition(const string& className, const string& definition) { 873963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!testAndSet(className, &mJavaGeneratedArgumentClasses)) { 874963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << definition; 875963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 876963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 877963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 878963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::addJavaCheckCall(const string& call) { 879963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCallAllCheckMethods += tab(2) + call + "\n"; 880963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 881963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 882963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::finishJavaFile() { 883963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "public void test" << mCapitalizedName << "() {\n"; 884963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << mJavaCallAllCheckMethods; 885963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "}\n"; 886963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "}\n"; 887963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 888963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 889963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Specification::expandStringVector(const vector<string>& in, int i1, int i2, int i3, int i4, 890963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* out) const { 891963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet out->clear(); 892963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (vector<string>::const_iterator iter = in.begin(); iter != in.end(); iter++) { 893963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet out->push_back(expandString(*iter, i1, i2, i3, i4)); 894135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 895135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 896135c4b747bce5898d98de964d7c453d215254d0dJason Sams 897963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletSpecification* Specification::scanSpecification(FILE* in) { 898963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* spec = new Specification(); 899963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mTest = "scalar"; // default 900135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool modeComment = false; 901135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool modeInline = false; 902963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = true; 903135c4b747bce5898d98de964d7c453d215254d0dJason Sams 904135c4b747bce5898d98de964d7c453d215254d0dJason Sams while (1) { 905135c4b747bce5898d98de964d7c453d215254d0dJason Sams string s; 906135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool ret = getNextLine(in, &s); 907135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!ret) break; 908135c4b747bce5898d98de964d7c453d215254d0dJason Sams 909135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (modeComment) { 910135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!s.size() || (s[0] == ' ')) { 911135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 0); 912963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mComment.push_back(s); 913135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 914135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 915135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeComment = false; 916135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 917135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 918135c4b747bce5898d98de964d7c453d215254d0dJason Sams 919135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (modeInline) { 920135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!s.size() || (s[0] == ' ')) { 921135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 0); 922963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mInline.push_back(s); 923135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 924135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 925135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeInline = false; 926135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 927135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 928135c4b747bce5898d98de964d7c453d215254d0dJason Sams 929135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s[0] == '#') { 930135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 931135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 932135c4b747bce5898d98de964d7c453d215254d0dJason Sams 933135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 5, "name:") == 0) { 934135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 5); 935963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mName = s; 936963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Some functions like convert have # part of the name. Truncate at that point. 937963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t p = s.find('#'); 938963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p != string::npos) { 939963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p > 0 && s[p - 1] == '_') { 940963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p--; 941963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 942963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(p); 943963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 944963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mCleanName = s; 945135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 946135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 947135c4b747bce5898d98de964d7c453d215254d0dJason Sams 948135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "arg:") == 0) { 949135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 4); 950963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mParam.push_back(s); 951135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 952135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 953135c4b747bce5898d98de964d7c453d215254d0dJason Sams 954135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "ret:") == 0) { 955135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 4); 956963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReturn = s; 957963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 958963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 959963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 960963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s.compare(0, 5, "test:") == 0) { 961963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet trim(&s, 5); 96293906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet if (s == "scalar" || s == "vector" || s == "noverify" || s == "custom" || s == "none") { 963963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mTest = s; 964bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else if (s.compare(0, 7, "limited") == 0) { 965bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet spec->mTest = "limited"; 966bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (s.compare(7, 1, "(") == 0) { 967bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet size_t pParen = s.find(')'); 968bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (pParen == string::npos) { 969bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet printf("Incorrect test %s\n", s.c_str()); 970bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 971bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet spec->mPrecisionLimit = s.substr(8, pParen - 8); 972bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 973bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 974963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 975bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet printf("Error: Unrecognized test option: %s\n", s.c_str()); 976963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet success = false; 977963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 978135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 979135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 980135c4b747bce5898d98de964d7c453d215254d0dJason Sams 981135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "end:") == 0) { 982963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (success) { 983963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return spec; 984963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 985963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet delete spec; 986963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return NULL; 987963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 988135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 989135c4b747bce5898d98de964d7c453d215254d0dJason Sams 990135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "comment:") == 0) { 991135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeComment = true; 992135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 993135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 994135c4b747bce5898d98de964d7c453d215254d0dJason Sams 995135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 7, "inline:") == 0) { 996135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeInline = true; 997135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 998135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 999135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1000135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "version:") == 0) { 1001135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 8); 1002963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet sscanf(s.c_str(), "%i %i", &spec->mMinVersion, &spec->mMaxVersion); 1003135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 1004135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1005135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1006135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "start:") == 0) { 1007135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 1008135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1009135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1010135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 2, "w:") == 0) { 1011135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> t; 1012135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("1") != string::npos) { 1013135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back(""); 1014135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1015135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("2") != string::npos) { 1016135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("2"); 1017135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1018135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("3") != string::npos) { 1019135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("3"); 1020135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1021135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("4") != string::npos) { 1022135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("4"); 1023135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1024963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReplaceables.push_back(t); 1025135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 1026135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1027135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1028135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 2, "t:") == 0) { 1029135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> t; 1030963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 1031963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s.find(TYPES[i].specType) != string::npos) { 1032963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t.push_back(TYPES[i].cType); 1033963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1034135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1035963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReplaceables.push_back(t); 1036135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 1037135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1038135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1039135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.size() == 0) { 1040135c4b747bce5898d98de964d7c453d215254d0dJason Sams // eat empty line 1041135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 1042135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1043135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1044135c4b747bce5898d98de964d7c453d215254d0dJason Sams printf("Error, line:\n"); 1045135c4b747bce5898d98de964d7c453d215254d0dJason Sams printf(" %s\n", s.c_str()); 1046135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1047135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1048963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet delete spec; 1049135c4b747bce5898d98de964d7c453d215254d0dJason Sams return NULL; 1050135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1051135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1052963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Specification::writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 1053963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* function, int versionOfTestFiles) { 1054963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int start[4]; 1055963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int end[4]; 1056963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < 4; i++) { 1057963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i < (int)mReplaceables.size()) { 1058963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet start[i] = 0; 1059963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet end[i] = mReplaceables[i].size(); 1060963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1061963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet start[i] = -1; 1062963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet end[i] = 0; 1063963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1064963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1065963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i4 = start[3]; i4 < end[3]; i4++) { 1066963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i3 = start[2]; i3 < end[2]; i3++) { 1067963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i2 = start[1]; i2 < end[1]; i2++) { 1068963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i1 = start[0]; i1 < end[0]; i1++) { 1069963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Permutation p(function, this, i1, i2, i3, i4); 1070963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.writeFiles(headerFile, rsFile, javaFile, versionOfTestFiles); 1071963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1072963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1073963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1074963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1075963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1076135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1077963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Specification::relevantForVersion(int versionOfTestFiles) const { 1078963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mMinVersion != 0 && mMinVersion > versionOfTestFiles) { 1079963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 1080135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1081963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mMaxVersion != 0 && mMaxVersion < versionOfTestFiles) { 1082963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 1083963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1084963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 1085135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1086135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1087963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring Specification::expandString(string s, int i1, int i2, int i3, int i4) const { 1088963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 0) { 1089963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#1", mReplaceables[0][i1]); 1090135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1091963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 1) { 1092963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#2", mReplaceables[1][i2]); 1093135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1094963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 2) { 1095963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#3", mReplaceables[2][i3]); 1096135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1097963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 3) { 1098963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#4", mReplaceables[3][i4]); 1099135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1100135c4b747bce5898d98de964d7c453d215254d0dJason Sams return s; 1101135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1102135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1103963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletPermutation::Permutation(Function* func, Specification* spec, int i1, int i2, int i3, int i4) 1104963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet : mFunction(func), 1105963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mSpecification(spec), 1106963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mReturnIndex(-1), 1107963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFirstInputIndex(-1), 1108963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mInputCount(0), 1109963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mOutputCount(0) { 1110963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // We expand the strings now to make capitalization easier. The previous code preserved the #n 1111963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // markers just before emitting, which made capitalization difficult. 1112963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mName = spec->getName(i1, i2, i3, i4); 1113963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mCleanName = spec->getCleanName(); 1114963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mTest = spec->getTest(); 1115bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet mPrecisionLimit = spec->getPrecisionLimit(); 1116963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getInlines(i1, i2, i3, i4, &mInline); 1117963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getComments(i1, i2, i3, i4, &mComment); 1118ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1119963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> paramDefinitions; 1120963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getParams(i1, i2, i3, i4, ¶mDefinitions); 1121963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < paramDefinitions.size(); i++) { 1122963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ParameterDefinition* def = new ParameterDefinition(); 1123963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet def->parseParameterDefinition(paramDefinitions[i], false, &mInputCount, &mOutputCount); 1124963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!def->isOutParameter && mFirstInputIndex < 0) { 1125963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFirstInputIndex = mParams.size(); 1126ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1127963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mParams.push_back(def); 1128ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1129ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1130963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string s = spec->getReturn(i1, i2, i3, i4); 1131963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!s.empty() && s != "void") { 1132963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ParameterDefinition* def = new ParameterDefinition(); 1133963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Adding "*" tells the parse method it's an output. 1134963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet def->parseParameterDefinition(s, true, &mInputCount, &mOutputCount); 1135963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mReturnIndex = mParams.size(); 1136963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mParams.push_back(def); 1137963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1138963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1139963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsKernelName = "test" + capitalize(mName); 1140963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsClassName = "Arguments"; 1141963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName = "Arguments"; 1142963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCheckMethodName = "check" + capitalize(mCleanName); 1143963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifyMethodName = "verifyResults" + capitalize(mCleanName); 1144963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1145963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1146963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsKernelName += capitalize(p.rsType); 1147963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsClassName += capitalize(p.rsBaseType); 1148963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName += capitalize(p.rsBaseType); 1149963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1") { 1150963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName += "N"; 1151963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1152963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCheckMethodName += capitalize(p.rsType); 1153963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifyMethodName += capitalize(p.rsType); 1154ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1155963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifierComputeMethodName = "compute" + capitalize(mCleanName); 115693906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet mJavaVerifierVerifyMethodName = "verify" + capitalize(mCleanName); 1157ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams} 1158ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1159963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 1160963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles) { 1161963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeHeaderSection(headerFile); 1162963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mSpecification->relevantForVersion(versionOfTestFiles) && mTest != "none") { 1163963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeRsSection(rsFile); 1164963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaSection(javaFile); 1165963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1166963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1167135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1168963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeHeaderSection(ofstream& file) const { 1169963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int minVersion = mSpecification->getMinVersion(); 1170963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int maxVersion = mSpecification->getMaxVersion(); 1171963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool hasVersion = minVersion || maxVersion; 1172963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1173963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (hasVersion) { 1174963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (maxVersion) { 1175963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#if (defined(RS_VERSION) && (RS_VERSION >= " << minVersion 1176963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ") && (RS_VERSION <= " << maxVersion << "))\n"; 1177135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1178963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#if (defined(RS_VERSION) && (RS_VERSION >= " << minVersion << "))\n"; 1179135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1180135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1181135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1182963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "/*\n"; 1183963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t ct = 0; ct < mComment.size(); ct++) { 1184963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mComment[ct].empty()) { 1185963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * " << mComment[ct] << "\n"; 1186135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1187963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " *\n"; 1188135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1189135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1190963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " *\n"; 1191963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (minVersion || maxVersion) { 1192963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (maxVersion) { 1193963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * Suppored by API versions " << minVersion << " - " << maxVersion << "\n"; 1194135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1195963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * Supported by API versions " << minVersion << " and newer.\n"; 1196963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1197963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1198963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " */\n"; 1199963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mInline.size() > 0) { 1200963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "static "; 1201963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1202963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "extern "; 1203963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1204963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1205963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mReturnIndex]->rsType; 1206963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1207963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "void"; 1208963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1209963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " __attribute__(("; 1210963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount <= 1) { 1211963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "const, "; 1212963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1213963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "overloadable))"; 1214963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mName; 1215963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "("; 1216963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1217963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1218963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex) { 121946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1220963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1221963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ", "; 1222963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 122346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << p.rsType; 122446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (p.isOutParameter) { 122546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << "*"; 122646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 122746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!p.specName.empty()) { 122846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << " " << p.specName; 122946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 1230963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1231963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1232963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1233963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mInline.size() > 0) { 1234963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ") {\n"; 1235963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t ct = 0; ct < mInline.size(); ct++) { 1236963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " " << mInline[ct].c_str() << "\n"; 1237135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1238963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "}\n"; 1239963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1240963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ");\n"; 1241963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1242963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (hasVersion) { 1243963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#endif\n"; 1244135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1245963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "\n"; 1246963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1247135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1248963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Write the section of the .rs file for this permutation. 1249963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1250963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We communicate the extra input and output parameters via global allocations. 1251963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * For example, if we have a function that takes three arguments, two for input 1252963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * and one for output: 1253963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1254963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * start: 1255963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * name: gamn 1256963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * ret: float3 1257963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: float3 a 1258963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: int b 1259963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: float3 *c 1260963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * end: 1261963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1262963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We'll produce: 1263963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1264963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rs_allocation gAllocInB; 1265963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rs_allocation gAllocOutC; 1266963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1267963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float3 __attribute__((kernel)) test_gamn_float3_int_float3(float3 inA, unsigned int x) { 1268963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * int inB; 1269963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float3 outC; 1270963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float2 out; 1271963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * inB = rsGetElementAt_int(gAllocInB, x); 1272963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * out = gamn(a, in_b, &outC); 1273963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rsSetElementAt_float4(gAllocOutC, &outC, x); 1274963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * return out; 1275963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * } 1276963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1277963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We avoid re-using x and y from the definition because these have reserved 1278963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * meanings in a .rs file. 1279963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 1280963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeRsSection(ofstream& rs) const { 1281963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the allocation declarations we'll need. 1282963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1283963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1284963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Don't need allocation for one input and one return value. 1285963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex && i != mFirstInputIndex) { 1286963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->writeRsAllocationDefinition(p); 1287963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1288963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1289963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "\n"; 1290135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1291963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the function header. 1292963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1293963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mParams[mReturnIndex]->rsType; 1294ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } else { 1295963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "void"; 1296ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1297963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " __attribute__((kernel)) " << mRsKernelName; 1298963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "("; 1299963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1300963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mFirstInputIndex >= 0) { 1301963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mParams[mFirstInputIndex]->rsType << " " << mParams[mFirstInputIndex]->variableName; 1302963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1303135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1304963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1 || mInputCount > 1) { 1305963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1306963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ", "; 1307963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1308963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "unsigned int x"; 1309ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1310963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ") {\n"; 1311963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1312963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the local variable declarations and initializations. 1313963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1314963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i == mFirstInputIndex || i == mReturnIndex) { 1315963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 1316963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1317963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1318963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << p.rsType << " " << p.variableName; 1319963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1320963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " = 0;\n"; 1321963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1322963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " = rsGetElementAt_" << p.rsType << "(" << p.rsAllocName << ", x);\n"; 1323963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1324963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1325963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1326963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the function call. 1327963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1328963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1) { 1329963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << mParams[mReturnIndex]->rsType << " " 1330963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << mParams[mReturnIndex]->variableName << " = "; 1331963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1332963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "return "; 1333963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1334963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1335963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mName << "("; 1336963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = false; 1337963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1338963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1339963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i == mReturnIndex) { 1340963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 1341963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1342963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1343963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ", "; 1344963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1345963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1346963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "&"; 1347963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1348963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << p.variableName; 1349963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1350135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1351963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ");\n"; 1352135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1353963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1) { 1354963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write setting the extra out parameters into the allocations. 1355963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1356963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1357963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter && i != mReturnIndex) { 1358963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "rsSetElementAt_" << p.rsType << "(" << p.rsAllocName << ", "; 1359963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (passByAddressToSet(p.variableName)) { 1360963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "&"; 1361963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1362963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << p.variableName << ", x);\n"; 1363963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1364963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1365963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1366963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "return " << mParams[mReturnIndex]->variableName << ";\n"; 1367ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1368ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1369963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "}\n"; 1370963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1371963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1372963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Permutation::passByAddressToSet(const string& name) const { 1373963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s = name; 1374963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = s.size() - 1; 1375963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = s[last]; 1376963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return lastChar >= '0' && lastChar <= '9'; 1377963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1378135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1379963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaSection(ofstream& file) const { 1380963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // By default, we test the results using item by item comparison. 1381bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (mTest == "scalar" || mTest == "limited") { 1382963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArgumentClass(file, true); 1383963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, true); 138493906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaVerifyScalarMethod(file, false); 138593906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet } else if (mTest == "custom") { 138693906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaArgumentClass(file, true); 138793906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaCheckMethod(file, true); 138893906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaVerifyScalarMethod(file, true); 1389963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (mTest == "vector") { 1390963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArgumentClass(file, false); 1391963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, true); 1392963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyVectorMethod(file); 1393963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (mTest == "noverify") { 1394963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, false); 1395135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1396135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1397963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Register the check method to be called. This code will be written at the end. 1398963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->addJavaCheckCall(mJavaCheckMethodName + "();"); 1399135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1400135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1401963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaArgumentClass(ofstream& file, bool scalar) const { 1402963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string name; 1403963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (scalar) { 1404963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet name = mJavaArgumentsClassName; 1405963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1406963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet name = mJavaArgumentsNClassName; 1407963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1408963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s; 1409963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(1) + "public class " + name + " {\n"; 1410963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1411963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1412bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet s += tab(2) + "public "; 141346ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet if (p.isOutParameter && p.isFloatType) { 1414bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet s += "Floaty"; 1415bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 1416bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet s += p.javaBaseType; 1417bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1418963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!scalar && p.mVectorSize != "1") { 1419963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "[]"; 1420963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1421963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += " " + p.variableName + ";\n"; 1422963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1423963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(1) + "}\n\n"; 1424963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1425963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->writeJavaArgumentClassDefinition(name, s); 1426963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1427135c4b747bce5898d98de964d7c453d215254d0dJason Sams 142893906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouilletvoid Permutation::writeJavaCheckMethod(ofstream& file, bool generateCallToVerifier) const { 1429963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "private void " << mJavaCheckMethodName << "() {\n"; 1430963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Generate the input allocations and initialization. 1431963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1432963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1433963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 143446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet writeJavaInputAllocationDefinition(file, tab(2), p); 143546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 143646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 143746341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet // Enforce ordering if needed. 143846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 143946341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 144046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet if (!p.isOutParameter && !p.smallerParameter.empty()) { 144146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet string smallerAlloc = "in" + capitalize(p.smallerParameter); 144246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(2) << "enforceOrdering(" << smallerAlloc << ", " << p.javaAllocName 144346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet << ");\n"; 1444135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1445963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 144693906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaCallToRs(file, false, generateCallToVerifier); 144793906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaCallToRs(file, true, generateCallToVerifier); 1448963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1449963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1450963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1451963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaInputAllocationDefinition(ofstream& file, const string& indent, 145246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const { 1453963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string dataType; 1454963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char vectorSize; 145546341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet convertToRsType(param.rsType, &dataType, &vectorSize); 1456bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1457bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string seed = hashString(mJavaCheckMethodName + param.javaAllocName); 1458bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << indent << "Allocation " << param.javaAllocName << " = "; 1459bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (param.compatibleTypeIndex >= 0) { 1460bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (TYPES[param.typeIndex].kind == FLOATING_POINT) { 1461bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaRandomCompatibleFloatAllocation(file, dataType, seed, vectorSize, 1462bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet TYPES[param.compatibleTypeIndex], 1463bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet TYPES[param.typeIndex]); 1464bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 1465bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaRandomCompatibleIntegerAllocation(file, dataType, seed, vectorSize, 1466bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet TYPES[param.compatibleTypeIndex], 1467bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet TYPES[param.typeIndex]); 1468bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1469bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else if (!param.minValue.empty()) { 1470bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (TYPES[param.typeIndex].kind != FLOATING_POINT) { 1471bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet printf("range(,) is only supported for floating point\n"); 1472bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 1473bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "createRandomFloatAllocation(mRS, Element.DataType." << dataType << ", " 1474bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << vectorSize << ", " << seed << ", " << param.minValue << ", " << param.maxValue 1475bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << ")"; 1476bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1477bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } else { 1478bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "createRandomAllocation(mRS, Element.DataType." << dataType << ", " << vectorSize 1479bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << ", " << seed << ", false)"; // TODO set to false only for native 1480bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1481bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << ";\n"; 1482bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet} 1483bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1484bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletvoid Permutation::writeJavaRandomCompatibleFloatAllocation(ofstream& file, const string& dataType, 1485bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& seed, char vectorSize, 1486bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& compatibleType, 1487bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& generatedType) const { 1488bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "createRandomFloatAllocation" 1489bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << "(mRS, Element.DataType." << dataType << ", " << vectorSize << ", " << seed << ", "; 14902f281cf74e4d1cdfc4749d1e88252ec8dcf051f3Jean-Luc Brouillet double minValue = 0.0; 14912f281cf74e4d1cdfc4749d1e88252ec8dcf051f3Jean-Luc Brouillet double maxValue = 0.0; 1492bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet switch (compatibleType.kind) { 1493bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet case FLOATING_POINT: { 149446ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet // We're generating floating point values. We just worry about the exponent. 149546ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet // Subtract 1 for the exponent sign. 149646ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet int bits = min(compatibleType.exponentBits, generatedType.exponentBits) - 1; 14972f281cf74e4d1cdfc4749d1e88252ec8dcf051f3Jean-Luc Brouillet maxValue = ldexp(0.95, (1 << bits) - 1); 14982f281cf74e4d1cdfc4749d1e88252ec8dcf051f3Jean-Luc Brouillet minValue = -maxValue; 1499bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet break; 1500bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1501bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet case UNSIGNED_INTEGER: 150246ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet maxValue = MaxDoubleForInteger(compatibleType.significantBits, 150346ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet generatedType.significantBits); 15042f281cf74e4d1cdfc4749d1e88252ec8dcf051f3Jean-Luc Brouillet minValue = 0.0; 1505bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet break; 15062f281cf74e4d1cdfc4749d1e88252ec8dcf051f3Jean-Luc Brouillet case SIGNED_INTEGER: 150746ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet maxValue = MaxDoubleForInteger(compatibleType.significantBits, 150846ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet generatedType.significantBits); 150946ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet minValue = -maxValue - 1.0; 1510bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet break; 1511bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 151246ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet file << scientific << std::setprecision(19); 15132f281cf74e4d1cdfc4749d1e88252ec8dcf051f3Jean-Luc Brouillet file << minValue << ", " << maxValue << ")"; 1514bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file.unsetf(ios_base::floatfield); 1515bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet} 1516bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1517bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletvoid Permutation::writeJavaRandomCompatibleIntegerAllocation(ofstream& file, const string& dataType, 1518bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& seed, char vectorSize, 1519bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& compatibleType, 1520bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const Type& generatedType) const { 1521bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "createRandomIntegerAllocation" 1522bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << "(mRS, Element.DataType." << dataType << ", " << vectorSize << ", " << seed << ", "; 1523bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1524bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (compatibleType.kind == FLOATING_POINT) { 1525bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet // Currently, all floating points can take any number we generate. 1526bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet bool isSigned = generatedType.kind == SIGNED_INTEGER; 1527bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << (isSigned ? "true" : "false") << ", " << generatedType.significantBits; 152846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } else { 1529bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet bool isSigned = 1530bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet compatibleType.kind == SIGNED_INTEGER && generatedType.kind == SIGNED_INTEGER; 1531bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << (isSigned ? "true" : "false") << ", " 1532bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << min(compatibleType.significantBits, generatedType.significantBits); 153346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet } 1534bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << ")"; 1535963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1536963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1537963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaOutputAllocationDefinition(ofstream& file, const string& indent, 153846341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet const ParameterDefinition& param) const { 1539963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string dataType; 1540963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char vectorSize; 154146341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet convertToRsType(param.rsType, &dataType, &vectorSize); 154246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << indent << "Allocation " << param.javaAllocName << " = Allocation.createSized(mRS, " 154346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet << "getElement(mRS, Element.DataType." << dataType << ", " << vectorSize 1544963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "), INPUTSIZE);\n"; 1545963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1546963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1547963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Converts float2 to FLOAT_32 and 2, etc. 1548963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::convertToRsType(const string& name, string* dataType, char* vectorSize) const { 1549963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s = name; 1550963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = s.size() - 1; 1551963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = s[last]; 1552963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (lastChar >= '1' && lastChar <= '4') { 1553963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(last); 1554963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *vectorSize = lastChar; 1555963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1556963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *vectorSize = '1'; 1557963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1558963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet dataType->clear(); 1559963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 1560963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s == TYPES[i].cType) { 1561963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *dataType = TYPES[i].rsDataType; 1562963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet break; 1563135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1564963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1565963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1566963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 156793906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouilletvoid Permutation::writeJavaVerifyScalarMethod(ofstream& file, bool verifierValidates) const { 1568963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyFunctionHeader(file); 1569963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string vectorSize = "1"; 1570963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1571963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1572963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArrayInitialization(file, p); 1573963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1" && p.mVectorSize != vectorSize) { 1574963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (vectorSize == "1") { 1575963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorSize = p.mVectorSize; 1576963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1577963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Yikes, had vector %s and %s\n", vectorSize.c_str(), p.mVectorSize.c_str()); 1578135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1579135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1580963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1581963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1582963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "for (int i = 0; i < INPUTSIZE; i++) {\n"; 1583963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "for (int j = 0; j < " << vectorSize << " ; j++) {\n"; 1584963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1585963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "// Extract the inputs.\n"; 1586963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << mJavaArgumentsClassName << " args = new " << mJavaArgumentsClassName 1587963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "();\n"; 1588963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1589963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1590963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 1591963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "args." << p.variableName << " = " << p.javaArrayName << "[i"; 1592963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.vectorWidth != "1") { 1593963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * " << p.vectorWidth << " + j"; 1594135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1595963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "];\n"; 1596135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1597135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1598963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 159993906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet if (verifierValidates) { 160093906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(4) << "// Extract the outputs.\n"; 160193906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 160293906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 160393906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet if (p.isOutParameter) { 160493906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(4) << "args." << p.variableName << " = " << p.javaArrayName 160593906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet << "[i * " + p.vectorWidth + " + j];\n"; 160693906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet } 160793906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet } 160893906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(4) << "// Ask the CoreMathVerifier to validate.\n"; 160993906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(4) << "Floaty.setRelaxed(relaxed);\n"; 161093906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(4) << "String errorMessage = CoreMathVerifier." << mJavaVerifierVerifyMethodName 161193906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet << "(args, relaxed);\n"; 161293906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(4) << "boolean valid = errorMessage == null;\n"; 161393906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet } else { 161493906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(4) << "// Figure out what the outputs should have been.\n"; 161593906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(4) << "Floaty.setRelaxed(relaxed);\n"; 161693906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(4) << "CoreMathVerifier." << mJavaVerifierComputeMethodName << "(args);\n"; 161793906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(4) << "// Validate the outputs.\n"; 161893906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(4) << "boolean valid = true;\n"; 161993906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 162093906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 162193906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet if (p.isOutParameter) { 162293906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaTestAndSetValid(file, 4, p, "", "[i * " + p.vectorWidth + " + j]"); 162393906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet } 1624963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1625963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1626963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1627963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "if (!valid) {\n"; 1628963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(5) << "StringBuilder message = new StringBuilder();\n"; 1629963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1630963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1631963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 163293906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaAppendOutputToMessage(file, 5, p, "", "[i * " + p.vectorWidth + " + j]", 163393906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet verifierValidates); 1634963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 163546ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet writeJavaAppendInputToMessage(file, 5, p, "args." + p.variableName); 1636963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1637963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 163893906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet if (verifierValidates) { 163993906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(5) << "message.append(errorMessage);\n"; 164093906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet } 1641963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 164246341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(5) << "assertTrue(\"Incorrect output for " << mJavaCheckMethodName << "\" +\n"; 164346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(7) << "(relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), valid);\n"; 1644963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "}\n"; 1645963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1646963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1647963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1648135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1649135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1650963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVerifyFunctionHeader(ofstream& file) const { 1651963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "private void " << mJavaVerifyMethodName << "("; 1652963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1653963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1654963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "Allocation " << p.javaAllocName << ", "; 1655963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1656963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "boolean relaxed) {\n"; 1657963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1658135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1659bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletvoid Permutation::writeJavaTestAndSetValid(ofstream& file, int indent, const ParameterDefinition& p, 1660bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& argsIndex, 1661bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& actualIndex) const { 1662bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaTestOneValue(file, indent, p, argsIndex, actualIndex); 1663bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent + 1) << "valid = false;\n"; 1664bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "}\n"; 1665bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet} 1666bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1667bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletvoid Permutation::writeJavaTestOneValue(ofstream& file, int indent, const ParameterDefinition& p, 1668bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& argsIndex, const string& actualIndex) const { 1669bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "if ("; 167046ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet if (p.isFloatType) { 1671bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "!args." << p.variableName << argsIndex << ".couldBe(" << p.javaArrayName 1672bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << actualIndex; 1673bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (!mPrecisionLimit.empty()) { 1674bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << ", " << mPrecisionLimit; 1675bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1676bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << ")"; 1677963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1678bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << "args." << p.variableName << argsIndex << " != " << p.javaArrayName << actualIndex; 1679bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1680bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet if (p.undefinedIfOutIsNan && mReturnIndex >= 0) { 1681bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << " && args." << mParams[mReturnIndex]->variableName << argsIndex << ".isNaN()"; 1682963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1683bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << ") {\n"; 1684963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1685135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1686963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendOutputToMessage(ofstream& file, int indent, 1687bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const ParameterDefinition& p, 168893906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet const string& argsIndex, const string& actualIndex, 168993906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet bool verifierValidates) const { 169093906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet if (verifierValidates) { 169193906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet const string actual = "args." + p.variableName + argsIndex; 169293906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(indent) << "message.append(\"Output " + p.variableName + ": \");\n"; 169393906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet if (p.isFloatType) { 169493906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaAppendFloatyVariableToMessage(file, indent, actual); 169593906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet } else { 169693906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, p, actual); 169793906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet } 169893906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 1699963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 170093906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet const string expected = "args." + p.variableName + argsIndex; 170193906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet const string actual = p.javaArrayName + actualIndex; 170293906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(indent) << "message.append(\"Expected output " + p.variableName + ": \");\n"; 170393906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet if (p.isFloatType) { 170493906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaAppendFloatyVariableToMessage(file, indent, expected); 170593906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet } else { 170693906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, p, expected); 170793906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet } 170893906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 170993906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(indent) << "message.append(\"Actual output " + p.variableName + ": \");\n"; 171093906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, p, actual); 1711bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 171293906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaTestOneValue(file, indent, p, argsIndex, actualIndex); 171393906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(indent + 1) << "message.append(\" FAIL\");\n"; 171493906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet file << tab(indent) << "}\n"; 171593906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 171693906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet } 1717963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1718135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1719963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendInputToMessage(ofstream& file, int indent, 172046ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet const ParameterDefinition& p, 1721963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const { 172246ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet file << tab(indent) << "message.append(\"Input " + p.variableName + ": \");\n"; 172346ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, p, actual); 1724963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 1725963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1726963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1727963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendNewLineToMessage(ofstream& file, int indent) const { 1728963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "message.append(\"\\n\");\n"; 1729963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1730963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1731963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVariableToMessage(ofstream& file, int indent, 173246ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet const ParameterDefinition& p, 1733963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& value) const { 173446ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet if (p.specType == "f16" || p.specType == "f32") { 1735bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "message.append(String.format(\"%14.8g %8x %15a\",\n"; 173646341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(indent + 2) << value << ", " 1737bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << "Float.floatToRawIntBits(" << value << "), " << value << "));\n"; 173846ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet } else if (p.specType == "f64") { 173946ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet file << tab(indent) << "message.append(String.format(\"%24.8g %16x %31a\",\n"; 174046ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet file << tab(indent + 2) << value << ", " 174146ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet << "Double.doubleToRawLongBits(" << value << "), " << value << "));\n"; 174246ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet } else if (p.specType[0] == 'u') { 1743bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "message.append(String.format(\"0x%x\", " << value << "));\n"; 1744963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1745bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "message.append(String.format(\"%d\", " << value << "));\n"; 1746135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1747bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet} 1748bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet 1749bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouilletvoid Permutation::writeJavaAppendFloatyVariableToMessage(ofstream& file, int indent, 1750bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet const string& value) const { 1751bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(indent) << "message.append(" << value << ".toString());\n"; 1752963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1753135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1754963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVectorComparison(ofstream& file, int indent, 1755963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1756963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1757bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaTestAndSetValid(file, indent, p, "", "[i]"); 1758963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1759963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1760963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1761bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaTestAndSetValid(file, indent + 1, p, "[j]", "[i * " + p.vectorWidth + " + j]"); 1762963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1763963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1764963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1765963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1766963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVectorInputToMessage(ofstream& file, int indent, 1767963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1768963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 176946ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet writeJavaAppendInputToMessage(file, indent, p, p.javaArrayName + "[i]"); 1770963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1771963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 177246ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet writeJavaAppendInputToMessage(file, indent + 1, p, 1773963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1774963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1775963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1776963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1777963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1778963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVectorOutputToMessage(ofstream& file, int indent, 1779963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1780963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 178193906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet writeJavaAppendOutputToMessage(file, indent, p, "", "[i]", false); 1782963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1783963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1784963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1785bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet writeJavaAppendOutputToMessage(file, indent + 1, p, "[j]", 178693906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet "[i * " + p.vectorWidth + " + j]", false); 1787963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1788963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1789963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1790963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1791963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVerifyVectorMethod(ofstream& file) const { 1792963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyFunctionHeader(file); 1793963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1794963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1795963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArrayInitialization(file, p); 1796963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1797963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) + "for (int i = 0; i < INPUTSIZE; i++) {\n"; 1798963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << mJavaArgumentsNClassName << " args = new " << mJavaArgumentsNClassName 1799963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "();\n"; 1800963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1801963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Create the appropriate sized arrays in args\n"; 1802963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1803963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1804963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1") { 1805bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet string type = p.javaBaseType; 180646ebc97e1ba04766f23296574ebde52102fbd4beJean-Luc Brouillet if (p.isOutParameter && p.isFloatType) { 1807bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet type = "Floaty"; 1808bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet } 1809bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(3) << "args." << p.variableName << " = new " << type << "[" << p.mVectorSize 1810bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet << "];\n"; 1811963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1812963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1813963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1814963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Fill args with the input values\n"; 1815963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1816963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1817963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 1818963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1819963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "args." << p.variableName << " = " << p.javaArrayName + "[i]" 1820963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ";\n"; 1821963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1822963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1823963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "args." << p.variableName + "[j] = " 1824963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << p.javaArrayName + "[i * " + p.vectorWidth + " + j]" 1825963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ";\n"; 1826963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1827963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1828963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1829963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1830bcd5b9af756d10317faf54fa3742f89dfacef152Jean-Luc Brouillet file << tab(3) << "Floaty.setRelaxed(relaxed);\n"; 1831963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "CoreMathVerifier." << mJavaVerifierComputeMethodName << "(args);\n\n"; 1832963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1833963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Compare the expected outputs to the actual values returned by RS.\n"; 1834963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "boolean valid = true;\n"; 1835963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1836963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1837963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1838963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVectorComparison(file, 3, p); 1839963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1840963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1841963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1842963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "if (!valid) {\n"; 1843963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "StringBuilder message = new StringBuilder();\n"; 1844963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1845963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1846963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1847963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVectorOutputToMessage(file, 4, p); 1848135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1849963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVectorInputToMessage(file, 4, p); 1850135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1851135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1852135c4b747bce5898d98de964d7c453d215254d0dJason Sams 185346341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(4) << "assertTrue(\"Incorrect output for " << mJavaCheckMethodName << "\" +\n"; 185446341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet file << tab(6) << "(relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), valid);\n"; 1855963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1856963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1857963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1858963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1859963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 186093906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouilletvoid Permutation::writeJavaCallToRs(ofstream& file, bool relaxed, bool generateCallToVerifier) const { 1861963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string script = "script"; 1862963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (relaxed) { 1863963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet script += "Relaxed"; 1864135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1865135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1866963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "try {\n"; 1867963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1868963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1869963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 187046341434b4a766d9dee33a93469564a1de8b0793Jean-Luc Brouillet writeJavaOutputAllocationDefinition(file, tab(3), p); 1871963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1872135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1873135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1874963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1875963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1876963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex && i != mFirstInputIndex) { 1877963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << script << ".set_" << p.rsAllocName << "(" << p.javaAllocName 1878963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ");\n"; 1879963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1880963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1881135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1882963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << script << ".forEach_" << mRsKernelName << "("; 1883963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1884963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mFirstInputIndex >= 0) { 1885963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mFirstInputIndex]->javaAllocName; 1886963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1887963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1888963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1889963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1890963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ", "; 1891963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1892963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mReturnIndex]->variableName << ");\n"; 1893963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1894135c4b747bce5898d98de964d7c453d215254d0dJason Sams 189593906648166535b090ac9a16c5365f4ddfd360feJean-Luc Brouillet if (generateCallToVerifier) { 1896963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << mJavaVerifyMethodName << "("; 1897963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1898963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1899963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << p.variableName << ", "; 1900963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1901963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1902963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (relaxed) { 1903963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "true"; 1904963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1905963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "false"; 1906963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1907963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ");\n"; 1908963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1909963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "} catch (Exception e) {\n"; 1910963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "throw new RSRuntimeException(\"RenderScript. Can't invoke forEach_" 1911963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << mRsKernelName << ": \" + e.toString());\n"; 1912963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1913135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1914135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1915963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} // namespace 1916135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1917963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletint main(int argc, char* argv[]) { 1918963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles = 0; 1919963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> specFileNames; 1920963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!parseCommandLine(argc, argv, &versionOfTestFiles, &specFileNames)) { 1921963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Usage: gen_runtime spec_file [spec_file...] [-v version_of_test_files]\n"); 1922963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return -1; 1923963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1924963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int result = 0; 1925963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < specFileNames.size(); i++) { 1926963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet SpecFile specFile(specFileNames[i]); 1927963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!specFile.process(versionOfTestFiles)) { 1928963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result = -1; 1929963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1930963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1931963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return result; 1932963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1933