Changeset 136
- Timestamp:
- 11/14/07 13:04:41 (9 months ago)
- Files:
-
- trunk/blade/Blade.d (modified) (4 diffs)
- trunk/blade/BladeSimplify.d (modified) (1 diff)
- trunk/blade/CodegenX86.d (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/blade/Blade.d
r135 r136 69 69 return invokeSSE((exprType == VecExpressionType.SSE2Expression), tree, revised); 70 70 } else if (exprType == VecExpressionType.X87Expression) { 71 return invokeX87(tree );71 return invokeX87(tree, revised); 72 72 } else { 73 73 // return "pragma(msg, " ~ wrapInQuotes(DCodeGenerator(tree)) ~ ");" ~ DCodeGenerator(tree); … … 167 167 168 168 /// Generate code which will call the X87 function 169 char [] invokeX87(AbstractSyntaxTree tree )169 char [] invokeX87(AbstractSyntaxTree tree, RevisedExpression revised) 170 170 { 171 171 char [] result = assertAllVectorLengthsEqual(tree); 172 172 result ~= "X87VECGEN!(" ~ wrapInQuotes(tree.expression); 173 char [] vals; 174 /* 175 for (int i=0; i<revised.mapping.length;++i) { 176 int x = revised.mapping[i]-'A'; 177 char rnk; 178 char [] v; 179 if (x<tree.symbolTable.length) { 180 // it's an original symbol 181 rnk = tree.symbolTable[x].rank; 182 v = tree.symbolTable[x].value; 183 } else { 184 // it's a compound 185 rnk = revised.rank[x-tree.symbolTable.length]; 186 v = "("; 187 foreach(c; revised.compounds[x-tree.symbolTable.length]) { 188 if (c>='A' && c<='Z') v ~= tree.symbolTable[c-'A'].value; 189 else v ~= c; 190 } 191 v ~=")"; 192 } 193 if (rnk=='0') result ~= scalartype; 194 else result ~= vectortype; 195 vals ~= "," ~ v; 196 // for vectors, we only need the pointer, not the length 197 if (rnk=='1') vals ~= ".ptr"; 198 } 199 */ 173 200 for (int i=0; i<tree.symbolTable.length;++i) { 174 201 char [] t = tree.symbolTable[i].type; … … 186 213 else if (startsWith(t, "double[")) result~= ",double*"; 187 214 // else error. 188 } 215 vals ~="," ~ tree.symbolTable[i].value; 216 // for vectors, we only need the pointer, not the length 217 if (tree.symbolTable[i].rank=='1') vals ~= ".ptr"; 218 } 189 219 result ~= ")("; 190 220 int firstVector = findVectorForLength(tree); 191 result ~= tree.symbolTable[firstVector].value ~ ".length"; 192 for (int i=0; i<tree.symbolTable.length;++i) { 193 result ~="," ~ tree.symbolTable[i].value; 194 // for vectors, we only need the pointer, not the length 195 if (tree.symbolTable[i].rank=='1') result ~= ".ptr"; 196 } 197 return result~ ");"; 221 return result ~ tree.symbolTable[firstVector].value ~ ".length" ~ vals ~ ");"; 198 222 } 199 223 … … 235 259 } 236 260 237 /*238 for (int i=0; i<tree.symbolTable.length;++i) {239 if (revised.used[i]=='-') continue; // ignore unused symbols240 if (tree.symbolTable[i].rank=='0') result ~= scalartype;241 else result ~= vectortype;242 vals ~= "," ~ tree.symbolTable[i].value;243 // for vectors, we only need the pointer, not the length244 if (tree.symbolTable[i].rank=='1') vals ~= ".ptr";245 }246 // Now deal with all of the compound expressions247 for (int i=0; i<revised.rank.length;++i) {248 if (revised.rank[i]=='0') result ~= scalartype;249 else result ~= vectortype;250 char [] s = "";251 foreach(c; revised.compounds[i]) {252 if (c>='A' && c<='Z') s ~= tree.symbolTable[c-'A'].value;253 else s ~= c;254 }255 if (revised.rank[i]=='1') vals ~= ",(" ~ s ~ ").ptr";256 else vals ~= "," ~ s;257 }258 */259 261 result ~= ")("; 260 262 int firstVector = findVectorForLength(tree); trunk/blade/BladeSimplify.d
r135 r136 13 13 * where B and C are both rank 0, and A is rank 1 or more, the slice can 14 14 * be moved to every vector inside A. 15 * - Convert A[]*B into B*A[] (assumes * is commutative,16 * not valid for quaternions).17 15 * - Use associativity of *: A*(B*C[]) == (A*B)*C[] 18 16 * - Use * distributive law over + and -. (Not strictly correct). 17 * (D) Expression standardisation 18 * - Move multiplies to left: Convert A[]*B into B*A[] (assumes * is commutative, 19 * not valid for quaternions). 19 20 * - Convert C-A*B into C+(-A)*B whenever possible. 20 21 * trunk/blade/CodegenX86.d
r126 r136 273 273 char [] result = ""; 274 274 for (int i=2; i<numVectors; ++i) result~= " push " ~ vectorRegister[i] ~ ";"; 275 return result ~ "\n";275 return result ~ \n; 276 276 } 277 277
