Changeset 187 for trunk/blade/PostfixX86.d
- Timestamp:
- 04/30/08 16:05:32 (5 months ago)
- Files:
-
- trunk/blade/PostfixX86.d (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/blade/PostfixX86.d
r173 r187 4 4 * 5 5 * Given an expression string of the form "A+(B*C)*D", and a ranklist string 6 * the entries of which correspond to A, B, C, ..., 6 * the entries of which correspond to A, B, C, ..., 7 7 * values being'0'=scalar, '1'=vector, '2'=matrix. 8 8 * This string is converted to postfix, applying simple X86-specific optimisations. … … 20 20 * u ST(1) = min(ST(0), ST(1)) 21 21 * q sqrt 22 * 1 the literal one (used to initialize a product, for example) 22 23 * 23 24 * NOT YET IMPLEMENTED: 24 * 1 the literal one (used to initialize a product, for example)25 25 * scel sin, cos, exp, log 26 26 * … … 67 67 if (left==right) return "0" ~ left ~ ",*+"; 68 68 return "0" ~ left ~ right ~ "*+"; 69 case "prod": 70 return "1" ~ left ~ "*"; 69 71 case "sum": return "0" ~ left ~ "+"; 70 72 // case "max": return left ~ "m"; … … 90 92 if (op.length==2 && op[1]=='=') { // +=, -=, *=, /= 91 93 // Convert "A+=B" into "A=A+B" 92 second = beginVisit(this_, left ~ op[0] ~ right); 94 second = beginVisit(this_, left ~ op[0] ~ right); 93 95 return second ~ first ~ "="; 94 96 } … … 107 109 if (op=="+" || op=="-") { 108 110 char [] oprvs = (op=="-")? "_" : op; 109 if (second[second.length-1]=='*'&& first[first.length-1]!='*') { 111 if (second[second.length-1]=='*'&& first[first.length-1]!='*') { 110 112 return second ~ first ~ oprvs; 111 113 } … … 146 148 return sym; 147 149 } 148 ReturnType onVisitFunction(This this_, char [] func, char [][] args) { 150 ReturnType onVisitFunction(This this_, char [] func, char [][] args) { 149 151 switch(func) { 150 152 case "dot": … … 157 159 case "abs": return doVisit(this_,args[0]) ~ "a"; 158 160 case "sqrt": return doVisit(this_,args[0]) ~ "q"; 161 case "prod": 162 return "1" ~ doVisit(this_, args[0]) ~ "*"; 159 163 default: assert(0, "BLADE ICE: Unsupported"); 160 164 } … … 175 179 if (op.length==2 && op[1]=='=') { // +=, -=, *=, /= 176 180 // Convert "A+=B" into "A=A+B" 177 second = beginVisit(this_, left ~ op[0] ~ right); 181 second = beginVisit(this_, left ~ op[0] ~ right); 178 182 return second ~ first ~ "="; 179 183 } … … 183 187 } 184 188 if (second == first) return first ~ "," ~ op; 185 189 186 190 // SSE OPTIMISATION #1 187 191 // Multiplies have a long latency, so we want to delay using the … … 200 204 return second ~ first ~ op; 201 205 } 202 } 206 } 203 207 return first ~ second ~ op; 204 208 } … … 209 213 assert(makePostfixForSSE("(A*B)+C", "101")=="AB*C+"); 210 214 assert(makePostfixForSSE("A=(B*C)", "110")=="BC*A="); 211 } 215 assert(makePostfixForSSE("prod((A*B))", "10")=="1AB**"); 216 }
