Show
Ignore:
Timestamp:
04/30/08 16:05:32 (5 months ago)
Author:
Don Clugston
Message:

Added prod(). Use .ptr to get raw data, so it works with Bill Baxter's ArrayView?.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/blade/PostfixX86.d

    r173 r187  
    44* 
    55* 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, ..., 
    77* values being'0'=scalar, '1'=vector, '2'=matrix. 
    88* This string is converted to postfix, applying simple X86-specific optimisations. 
     
    2020*  u            ST(1) = min(ST(0), ST(1)) 
    2121*  q            sqrt 
     22*  1            the literal one (used to initialize a product, for example) 
    2223* 
    2324*  NOT YET IMPLEMENTED: 
    24 *  1            the literal one (used to initialize a product, for example) 
    2525*  scel         sin, cos, exp, log 
    2626* 
     
    6767            if (left==right) return "0" ~ left ~ ",*+"; 
    6868            return "0" ~ left ~ right ~ "*+"; 
     69        case "prod": 
     70            return "1" ~ left ~ "*"; 
    6971        case "sum":  return "0" ~ left ~ "+"; 
    7072//        case "max":  return left ~ "m"; 
     
    9092        if (op.length==2 && op[1]=='=') { // +=, -=, *=, /= 
    9193            // Convert "A+=B" into "A=A+B" 
    92             second = beginVisit(this_, left ~ op[0] ~ right);             
     94            second = beginVisit(this_, left ~ op[0] ~ right); 
    9395            return second ~ first ~ "="; 
    9496        } 
     
    107109        if (op=="+" || op=="-") { 
    108110            char [] oprvs = (op=="-")? "_" : op; 
    109             if (second[second.length-1]=='*'&& first[first.length-1]!='*') {                
     111            if (second[second.length-1]=='*'&& first[first.length-1]!='*') { 
    110112               return second ~ first ~ oprvs; 
    111113            } 
     
    146148        return sym; 
    147149    } 
    148     ReturnType onVisitFunction(This this_, char [] func, char [][] args) {       
     150    ReturnType onVisitFunction(This this_, char [] func, char [][] args) { 
    149151        switch(func) { 
    150152        case "dot": 
     
    157159        case "abs": return doVisit(this_,args[0]) ~ "a"; 
    158160        case "sqrt": return doVisit(this_,args[0]) ~ "q"; 
     161        case "prod": 
     162            return "1" ~ doVisit(this_, args[0]) ~ "*"; 
    159163        default:   assert(0, "BLADE ICE: Unsupported"); 
    160164        } 
     
    175179        if (op.length==2 && op[1]=='=') { // +=, -=, *=, /= 
    176180            // Convert "A+=B" into "A=A+B" 
    177             second = beginVisit(this_, left ~ op[0] ~ right);             
     181            second = beginVisit(this_, left ~ op[0] ~ right); 
    178182            return second ~ first ~ "="; 
    179183        } 
     
    183187        } 
    184188        if (second == first) return first ~ "," ~ op; 
    185          
     189 
    186190        // SSE OPTIMISATION #1 
    187191        // Multiplies have a long latency, so we want to delay using the 
     
    200204                   return second ~ first ~ op; 
    201205            } 
    202         }     
     206        } 
    203207        return first ~ second ~ op; 
    204208    } 
     
    209213assert(makePostfixForSSE("(A*B)+C", "101")=="AB*C+"); 
    210214assert(makePostfixForSSE("A=(B*C)", "110")=="BC*A="); 
    211 
     215assert(makePostfixForSSE("prod((A*B))", "10")=="1AB**"); 
     216