gen_runtime.cpp revision 963c367450cd54403f4e54064da63c35aa7e0178
1135c4b747bce5898d98de964d7c453d215254d0dJason Sams/* 2135c4b747bce5898d98de964d7c453d215254d0dJason Sams * Copyright (C) 2013 The Android Open Source Project 3135c4b747bce5898d98de964d7c453d215254d0dJason Sams * 4135c4b747bce5898d98de964d7c453d215254d0dJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5135c4b747bce5898d98de964d7c453d215254d0dJason Sams * you may not use this file except in compliance with the License. 6135c4b747bce5898d98de964d7c453d215254d0dJason Sams * You may obtain a copy of the License at 7135c4b747bce5898d98de964d7c453d215254d0dJason Sams * 8135c4b747bce5898d98de964d7c453d215254d0dJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9135c4b747bce5898d98de964d7c453d215254d0dJason Sams * 10135c4b747bce5898d98de964d7c453d215254d0dJason Sams * Unless required by applicable law or agreed to in writing, software 11135c4b747bce5898d98de964d7c453d215254d0dJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12135c4b747bce5898d98de964d7c453d215254d0dJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13135c4b747bce5898d98de964d7c453d215254d0dJason Sams * See the License for the specific language governing permissions and 14135c4b747bce5898d98de964d7c453d215254d0dJason Sams * limitations under the License. 15135c4b747bce5898d98de964d7c453d215254d0dJason Sams */ 16135c4b747bce5898d98de964d7c453d215254d0dJason Sams 17963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* This program processes Renderscript function definitions described in spec files. 18963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * For each spec file provided on the command line, it generates a corresponding 19963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * Renderscript header (*.rsh) which is meant for inclusion in client scripts. 20963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 21963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * This program also generates Junit test files to automatically test each of the 22963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * functions using randomly generated data. We create two files for each function: 23963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - a Renderscript file named Test{Function}.rs, 24963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - a Junit file named Test{function}.java, which calls the above RS file. 25963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 26963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * This program takes an optional -v parameter, the RS version to target the 27963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * test files for. The header file will always contain all the functions. 28963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 29963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * This program contains five main classes: 30963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - SpecFile: Represents on spec file. 31963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - Function: Each instance represents a function, like clamp. Even though the 32963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * spec file contains many entries for clamp, we'll only have one clamp instance. 33963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - Specification: Defines one of the many variations of the function. There's 34963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * a one to one correspondance between Specification objects and entries in the 35963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * spec file. Strings that are parts of a Specification can include placeholders, 36963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * which are "#1", "#2", "#3", and "#4". We'll replace these by values before 37963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * generating the files. 38963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - Permutation: A concrete version of a specification, where all placeholders have 39963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * been replaced by actual values. 40963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * - ParameterDefinition: A definition of a parameter of a concrete function. 41963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 42963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 43963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO Rename runtime.spec to rs_core_math.spec. 44963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO Handle NaN, +Inf, -Inf correctly. 45963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO Add range(,) as an option for test values. 46963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 47963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <cctype> 48963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <cstdlib> 49135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <stdio.h> 50963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <functional> 51135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <list> 52963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <map> 53963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <set> 54963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <fstream> 55135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <string> 56963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet#include <vector> 57135c4b747bce5898d98de964d7c453d215254d0dJason Sams 58135c4b747bce5898d98de964d7c453d215254d0dJason Samsusing namespace std; 59135c4b747bce5898d98de964d7c453d215254d0dJason Sams 60963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletnamespace { 61963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 62963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst char* AUTO_GENERATED_WARNING = 63963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "// Don't edit this file! It is auto-generated by " 64963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "frameworks/rs/api/gen_runtime.\n\n"; 65963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst char* LEGAL_NOTICE = 66963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "/*\n" 67963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * Copyright (C) 2014 The Android Open Source Project\n" 68963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " *\n" 69963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 70963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * you may not use this file except in compliance with the License.\n" 71963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * You may obtain a copy of the License at\n" 72963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " *\n" 73963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * http://www.apache.org/licenses/LICENSE-2.0\n" 74963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " *\n" 75963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * Unless required by applicable law or agreed to in writing, software\n" 76963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 77963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" 78963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * See the License for the specific language governing permissions and\n" 79963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " * limitations under the License.\n" 80963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet " */\n\n"; 81963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 82963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Function; 83963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Specification; 84963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Permutation; 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 raw; // The raw entry in the spec file, e.g. "uint3 v" 91963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsType; // The Renderscript type, e.g. "uint3" 92963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsBaseType; // As above but without the number, e.g. "uint" 93963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string javaBaseType; // The type we need to declare in Java, e.g. "unsigned int" 94963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 95963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The number of entries in the vector. It should be either "1", "2", "3", or "4". It's also 96963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * "1" for scalars. 97963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 98963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mVectorSize; 99963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The space the vector takes in an array. It's the same as the vector size, except for size 100963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * "3", where the width is "4". 101963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 102963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string vectorWidth; 103963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 104963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string variableName; // e.g. inX, used both in .rs and .java 105963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsAllocName; // e.g. gAllocInX 106963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string javaAllocName; // e.g. inX 107963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string javaArrayName; // e.g. arrayInX 108135c4b747bce5898d98de964d7c453d215254d0dJason Sams 109963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool isOutParameter; // True if this parameter returns data from the script. 110963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 111963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Parse the parameter definition found in the spec file. It will generate a name if none 112963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * are present in the file. One of the two counts will be incremented, and potentially 113963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * used to generate unique names. isReturn is true if we're processing the "return:" 114963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * definition. 115963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 116963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void parseParameterDefinition(string s, bool isReturn, int* inputCount, int* outputCount); 117963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 118963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 119963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// An entire spec file and the methods to process it. 120963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass SpecFile { 121135c4b747bce5898d98de964d7c453d215254d0dJason Samspublic: 122963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet explicit SpecFile(const string& specFileName) : mSpecFileName(specFileName) {} 123963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool process(int versionOfTestFiles); 124135c4b747bce5898d98de964d7c453d215254d0dJason Sams 125963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 126963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string mSpecFileName; 127963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The largest version number that we have found in all the specifications. 128963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mLargestVersionNumber; 129963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 130963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet map<string, Function*> mFunctionsMap; // All the known functions. 131963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet typedef map<string, Function*>::iterator FunctionsIterator; 132963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 133963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool readSpecFile(); 134963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* getFunction(const string& name); 135963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool generateFiles(int versionOfTestFiles); 136963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeAllFunctions(ofstream& headerFile, int versionOfTestFiles); 137963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 138963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 139963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Represents a function, like "clamp". Even though the spec file contains many entries for clamp, 140963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * we'll only have one clamp instance. 141963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 142963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Function { 143963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 144963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; // The lower case name, e.g. native_log 145963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCapitalizedName; // The capitalized name, e.g. NativeLog 146963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mTestName; // e.g. TestNativeLog 147963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mRelaxedTestName; // e.g. TestNativeLogRelaxed 148963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 149963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<Specification*> mSpecifications; 150963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet typedef vector<Specification*>::iterator SpecificationIterator; 151963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 152963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* We keep track of the allocations generated in the .rs file and the argument classes defined 153963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * in the Java file, as we share these between the functions created for each specification. 154963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 155963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set<string> mRsAllocationsGenerated; 156963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set<string> mJavaGeneratedArgumentClasses; 157963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 158963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaCallAllCheckMethods; // Lines of Java code to invoke the check methods. 159963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 160963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream mRsFile; // The Renderscript test file we're generating. 161963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream mJavaFile; // The Jave test file we're generating. 162963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 163963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool startRsFile(); // Open the mRsFile and writes its header. 164963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeRelaxedRsFile(); // Write the entire relaxed rs test file (an include essentially) 165963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool startJavaFile(); // Open the mJavaFile and writes the header. 166963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void finishJavaFile(); // Write the test method and closes the file. 167963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 168963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 169963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet explicit Function(const string& name); 170963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void addSpecification(Specification* spec) { mSpecifications.push_back(spec); } 171963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Write the .java and the two .rs test files. versionOfTestFiles is used to restrict which API 172963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * to test. Also writes the section of the header file. 173963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 174963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeFiles(ofstream& headerFile, int versionOfTestFiles); 175963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write an allocation and keep track of having it written, so it can be shared. 176963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeRsAllocationDefinition(const ParameterDefinition& param); 177963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write an argument class definiton and keep track of having it written, so it can be shared. 178963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaArgumentClassDefinition(const string& className, const string& definition); 179963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Add a call to mJavaCallAllCheckMethods to be used at the end of the file generation. 180963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void addJavaCheckCall(const string& call); 181963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 182963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 183963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Defines one of the many variations of the function. There's a one to one correspondance between 184963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * Specification objects and entries in the spec file. Some of the strings that are parts of a 185963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * Specification can include placeholders, which are "#1", "#2", "#3", and "#4". We'll replace 186963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * these by values before generating the files. 187963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 188963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Specification { 189963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 190963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The range of versions this specification applies to. 0 if there's no restriction, so an API 191963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * that became available at 9 and is still valid would have min:9 max:0. 192963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 193135c4b747bce5898d98de964d7c453d215254d0dJason Sams int mMinVersion; 194135c4b747bce5898d98de964d7c453d215254d0dJason Sams int mMaxVersion; 195135c4b747bce5898d98de964d7c453d215254d0dJason Sams 196963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* The name of the function without #n, e.g. convert. As of this writing, it only differs for 197963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * convert. 198963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 199963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCleanName; 200963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mTest; // How to test. One of "scalar", "vector", "noverify", and "none". 201963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 202135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<vector<string> > mReplaceables; 203963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 204963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The following fields may contain placeholders that will be replaced using the mReplaceables. 205963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 206963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The name of this function, can include #, e.g. convert_#1_#2 207963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; 208963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 209963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mReturn; // The return type 210963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mComment; // The comments to be included in the header 211963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mInline; // The inline code to be included in the header 212963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mParam; // One entry per parameter defined 213963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 214963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Substitute the placeholders in the strings by the corresponding entries in mReplaceables. 215963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string expandString(string s, int i1, int i2, int i3, int i4) const; 216963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void expandStringVector(const vector<string>& in, int i1, int i2, int i3, int i4, 217963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* out) const; 218963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 219963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 220963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification() { 221963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mMinVersion = 0; 222963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mMaxVersion = 0; 223963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 224963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int getMinVersion() const { return mMinVersion; } 225963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int getMaxVersion() const { return mMaxVersion; } 226963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 227963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getName(int i1, int i2, int i3, int i4) const { 228963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandString(mName, i1, i2, i3, i4); 229963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 230963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getReturn(int i1, int i2, int i3, int i4) const { 231963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandString(mReturn, i1, i2, i3, i4); 232963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 233963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getComments(int i1, int i2, int i3, int i4, vector<string>* comments) const { 234963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mComment, i1, i2, i3, i4, comments); 235963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 236963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getInlines(int i1, int i2, int i3, int i4, vector<string>* inlines) const { 237963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mInline, i1, i2, i3, i4, inlines); 238963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 239963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void getParams(int i1, int i2, int i3, int i4, vector<string>* params) const { 240963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return expandStringVector(mParam, i1, i2, i3, i4, params); 241963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 242963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getTest() const { return mTest; } 243963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string getCleanName() const { return mCleanName; } 244963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 245963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, Function* function, 246963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles); 247963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool writeRelaxedRsFile() const; 248963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Return true if this specification should be generated for this version. 249963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool relevantForVersion(int versionOfTestFiles) const; 250963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 251963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet static Specification* scanSpecification(FILE* in); 252963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 253963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 254963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// A concrete version of a specification, where all placeholders have been replaced by actual 255963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// values. 256963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletclass Permutation { 257963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletprivate: 258963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* mFunction; 259963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* mSpecification; 260963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 261963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // These are the expanded version of those found on Specification 262963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mName; 263963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mCleanName; 264963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mTest; // How to test. One of "scalar", "vector", "noverify", and "none". 265135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> mInline; 266963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> mComment; 267963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 268963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The inputs and outputs of the function. This include the return type, if present. 269963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<ParameterDefinition*> mParams; 270963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The index of the return value in mParams, -1 if the function is void. 271963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mReturnIndex; 272963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The index of the first input value in mParams, -1 if there's no input. 273963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mFirstInputIndex; 274963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The number of input and output parameters. 275963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mInputCount; 276963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int mOutputCount; 277135c4b747bce5898d98de964d7c453d215254d0dJason Sams 278963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mRsKernelName; 279963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaArgumentsClassName; 280963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaArgumentsNClassName; 281963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaVerifierComputeMethodName; 282963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaCheckMethodName; 283963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string mJavaVerifyMethodName; 284963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 285963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeHeaderSection(ofstream& file) const; 286963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 287963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeRsSection(ofstream& rs) const; 288963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 289963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaSection(ofstream& file) const; 290963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaArgumentClass(ofstream& file, bool scalar) const; 291963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaCheckMethod(ofstream& file, bool generateCallToVerify) const; 292963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVerifyScalarMethod(ofstream& file) const; 293963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVerifyVectorMethod(ofstream& file) const; 294963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVerifyFunctionHeader(ofstream& file) const; 295963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaInputAllocationDefinition(ofstream& file, const string& indent, 296963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& name, const string& cType) const; 297963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaOutputAllocationDefinition(ofstream& file, const string& indent, 298963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& name, const string& cType) const; 299963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaCallToRs(ofstream& file, bool relaxed, bool generateCallToVerify) const; 300963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 301963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaTestOneValue(ofstream& file, int indent, const string& rsBaseType, 302963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& expected, const string& actual) const; 303963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendOutputToMessage(ofstream& file, int indent, const string& rsBaseType, 304963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& name, const string& expected, 305963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const; 306963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendInputToMessage(ofstream& file, int indent, const string& rsBaseType, 307963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& name, const string& actual) const; 308963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaComputeNeededUlf(ofstream& file, int indent, const string& expected, 309963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const; 310963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendNewLineToMessage(ofstream& file, int indent) const; 311963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendVariableToMessage(ofstream& file, int indent, const string& rsBaseType, 312963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& legend, const string& value) const; 313963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaVectorComparison(ofstream& file, int indent, const ParameterDefinition& p) const; 314963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendVectorInputToMessage(ofstream& file, int indent, 315963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const; 316963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeJavaAppendVectorOutputToMessage(ofstream& file, int indent, 317963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const; 318963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool passByAddressToSet(const string& name) const; 319963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void convertToRsType(const string& name, string* dataType, char* vectorSize) const; 320963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 321963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletpublic: 322963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Permutation(Function* function, Specification* specification, int i1, int i2, int i3, int i4); 323963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet void writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 324963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles); 325963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool hasLongOrDoubleParameter() const; 326135c4b747bce5898d98de964d7c453d215254d0dJason Sams}; 327135c4b747bce5898d98de964d7c453d215254d0dJason Sams 328963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Table of type equivalences 329963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO: We should just be pulling this from a shared header. Slang does exactly the same thing. 330963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstruct Type { 331963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char* specType; // Name found in the .spec file 332963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string rsDataType; // RS data type 333963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string cType; // Type in a C file 334963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char* javaType; // Type in a Java file 335963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet}; 336135c4b747bce5898d98de964d7c453d215254d0dJason Sams 337963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst Type TYPES[] = {{"f16", "FLOAT_16", "half", "half"}, 338963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"f32", "FLOAT_32", "float", "float"}, 339963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"f64", "FLOAT_64", "double", "double"}, 340963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"i8", "SIGNED_8", "char", "byte"}, 341963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"u8", "UNSIGNED_8", "uchar", "byte"}, 342963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"i16", "SIGNED_16", "short", "short"}, 343963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"u16", "UNSIGNED_16", "ushort", "short"}, 344963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"i32", "SIGNED_32", "int", "int"}, 345963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"u32", "UNSIGNED_32", "uint", "int"}, 346963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"i64", "SIGNED_64", "long", "long"}, 347963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet {"u64", "UNSIGNED_64", "ulong", "long"}}; 348963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 349963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletconst int NUM_TYPES = sizeof(TYPES) / sizeof(TYPES[0]); 350963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 351963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Capitalizes and removes underscores. E.g. converts "native_log" to NativeLog. 352963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring capitalize(const string& source) { 353963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int length = source.length(); 354963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string result; 355963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool capitalize = true; 356963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int s = 0; s < length; s++) { 357963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (source[s] == '_') { 358963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet capitalize = true; 359963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (capitalize) { 360963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result += toupper(source[s]); 361963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet capitalize = false; 362963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 363963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result += source[s]; 364963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 365963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 366963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return result; 367963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 368963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 369963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring tab(int n) { return string(n * 4, ' '); } 370963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 371963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletlong hashString(const string& s) { 372963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet long hash = 0; 373963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < s.length(); i++) { 374963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet hash = hash * 43 + s[i]; 375963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 376963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return hash; 377963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 378963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 379963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return true if the string is already in the set. Inserts it if not. 380963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool testAndSet(const string& flag, set<string>* set) { 381963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (set->find(flag) == set->end()) { 382963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet set->insert(flag); 383963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 384135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 385135c4b747bce5898d98de964d7c453d215254d0dJason Sams return true; 386135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 387135c4b747bce5898d98de964d7c453d215254d0dJason Sams 388963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Convert an int into a string. 389963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring toString(int n) { 390963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char buf[100]; 391963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet snprintf(buf, sizeof(buf), "%d", n); 392963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return string(buf); 393963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 394963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 395963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid trim(string* s, size_t start) { 396135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (start > 0) { 397135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(0, start); 398135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 399135c4b747bce5898d98de964d7c453d215254d0dJason Sams 400135c4b747bce5898d98de964d7c453d215254d0dJason Sams while (s->size() && (s->at(0) == ' ')) { 401135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(0, 1); 402135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 403135c4b747bce5898d98de964d7c453d215254d0dJason Sams 404135c4b747bce5898d98de964d7c453d215254d0dJason Sams size_t p = s->find_first_of("\n\r"); 405135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (p != string::npos) { 406135c4b747bce5898d98de964d7c453d215254d0dJason Sams s->erase(p); 407135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 408135c4b747bce5898d98de964d7c453d215254d0dJason Sams 409963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while ((s->size() > 0) && (s->at(s->size() - 1) == ' ')) { 410963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->erase(s->size() - 1); 411963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 412963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 413963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 414963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring stringReplace(string s, string match, string rep) { 415963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 416963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t p = s.find(match); 417963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p == string::npos) break; 418963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 419963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(p, match.size()); 420963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.insert(p, rep); 421963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 422963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return s; 423963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 424963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 425963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return the next line from the input file. 426963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool getNextLine(FILE* in, string* s) { 427963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->clear(); 428963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 429963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int c = fgetc(in); 430963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (c == EOF) return s->size() != 0; 431963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (c == '\n') break; 432963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s->push_back((char)c); 433963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 434963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 435963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 436963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 437963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid writeIfdef(ofstream& file, string filename, bool isStart) { 438963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string t = "__"; 439963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t += filename; 440963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t += "__"; 441963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 442963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 2; i < t.size(); i++) { 443963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (t[i] == '.') { 444963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t[i] = '_'; 445963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 446963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 447963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 448963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (isStart) { 449963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#ifndef " << t << "\n"; 450963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#define " << t << "\n"; 451963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 452963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#endif // " << t << "\n"; 453963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 454963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 455963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 456963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid writeJavaArrayInitialization(ofstream& file, const ParameterDefinition& p) { 457963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << p.javaBaseType << "[] " << p.javaArrayName << " = new " << p.javaBaseType 458963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "[INPUTSIZE * " << p.vectorWidth << "];\n"; 459963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << p.javaAllocName << ".copyTo(" << p.javaArrayName << ");\n"; 460963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 461963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 462963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool parseCommandLine(int argc, char* argv[], int* versionOfTestFiles, 463963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* specFileNames) { 464963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 1; i < argc; i++) { 465963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (argv[i][0] == '-') { 466963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (argv[i][1] == 'v') { 467963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet i++; 468963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i < argc) { 469963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char* end; 470963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *versionOfTestFiles = strtol(argv[i], &end, 10); 471963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (*end != '\0') { 472963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Can't parse the version number %s\n", argv[i]); 473963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 474963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 475963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 476963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Missing version number after -v\n"); 477963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 478963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 479963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 480963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Unrecognized flag %s\n", argv[i]); 481963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 482963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 483963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 484963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet specFileNames->push_back(argv[i]); 485963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 486963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 487963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specFileNames->size() == 0) { 488963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("No spec file specified\n"); 489963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 490963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 491963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 492963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 493963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 494963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Parse a parameter definition. It's of the form "type [*][name]". The type 495963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * is required. The name is optional. The * indicates it's an output 496963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * parameter. We also pass the indexed of this parameter in the definition, so 497963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * we can create names like in2, in3, etc. */ 498963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid ParameterDefinition::parseParameterDefinition(string s, bool isReturn, int* inputCount, 499963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int* outputCount) { 500963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet raw = s; 501963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 502963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Determine if this an output. 503963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet isOutParameter = false; 504963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t p = s.find('*'); 505963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p != string::npos) { 506963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet isOutParameter = true; 507963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(p, 1); 508963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 509963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (isReturn) { 510963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet isOutParameter = true; 511963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 512963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 513963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Separate the type from the name. 514963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string name; 515963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p = s.find(' '); 516963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p != string::npos) { 517963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsType = s.substr(0, p); 518963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet name = capitalize(s.substr(p + 1)); 519963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 520963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsType = s; 521963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 522963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = rsType.size() - 1; 523963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = rsType[last]; 524963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (lastChar >= '0' && lastChar <= '9') { 525963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsBaseType = rsType.substr(0, last); 526963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mVectorSize = lastChar; 527963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 528963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsBaseType = rsType; 529963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mVectorSize = "1"; 530963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 531963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mVectorSize == "3") { 532963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorWidth = "4"; 533963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 534963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorWidth = mVectorSize; 535963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 536963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 537963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet /* Create variable names to be used in the java and .rs files. Because x and 538963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * y are reserved in .rs files, we prefix variable names with "in" or "out". 539963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 540963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (isOutParameter) { 541963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName = "out"; 542963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!name.empty()) { 543963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName += name; 544963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (!isReturn) { 545963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName += toString(*outputCount); 546963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 547963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*outputCount)++; 548963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 549963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName = "in"; 550963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!name.empty()) { 551963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName += name; 552963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (*inputCount > 0) { 553963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet variableName += toString(*inputCount); 554963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 555963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*inputCount)++; 556963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 557963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rsAllocName = "gAlloc" + capitalize(variableName); 558963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet javaAllocName = variableName; 559963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet javaArrayName = "array" + capitalize(javaAllocName); 560963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 561963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 562963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (rsBaseType == TYPES[i].cType) { 563963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet javaBaseType = TYPES[i].javaType; 564963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet break; 565963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 566963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 567963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 568963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 569963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::process(int versionOfTestFiles) { 570963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!readSpecFile()) { 571963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 572963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 573963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (versionOfTestFiles == 0) { 574963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet versionOfTestFiles = mLargestVersionNumber; 575963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 576963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!generateFiles(versionOfTestFiles)) { 577963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 578963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 579963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("%s: %ld functions processed.\n", mSpecFileName.c_str(), mFunctionsMap.size()); 580963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 581963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 582963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 583963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Read the specification, adding the definitions to the global functions map. 584963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::readSpecFile() { 585963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FILE* specFile = fopen(mSpecFileName.c_str(), "rt"); 586963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!specFile) { 587963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening input file: %s\n", mSpecFileName.c_str()); 588963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 589963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 590963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 591963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = 0; 592963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet while (1) { 593963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* spec = Specification::scanSpecification(specFile); 594963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (spec == NULL) { 595963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet break; 596963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 597963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet getFunction(spec->getCleanName())->addSpecification(spec); 598963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int specMin = spec->getMinVersion(); 599963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int specMax = spec->getMaxVersion(); 600963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specMin && specMin > mLargestVersionNumber) { 601963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = specMin; 602963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 603963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (specMax && specMax > mLargestVersionNumber) { 604963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mLargestVersionNumber = specMax; 605963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 606963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 607963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 608963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fclose(specFile); 609963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 610963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 611963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 612963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::generateFiles(int versionOfTestFiles) { 613963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("%s: Generating test files for version %d\n", mSpecFileName.c_str(), versionOfTestFiles); 614963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 615963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // The header file name should have the same base but with a ".rsh" extension. 616963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string headerFileName = mSpecFileName; 617963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t l = headerFileName.length(); 618963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const char SPEC[] = ".spec"; 619963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const int SPEC_SIZE = sizeof(SPEC) - 1; 620963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const int start = l - SPEC_SIZE; 621963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (start >= 0 && headerFileName.compare(start, SPEC_SIZE, SPEC) == 0) { 622963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFileName.erase(start); 623963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 624963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFileName += ".rsh"; 625963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 626963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the start of the header file. 627963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ofstream headerFile; 628963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile.open(headerFileName.c_str(), ios::out | ios::trunc); 629963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!headerFile.is_open()) { 630963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening output file: %s\n", headerFileName.c_str()); 631963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 632963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 633963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile << LEGAL_NOTICE; 634963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile << AUTO_GENERATED_WARNING; 635963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeIfdef(headerFile, headerFileName, true); 636963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 637963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the functions to the header and test files. 638963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = writeAllFunctions(headerFile, versionOfTestFiles); 639963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 640963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Finish the header file. 641963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeIfdef(headerFile, headerFileName, false); 642963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet headerFile.close(); 643963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 644963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return success; 645963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 646963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 647963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Return the named function from the map. Creates it if it's not there. 648963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletFunction* SpecFile::getFunction(const string& name) { 649963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FunctionsIterator iter = mFunctionsMap.find(name); 650963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (iter != mFunctionsMap.end()) { 651963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return iter->second; 652963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 653963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* f = new Function(name); 654963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunctionsMap[name] = f; 655963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return f; 656963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 657963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 658963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool SpecFile::writeAllFunctions(ofstream& headerFile, int versionOfTestFiles) { 659963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = true; 660963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (FunctionsIterator iter = mFunctionsMap.begin(); iter != mFunctionsMap.end(); iter++) { 661963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* func = iter->second; 662963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!func->writeFiles(headerFile, versionOfTestFiles)) { 663963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet success = false; 664963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 665963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 666963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return success; 667963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 668963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 669963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletFunction::Function(const string& name) { 670963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mName = name; 671963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mCapitalizedName = capitalize(mName); 672963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mTestName = "Test" + mCapitalizedName; 673963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRelaxedTestName = mTestName + "Relaxed"; 674963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 675963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 676963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::writeFiles(ofstream& headerFile, int versionOfTestFiles) { 677963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!startRsFile() || !startJavaFile() || !writeRelaxedRsFile()) { 678963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 679963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 680963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 681963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (SpecificationIterator i = mSpecifications.begin(); i < mSpecifications.end(); i++) { 682963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet (*i)->writeFiles(headerFile, mRsFile, mJavaFile, this, versionOfTestFiles); 683963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 684963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 685963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet finishJavaFile(); 686963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // There's no work to wrap-up in the .rs file. 687963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 688963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile.close(); 689963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile.close(); 690963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 691963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 692963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 693963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::startRsFile() { 694963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string fileName = mTestName + ".rs"; 695963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile.open(fileName.c_str(), ios::out | ios::trunc); 696963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mRsFile.is_open()) { 697963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", fileName.c_str()); 698963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 699963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 700963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << LEGAL_NOTICE; 701963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "#pragma version(1)\n"; 702963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "#pragma rs java_package_name(android.renderscript.cts)\n\n"; 703963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << AUTO_GENERATED_WARNING; 704963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 705963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 706963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 707963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Write an allocation definition if not already emitted in the .rs file. 708963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::writeRsAllocationDefinition(const ParameterDefinition& param) { 709963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!testAndSet(param.rsAllocName, &mRsAllocationsGenerated)) { 710963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsFile << "rs_allocation " << param.rsAllocName << ";\n"; 711963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 712963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 713963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 714963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Write the entire *Relaxed.rs test file, as it only depends on the name. 715963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::writeRelaxedRsFile() { 716963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string name = mRelaxedTestName + ".rs"; 717963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet FILE* file = fopen(name.c_str(), "wt"); 718963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!file) { 719963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", name.c_str()); 720963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 721963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 722963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fputs(LEGAL_NOTICE, file); 723963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s; 724963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "#include \"" + mTestName + ".rs\"\n"; 725963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "#pragma rs_fp_relaxed\n"; 726963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += AUTO_GENERATED_WARNING; 727963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fputs(s.c_str(), file); 728963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet fclose(file); 729963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 730963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 731963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 732963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Function::startJavaFile() { 733963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string fileName = mTestName + ".java"; 734963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile.open(fileName.c_str(), ios::out | ios::trunc); 735963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mJavaFile.is_open()) { 736963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Error opening file: %s\n", fileName.c_str()); 737963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 738963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 739963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << LEGAL_NOTICE; 740963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << AUTO_GENERATED_WARNING; 741963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "package android.renderscript.cts;\n\n"; 742963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 743963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.Allocation;\n"; 744963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.RSRuntimeException;\n"; 745963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "import android.renderscript.Element;\n\n"; 746963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 747963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "public class " << mTestName << " extends RSBaseCompute {\n\n"; 748963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 749963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "private ScriptC_" << mTestName << " script;\n"; 750963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "private ScriptC_" << mRelaxedTestName << " scriptRelaxed;\n\n"; 751963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 752963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "@Override\n"; 753963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "protected void setUp() throws Exception {\n"; 754963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "super.setUp();\n"; 755963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "script = new ScriptC_" << mTestName << "(mRS);\n"; 756963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(2) << "scriptRelaxed = new ScriptC_" << mRelaxedTestName << "(mRS);\n"; 757963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "}\n\n"; 758963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 759963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 760963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 761963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::writeJavaArgumentClassDefinition(const string& className, const string& definition) { 762963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!testAndSet(className, &mJavaGeneratedArgumentClasses)) { 763963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << definition; 764963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 765963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 766963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 767963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::addJavaCheckCall(const string& call) { 768963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCallAllCheckMethods += tab(2) + call + "\n"; 769963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 770963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 771963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Function::finishJavaFile() { 772963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "public void test" << mCapitalizedName << "() {\n"; 773963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << mJavaCallAllCheckMethods; 774963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << tab(1) << "}\n"; 775963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaFile << "}\n"; 776963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 777963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 778963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Specification::expandStringVector(const vector<string>& in, int i1, int i2, int i3, int i4, 779963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string>* out) const { 780963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet out->clear(); 781963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (vector<string>::const_iterator iter = in.begin(); iter != in.end(); iter++) { 782963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet out->push_back(expandString(*iter, i1, i2, i3, i4)); 783135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 784135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 785135c4b747bce5898d98de964d7c453d215254d0dJason Sams 786963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletSpecification* Specification::scanSpecification(FILE* in) { 787963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Specification* spec = new Specification(); 788963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mTest = "scalar"; // default 789135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool modeComment = false; 790135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool modeInline = false; 791963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool success = true; 792135c4b747bce5898d98de964d7c453d215254d0dJason Sams 793135c4b747bce5898d98de964d7c453d215254d0dJason Sams while (1) { 794135c4b747bce5898d98de964d7c453d215254d0dJason Sams string s; 795135c4b747bce5898d98de964d7c453d215254d0dJason Sams bool ret = getNextLine(in, &s); 796135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!ret) break; 797135c4b747bce5898d98de964d7c453d215254d0dJason Sams 798135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (modeComment) { 799135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!s.size() || (s[0] == ' ')) { 800135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 0); 801963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mComment.push_back(s); 802135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 803135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 804135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeComment = false; 805135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 806135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 807135c4b747bce5898d98de964d7c453d215254d0dJason Sams 808135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (modeInline) { 809135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (!s.size() || (s[0] == ' ')) { 810135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 0); 811963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mInline.push_back(s); 812135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 813135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 814135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeInline = false; 815135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 816135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 817135c4b747bce5898d98de964d7c453d215254d0dJason Sams 818135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s[0] == '#') { 819135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 820135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 821135c4b747bce5898d98de964d7c453d215254d0dJason Sams 822135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 5, "name:") == 0) { 823135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 5); 824963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mName = s; 825963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Some functions like convert have # part of the name. Truncate at that point. 826963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet size_t p = s.find('#'); 827963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p != string::npos) { 828963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p > 0 && s[p - 1] == '_') { 829963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p--; 830963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 831963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(p); 832963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 833963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mCleanName = s; 834135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 835135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 836135c4b747bce5898d98de964d7c453d215254d0dJason Sams 837135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "arg:") == 0) { 838135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 4); 839963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mParam.push_back(s); 840135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 841135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 842135c4b747bce5898d98de964d7c453d215254d0dJason Sams 843135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "ret:") == 0) { 844135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 4); 845963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReturn = s; 846963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 847963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 848963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 849963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s.compare(0, 5, "test:") == 0) { 850963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet trim(&s, 5); 851963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s == "scalar" || s == "vector" || s == "noverify" || s == "none") { 852963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mTest = s; 853963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 854963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Unrecognized test option: %s\n", s.c_str()); 855963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet success = false; 856963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 857135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 858135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 859135c4b747bce5898d98de964d7c453d215254d0dJason Sams 860135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 4, "end:") == 0) { 861963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (success) { 862963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return spec; 863963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 864963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet delete spec; 865963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return NULL; 866963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 867135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 868135c4b747bce5898d98de964d7c453d215254d0dJason Sams 869135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "comment:") == 0) { 870135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeComment = true; 871135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 872135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 873135c4b747bce5898d98de964d7c453d215254d0dJason Sams 874135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 7, "inline:") == 0) { 875135c4b747bce5898d98de964d7c453d215254d0dJason Sams modeInline = true; 876135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 877135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 878135c4b747bce5898d98de964d7c453d215254d0dJason Sams 879135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "version:") == 0) { 880135c4b747bce5898d98de964d7c453d215254d0dJason Sams trim(&s, 8); 881963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet sscanf(s.c_str(), "%i %i", &spec->mMinVersion, &spec->mMaxVersion); 882135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 883135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 884135c4b747bce5898d98de964d7c453d215254d0dJason Sams 885135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 8, "start:") == 0) { 886135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 887135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 888135c4b747bce5898d98de964d7c453d215254d0dJason Sams 889135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 2, "w:") == 0) { 890135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> t; 891135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("1") != string::npos) { 892135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back(""); 893135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 894135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("2") != string::npos) { 895135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("2"); 896135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 897135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("3") != string::npos) { 898135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("3"); 899135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 900135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.find("4") != string::npos) { 901135c4b747bce5898d98de964d7c453d215254d0dJason Sams t.push_back("4"); 902135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 903963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReplaceables.push_back(t); 904135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 905135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 906135c4b747bce5898d98de964d7c453d215254d0dJason Sams 907135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.compare(0, 2, "t:") == 0) { 908135c4b747bce5898d98de964d7c453d215254d0dJason Sams vector<string> t; 909963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 910963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s.find(TYPES[i].specType) != string::npos) { 911963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet t.push_back(TYPES[i].cType); 912963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 913135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 914963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->mReplaceables.push_back(t); 915135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 916135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 917135c4b747bce5898d98de964d7c453d215254d0dJason Sams 918135c4b747bce5898d98de964d7c453d215254d0dJason Sams if (s.size() == 0) { 919135c4b747bce5898d98de964d7c453d215254d0dJason Sams // eat empty line 920135c4b747bce5898d98de964d7c453d215254d0dJason Sams continue; 921135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 922135c4b747bce5898d98de964d7c453d215254d0dJason Sams 923135c4b747bce5898d98de964d7c453d215254d0dJason Sams printf("Error, line:\n"); 924135c4b747bce5898d98de964d7c453d215254d0dJason Sams printf(" %s\n", s.c_str()); 925135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 926135c4b747bce5898d98de964d7c453d215254d0dJason Sams 927963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet delete spec; 928135c4b747bce5898d98de964d7c453d215254d0dJason Sams return NULL; 929135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 930135c4b747bce5898d98de964d7c453d215254d0dJason Sams 931963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Specification::writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 932963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Function* function, int versionOfTestFiles) { 933963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int start[4]; 934963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int end[4]; 935963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < 4; i++) { 936963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i < (int)mReplaceables.size()) { 937963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet start[i] = 0; 938963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet end[i] = mReplaceables[i].size(); 939963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 940963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet start[i] = -1; 941963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet end[i] = 0; 942963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 943963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 944963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i4 = start[3]; i4 < end[3]; i4++) { 945963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i3 = start[2]; i3 < end[2]; i3++) { 946963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i2 = start[1]; i2 < end[1]; i2++) { 947963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i1 = start[0]; i1 < end[0]; i1++) { 948963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet Permutation p(function, this, i1, i2, i3, i4); 949963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.writeFiles(headerFile, rsFile, javaFile, versionOfTestFiles); 950963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 951963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 952963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 953963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 954963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 955135c4b747bce5898d98de964d7c453d215254d0dJason Sams 956963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Specification::relevantForVersion(int versionOfTestFiles) const { 957963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mMinVersion != 0 && mMinVersion > versionOfTestFiles) { 958963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 959135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 960963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mMaxVersion != 0 && mMaxVersion < versionOfTestFiles) { 961963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 962963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 963963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 964135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 965135c4b747bce5898d98de964d7c453d215254d0dJason Sams 966963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletstring Specification::expandString(string s, int i1, int i2, int i3, int i4) const { 967963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 0) { 968963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#1", mReplaceables[0][i1]); 969135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 970963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 1) { 971963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#2", mReplaceables[1][i2]); 972135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 973963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 2) { 974963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#3", mReplaceables[2][i3]); 975135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 976963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReplaceables.size() > 3) { 977963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s = stringReplace(s, "#4", mReplaceables[3][i4]); 978135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 979135c4b747bce5898d98de964d7c453d215254d0dJason Sams return s; 980135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 981135c4b747bce5898d98de964d7c453d215254d0dJason Sams 982963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc BrouilletPermutation::Permutation(Function* func, Specification* spec, int i1, int i2, int i3, int i4) 983963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet : mFunction(func), 984963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mSpecification(spec), 985963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mReturnIndex(-1), 986963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFirstInputIndex(-1), 987963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mInputCount(0), 988963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mOutputCount(0) { 989963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // We expand the strings now to make capitalization easier. The previous code preserved the #n 990963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // markers just before emitting, which made capitalization difficult. 991963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mName = spec->getName(i1, i2, i3, i4); 992963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mCleanName = spec->getCleanName(); 993963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mTest = spec->getTest(); 994963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getInlines(i1, i2, i3, i4, &mInline); 995963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getComments(i1, i2, i3, i4, &mComment); 996ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 997963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> paramDefinitions; 998963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet spec->getParams(i1, i2, i3, i4, ¶mDefinitions); 999963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < paramDefinitions.size(); i++) { 1000963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ParameterDefinition* def = new ParameterDefinition(); 1001963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet def->parseParameterDefinition(paramDefinitions[i], false, &mInputCount, &mOutputCount); 1002963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!def->isOutParameter && mFirstInputIndex < 0) { 1003963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFirstInputIndex = mParams.size(); 1004ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1005963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mParams.push_back(def); 1006ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1007ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1008963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string s = spec->getReturn(i1, i2, i3, i4); 1009963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!s.empty() && s != "void") { 1010963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet ParameterDefinition* def = new ParameterDefinition(); 1011963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Adding "*" tells the parse method it's an output. 1012963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet def->parseParameterDefinition(s, true, &mInputCount, &mOutputCount); 1013963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mReturnIndex = mParams.size(); 1014963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mParams.push_back(def); 1015963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1016963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1017963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsKernelName = "test" + capitalize(mName); 1018963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsClassName = "Arguments"; 1019963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName = "Arguments"; 1020963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCheckMethodName = "check" + capitalize(mCleanName); 1021963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifyMethodName = "verifyResults" + capitalize(mCleanName); 1022963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1023963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1024963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mRsKernelName += capitalize(p.rsType); 1025963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsClassName += capitalize(p.rsBaseType); 1026963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName += capitalize(p.rsBaseType); 1027963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1") { 1028963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaArgumentsNClassName += "N"; 1029963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1030963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaCheckMethodName += capitalize(p.rsType); 1031963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifyMethodName += capitalize(p.rsType); 1032ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1033963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mJavaVerifierComputeMethodName = "compute" + capitalize(mCleanName); 1034ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams} 1035ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1036963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// TODO Remove once we have long/double copyTo/copyFrom 1037963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Permutation::hasLongOrDoubleParameter() const { 1038963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1039963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1040963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.javaBaseType == "long" || p.javaBaseType == "double") { 1041963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return true; 1042963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1043963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1044963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return false; 1045963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1046ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1047963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeFiles(ofstream& headerFile, ofstream& rsFile, ofstream& javaFile, 1048963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles) { 1049963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeHeaderSection(headerFile); 1050963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (hasLongOrDoubleParameter()) { 1051963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Warning: skipping a test for %s as we don't support long or double arguments (due " 1052963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "to Allocation not supporting them).\n", 1053963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mName.c_str()); 1054963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return; 1055963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1056ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams 1057963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mSpecification->relevantForVersion(versionOfTestFiles) && mTest != "none") { 1058963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeRsSection(rsFile); 1059963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaSection(javaFile); 1060963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1061963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1062135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1063963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeHeaderSection(ofstream& file) const { 1064963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int minVersion = mSpecification->getMinVersion(); 1065963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int maxVersion = mSpecification->getMaxVersion(); 1066963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool hasVersion = minVersion || maxVersion; 1067963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1068963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (hasVersion) { 1069963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (maxVersion) { 1070963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#if (defined(RS_VERSION) && (RS_VERSION >= " << minVersion 1071963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ") && (RS_VERSION <= " << maxVersion << "))\n"; 1072135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1073963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#if (defined(RS_VERSION) && (RS_VERSION >= " << minVersion << "))\n"; 1074135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1075135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1076135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1077963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "/*\n"; 1078963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t ct = 0; ct < mComment.size(); ct++) { 1079963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!mComment[ct].empty()) { 1080963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * " << mComment[ct] << "\n"; 1081135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1082963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " *\n"; 1083135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1084135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1085963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " *\n"; 1086963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (minVersion || maxVersion) { 1087963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (maxVersion) { 1088963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * Suppored by API versions " << minVersion << " - " << maxVersion << "\n"; 1089135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1090963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * Supported by API versions " << minVersion << " and newer.\n"; 1091963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1092963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1093963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " */\n"; 1094963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mInline.size() > 0) { 1095963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "static "; 1096963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1097963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "extern "; 1098963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1099963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1100963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mReturnIndex]->rsType; 1101963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1102963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "void"; 1103963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1104963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " __attribute__(("; 1105963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount <= 1) { 1106963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "const, "; 1107963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1108963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "overloadable))"; 1109963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mName; 1110963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "("; 1111963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1112963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1113963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex) { 1114963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1115963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ", "; 1116963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1117963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[i]->raw; 1118963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1119963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1120963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1121963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mInline.size() > 0) { 1122963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ") {\n"; 1123963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t ct = 0; ct < mInline.size(); ct++) { 1124963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " " << mInline[ct].c_str() << "\n"; 1125135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1126963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "}\n"; 1127963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1128963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ");\n"; 1129963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1130963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (hasVersion) { 1131963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "#endif\n"; 1132135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1133963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "\n"; 1134963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1135135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1136963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet/* Write the section of the .rs file for this permutation. 1137963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1138963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We communicate the extra input and output parameters via global allocations. 1139963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * For example, if we have a function that takes three arguments, two for input 1140963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * and one for output: 1141963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1142963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * start: 1143963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * name: gamn 1144963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * ret: float3 1145963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: float3 a 1146963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: int b 1147963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * arg: float3 *c 1148963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * end: 1149963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1150963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We'll produce: 1151963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1152963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rs_allocation gAllocInB; 1153963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rs_allocation gAllocOutC; 1154963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1155963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float3 __attribute__((kernel)) test_gamn_float3_int_float3(float3 inA, unsigned int x) { 1156963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * int inB; 1157963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float3 outC; 1158963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * float2 out; 1159963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * inB = rsGetElementAt_int(gAllocInB, x); 1160963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * out = gamn(a, in_b, &outC); 1161963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * rsSetElementAt_float4(gAllocOutC, &outC, x); 1162963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * return out; 1163963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * } 1164963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * 1165963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * We avoid re-using x and y from the definition because these have reserved 1166963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet * meanings in a .rs file. 1167963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet */ 1168963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeRsSection(ofstream& rs) const { 1169963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the allocation declarations we'll need. 1170963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1171963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1172963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Don't need allocation for one input and one return value. 1173963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex && i != mFirstInputIndex) { 1174963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->writeRsAllocationDefinition(p); 1175963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1176963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1177963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "\n"; 1178135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1179963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the function header. 1180963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1181963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mParams[mReturnIndex]->rsType; 1182ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } else { 1183963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "void"; 1184ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1185963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " __attribute__((kernel)) " << mRsKernelName; 1186963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "("; 1187963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1188963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mFirstInputIndex >= 0) { 1189963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mParams[mFirstInputIndex]->rsType << " " << mParams[mFirstInputIndex]->variableName; 1190963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1191135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1192963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1 || mInputCount > 1) { 1193963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1194963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ", "; 1195963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1196963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "unsigned int x"; 1197ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1198963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ") {\n"; 1199963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1200963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the local variable declarations and initializations. 1201963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1202963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i == mFirstInputIndex || i == mReturnIndex) { 1203963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 1204963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1205963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1206963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << p.rsType << " " << p.variableName; 1207963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1208963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " = 0;\n"; 1209963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1210963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << " = rsGetElementAt_" << p.rsType << "(" << p.rsAllocName << ", x);\n"; 1211963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1212963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1213963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1214963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write the function call. 1215963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1216963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1) { 1217963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << mParams[mReturnIndex]->rsType << " " 1218963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << mParams[mReturnIndex]->variableName << " = "; 1219963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1220963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "return "; 1221963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1222963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1223963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << mName << "("; 1224963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = false; 1225963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1226963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1227963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i == mReturnIndex) { 1228963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet continue; 1229963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1230963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1231963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ", "; 1232963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1233963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1234963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "&"; 1235963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1236963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << p.variableName; 1237963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1238135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1239963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << ");\n"; 1240135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1241963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mOutputCount > 1) { 1242963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Write setting the extra out parameters into the allocations. 1243963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1244963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1245963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter && i != mReturnIndex) { 1246963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "rsSetElementAt_" << p.rsType << "(" << p.rsAllocName << ", "; 1247963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (passByAddressToSet(p.variableName)) { 1248963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "&"; 1249963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1250963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << p.variableName << ", x);\n"; 1251963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1252963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1253963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1254963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << tab(1) << "return " << mParams[mReturnIndex]->variableName << ";\n"; 1255ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1256ea877edd85a9b030fec742491322ee58324b7ae6Jason Sams } 1257963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet rs << "}\n"; 1258963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1259963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1260963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletbool Permutation::passByAddressToSet(const string& name) const { 1261963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s = name; 1262963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = s.size() - 1; 1263963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = s[last]; 1264963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return lastChar >= '0' && lastChar <= '9'; 1265963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1266135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1267963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaSection(ofstream& file) const { 1268963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // By default, we test the results using item by item comparison. 1269963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mTest == "scalar") { 1270963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArgumentClass(file, true); 1271963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, true); 1272963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyScalarMethod(file); 1273963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (mTest == "vector") { 1274963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArgumentClass(file, false); 1275963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, true); 1276963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyVectorMethod(file); 1277963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (mTest == "noverify") { 1278963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCheckMethod(file, false); 1279135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1280135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1281963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Register the check method to be called. This code will be written at the end. 1282963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->addJavaCheckCall(mJavaCheckMethodName + "();"); 1283135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1284135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1285963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaArgumentClass(ofstream& file, bool scalar) const { 1286963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string name; 1287963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (scalar) { 1288963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet name = mJavaArgumentsClassName; 1289963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1290963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet name = mJavaArgumentsNClassName; 1291963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1292963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s; 1293963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(1) + "public class " + name + " {\n"; 1294963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1295963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1296963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(2) + "public " + p.javaBaseType; 1297963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!scalar && p.mVectorSize != "1") { 1298963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "[]"; 1299963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1300963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += " " + p.variableName + ";\n"; 1301963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1302963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += "\n"; 1303963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(2) + "public int ulf;\n"; 1304963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(2) + "public int ulfRelaxed;\n"; 1305963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s += tab(1) + "}\n\n"; 1306963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1307963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet mFunction->writeJavaArgumentClassDefinition(name, s); 1308963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1309135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1310963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaCheckMethod(ofstream& file, bool generateCallToVerify) const { 1311963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "private void " << mJavaCheckMethodName << "() {\n"; 1312963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet // Generate the input allocations and initialization. 1313963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1314963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1315963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 1316963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaInputAllocationDefinition(file, tab(2), p.javaAllocName, p.rsType); 1317135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1318963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1319963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCallToRs(file, false, generateCallToVerify); 1320963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaCallToRs(file, true, generateCallToVerify); 1321963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1322963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1323963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1324963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaInputAllocationDefinition(ofstream& file, const string& indent, 1325963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& name, 1326963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& cType) const { 1327963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string dataType; 1328963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char vectorSize; 1329963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet convertToRsType(cType, &dataType, &vectorSize); 1330963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet long seed = hashString(mJavaCheckMethodName + mName); 1331963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << indent << "Allocation " << name << " = CreateRandomAllocation(mRS, Element.DataType." 1332963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << dataType << ", " << vectorSize << ", 0x" << std::hex << seed << "L);\n"; 1333963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1334963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1335963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaOutputAllocationDefinition(ofstream& file, const string& indent, 1336963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& name, 1337963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& cType) const { 1338963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string dataType; 1339963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char vectorSize; 1340963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet convertToRsType(cType, &dataType, &vectorSize); 1341963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << indent << "Allocation " << name << " = Allocation.createSized(mRS, " 1342963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "GetElement(mRS, Element.DataType." << dataType << ", " << vectorSize 1343963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "), INPUTSIZE);\n"; 1344963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1345963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1346963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet// Converts float2 to FLOAT_32 and 2, etc. 1347963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::convertToRsType(const string& name, string* dataType, char* vectorSize) const { 1348963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string s = name; 1349963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int last = s.size() - 1; 1350963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet char lastChar = s[last]; 1351963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (lastChar >= '1' && lastChar <= '4') { 1352963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet s.erase(last); 1353963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *vectorSize = lastChar; 1354963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1355963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *vectorSize = '1'; 1356963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1357963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet dataType->clear(); 1358963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < NUM_TYPES; i++) { 1359963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (s == TYPES[i].cType) { 1360963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet *dataType = TYPES[i].rsDataType; 1361963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet break; 1362135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1363963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1364963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1365963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1366963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVerifyScalarMethod(ofstream& file) const { 1367963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyFunctionHeader(file); 1368963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string vectorSize = "1"; 1369963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1370963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1371963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArrayInitialization(file, p); 1372963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1" && p.mVectorSize != vectorSize) { 1373963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (vectorSize == "1") { 1374963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vectorSize = p.mVectorSize; 1375963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1376963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Yikes, had vector %s and %s\n", vectorSize.c_str(), p.mVectorSize.c_str()); 1377135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1378135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1379963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1380963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1381963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "for (int i = 0; i < INPUTSIZE; i++) {\n"; 1382963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "for (int j = 0; j < " << vectorSize << " ; j++) {\n"; 1383963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1384963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "// Extract the inputs.\n"; 1385963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << mJavaArgumentsClassName << " args = new " << mJavaArgumentsClassName 1386963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "();\n"; 1387963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1388963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1389963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 1390963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "args." << p.variableName << " = " << p.javaArrayName << "[i"; 1391963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.vectorWidth != "1") { 1392963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << " * " << p.vectorWidth << " + j"; 1393135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1394963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "];\n"; 1395135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1396135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1397963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1398963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "// Figure out what the outputs should have been.\n"; 1399963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "CoreMathVerifier." << mJavaVerifierComputeMethodName << "(args);\n"; 1400963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "int ulf = relaxed ? args.ulfRelaxed : args.ulf;\n"; 1401963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1402963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "// Figure out what the outputs should have been.\n"; 1403963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "boolean valid = true;\n"; 1404963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "int neededUlf = 0;\n"; 1405963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1406963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1407963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1408963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaTestOneValue(file, 4, p.rsBaseType, "args." + p.variableName, 1409963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1410963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1411963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1412963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1413963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "if (!valid) {\n"; 1414963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(5) << "StringBuilder message = new StringBuilder();\n"; 1415963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1416963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1417963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1418963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendOutputToMessage(file, 5, p.rsBaseType, p.variableName, 1419963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "args." + p.variableName, 1420963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1421963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1422963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendInputToMessage(file, 5, p.rsBaseType, p.variableName, 1423963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "args." + p.variableName); 1424963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1425963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1426963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1427963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(5) << "assertTrue(\"Incorrect output for " << mJavaCheckMethodName 1428963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "\" + (relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), valid);\n"; 1429963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "}\n"; 1430963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1431963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1432963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1433135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1434135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1435963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVerifyFunctionHeader(ofstream& file) const { 1436963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "private void " << mJavaVerifyMethodName << "("; 1437963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1438963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1439963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "Allocation " << p.javaAllocName << ", "; 1440963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1441963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "boolean relaxed) {\n"; 1442963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1443135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1444963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaTestOneValue(ofstream& file, int indent, const string& rsBaseType, 1445963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& expected, const string& actual) const { 1446963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (rsBaseType[0] == 'f') { 1447963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaComputeNeededUlf(file, indent, expected, actual); 1448963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "if (neededUlf > ulf) {\n"; 1449963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent + 1) << "valid = false;\n"; 1450963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1451963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1452963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "if (" + expected + " != " + actual + ") {\n"; 1453963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent + 1) << "valid = false;\n"; 1454963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1455963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1456963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1457135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1458963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendOutputToMessage(ofstream& file, int indent, 1459963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& rsBaseType, const string& name, 1460963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& expected, 1461963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const { 1462963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, rsBaseType, "Expected output " + name, expected); 1463963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 1464963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, rsBaseType, "Actual output " + name, actual); 1465963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (rsBaseType[0] == 'f') { 1466963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaComputeNeededUlf(file, indent, expected, actual); 1467963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "if (neededUlf > ulf) {\n"; 1468963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent + 1) << "message.append(String.format(\" FAILED, ulf needed %d, " 1469963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "specified %d\", neededUlf, ulf));\n"; 1470963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1471963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1472963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "if (" + expected + " != " + actual + ") {\n"; 1473963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent + 1) << "message.append(\" FAIL\");\n"; 1474963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1475963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1476963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 1477963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1478135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1479963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendInputToMessage(ofstream& file, int indent, 1480963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& rsBaseType, const string& name, 1481963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const { 1482963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVariableToMessage(file, indent, rsBaseType, "Input " + name, actual); 1483963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendNewLineToMessage(file, indent); 1484963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1485963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1486963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaComputeNeededUlf(ofstream& file, int indent, const string& expected, 1487963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& actual) const { 1488963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "neededUlf = (int) (Math.abs(" << expected << " - " << actual 1489963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ") / Math.ulp(" << expected << ") + 0.5);\n"; 1490963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1491963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1492963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendNewLineToMessage(ofstream& file, int indent) const { 1493963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "message.append(\"\\n\");\n"; 1494963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1495963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1496963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVariableToMessage(ofstream& file, int indent, 1497963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& rsBaseType, const string& legend, 1498963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const string& value) const { 1499963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "message.append(String.format(\"" + legend + ": "; 1500963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (rsBaseType[0] == 'f') { 1501963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "%x %.16f\", Float.floatToRawIntBits(" << value << "), " << value; 1502963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else if (rsBaseType[0] == 'u') { 1503963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "%x\", " << value; 1504963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1505963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "%d\", " << value; 1506135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1507963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "));\n"; 1508963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1509135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1510963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVectorComparison(ofstream& file, int indent, 1511963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1512963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1513963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaTestOneValue(file, indent, p.javaBaseType, "args." + p.variableName, 1514963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i]"); 1515963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1516963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1517963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1518963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaTestOneValue(file, indent + 1, p.rsBaseType, "args." + p.variableName + "[j]", 1519963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1520963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1521963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1522963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1523963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1524963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVectorInputToMessage(ofstream& file, int indent, 1525963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1526963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1527963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendInputToMessage(file, indent, p.rsBaseType, p.variableName, 1528963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i]"); 1529963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1530963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1531963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendInputToMessage(file, indent + 1, p.rsBaseType, p.variableName, 1532963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1533963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1534963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1535963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1536963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1537963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaAppendVectorOutputToMessage(ofstream& file, int indent, 1538963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p) const { 1539963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1540963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendOutputToMessage(file, indent, p.rsBaseType, p.variableName, 1541963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "args." + p.variableName, p.javaArrayName + "[i]"); 1542963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1543963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1544963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1545963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendOutputToMessage(file, indent + 1, p.rsBaseType, p.variableName, 1546963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet "args." + p.variableName + "[j]", 1547963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet p.javaArrayName + "[i * " + p.vectorWidth + " + j]"); 1548963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(indent) << "}\n"; 1549963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1550963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1551963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1552963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaVerifyVectorMethod(ofstream& file) const { 1553963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVerifyFunctionHeader(file); 1554963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1555963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1556963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaArrayInitialization(file, p); 1557963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1558963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) + "for (int i = 0; i < INPUTSIZE; i++) {\n"; 1559963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << mJavaArgumentsNClassName << " args = new " << mJavaArgumentsNClassName 1560963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "();\n"; 1561963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1562963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Create the appropriate sized arrays in args\n"; 1563963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1564963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1565963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize != "1") { 1566963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "args." << p.variableName << " = new " << p.javaBaseType << "[" 1567963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << p.mVectorSize << "];\n"; 1568963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1569963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1570963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1571963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Fill args with the input values\n"; 1572963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1573963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1574963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!p.isOutParameter) { 1575963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.mVectorSize == "1") { 1576963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "args." << p.variableName << " = " << p.javaArrayName + "[i]" 1577963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ";\n"; 1578963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1579963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "for (int j = 0; j < " << p.mVectorSize << " ; j++) {\n"; 1580963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "args." << p.variableName + "[j] = " 1581963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << p.javaArrayName + "[i * " + p.vectorWidth + " + j]" 1582963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ";\n"; 1583963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1584963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1585963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1586963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1587963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "CoreMathVerifier." << mJavaVerifierComputeMethodName << "(args);\n\n"; 1588963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "int ulf = relaxed ? args.ulfRelaxed : args.ulf;\n"; 1589963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1590963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "// Compare the expected outputs to the actual values returned by RS.\n"; 1591963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "boolean valid = true;\n"; 1592963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "int neededUlf;\n"; 1593963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1594963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1595963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1596963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaVectorComparison(file, 3, p); 1597963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1598963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1599963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1600963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "if (!valid) {\n"; 1601963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "StringBuilder message = new StringBuilder();\n"; 1602963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1603963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1604963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1605963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVectorOutputToMessage(file, 4, p); 1606135c4b747bce5898d98de964d7c453d215254d0dJason Sams } else { 1607963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaAppendVectorInputToMessage(file, 4, p); 1608135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1609135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1610135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1611963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(4) << "assertTrue(\"Incorrect output for " << mJavaCheckMethodName 1612963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << "\" + (relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), valid);\n"; 1613963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "}\n"; 1614963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1615963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(1) << "}\n\n"; 1616963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1617963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1618963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletvoid Permutation::writeJavaCallToRs(ofstream& file, bool relaxed, bool generateCallToVerify) const { 1619963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet string script = "script"; 1620963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (relaxed) { 1621963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet script += "Relaxed"; 1622135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1623135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1624963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "try {\n"; 1625963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1626963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1627963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (p.isOutParameter) { 1628963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet writeJavaOutputAllocationDefinition(file, tab(3), p.javaAllocName, p.rsType); 1629963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1630135c4b747bce5898d98de964d7c453d215254d0dJason Sams } 1631135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1632963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (int i = 0; i < (int)mParams.size(); i++) { 1633963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1634963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (i != mReturnIndex && i != mFirstInputIndex) { 1635963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << script << ".set_" << p.rsAllocName << "(" << p.javaAllocName 1636963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << ");\n"; 1637963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1638963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1639135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1640963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << script << ".forEach_" << mRsKernelName << "("; 1641963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet bool needComma = false; 1642963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mFirstInputIndex >= 0) { 1643963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mFirstInputIndex]->javaAllocName; 1644963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet needComma = true; 1645963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1646963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (mReturnIndex >= 0) { 1647963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (needComma) { 1648963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ", "; 1649963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1650963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << mParams[mReturnIndex]->variableName << ");\n"; 1651963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1652135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1653963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (generateCallToVerify) { 1654963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << mJavaVerifyMethodName << "("; 1655963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < mParams.size(); i++) { 1656963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet const ParameterDefinition& p = *mParams[i]; 1657963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << p.variableName << ", "; 1658963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1659963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet 1660963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (relaxed) { 1661963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "true"; 1662963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } else { 1663963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << "false"; 1664963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1665963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << ");\n"; 1666963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1667963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "} catch (Exception e) {\n"; 1668963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(3) << "throw new RSRuntimeException(\"RenderScript. Can't invoke forEach_" 1669963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet << mRsKernelName << ": \" + e.toString());\n"; 1670963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet file << tab(2) << "}\n"; 1671135c4b747bce5898d98de964d7c453d215254d0dJason Sams} 1672135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1673963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} // namespace 1674135c4b747bce5898d98de964d7c453d215254d0dJason Sams 1675963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouilletint main(int argc, char* argv[]) { 1676963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int versionOfTestFiles = 0; 1677963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet vector<string> specFileNames; 1678963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!parseCommandLine(argc, argv, &versionOfTestFiles, &specFileNames)) { 1679963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet printf("Usage: gen_runtime spec_file [spec_file...] [-v version_of_test_files]\n"); 1680963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return -1; 1681963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1682963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet int result = 0; 1683963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet for (size_t i = 0; i < specFileNames.size(); i++) { 1684963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet SpecFile specFile(specFileNames[i]); 1685963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet if (!specFile.process(versionOfTestFiles)) { 1686963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet result = -1; 1687963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1688963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet } 1689963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet return result; 1690963c367450cd54403f4e54064da63c35aa7e0178Jean-Luc Brouillet} 1691