Changeset 136

Show
Ignore:
Timestamp:
11/14/07 13:04:41 (9 months ago)
Author:
Don Clugston
Message:

Partial merger of the new RevisedExpression? into x87 code.

Files:

Legend:

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

    r135 r136  
    6969        return invokeSSE((exprType == VecExpressionType.SSE2Expression), tree, revised); 
    7070    } else if (exprType == VecExpressionType.X87Expression) { 
    71         return invokeX87(tree); 
     71        return invokeX87(tree, revised); 
    7272    } else { 
    7373//        return "pragma(msg, " ~ wrapInQuotes(DCodeGenerator(tree)) ~ ");" ~ DCodeGenerator(tree); 
     
    167167 
    168168/// Generate code which will call the X87 function 
    169 char [] invokeX87(AbstractSyntaxTree tree
     169char [] invokeX87(AbstractSyntaxTree tree, RevisedExpression revised
    170170{ 
    171171    char [] result = assertAllVectorLengthsEqual(tree); 
    172172    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*/ 
    173200    for (int i=0; i<tree.symbolTable.length;++i) { 
    174201        char [] t = tree.symbolTable[i].type; 
     
    186213        else if (startsWith(t, "double[")) result~= ",double*"; 
    187214        // 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    }     
    189219    result ~= ")("; 
    190220    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 ~ ");"; 
    198222} 
    199223 
     
    235259    } 
    236260             
    237 /*     
    238     for (int i=0; i<tree.symbolTable.length;++i) { 
    239         if (revised.used[i]=='-') continue; // ignore unused symbols 
    240         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 length 
    244         if (tree.symbolTable[i].rank=='1') vals ~= ".ptr"; 
    245     } 
    246     // Now deal with all of the compound expressions 
    247     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 */     
    259261    result ~= ")("; 
    260262    int firstVector = findVectorForLength(tree); 
  • trunk/blade/BladeSimplify.d

    r135 r136  
    1313*      where B and C are both rank 0, and A is rank 1 or more, the slice can 
    1414*      be moved to every vector inside A. 
    15 *    - Convert A[]*B into B*A[] (assumes * is commutative, 
    16 *      not valid for quaternions). 
    1715*    - Use associativity of *: A*(B*C[]) == (A*B)*C[] 
    1816*    - 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). 
    1920*    - Convert C-A*B into C+(-A)*B whenever possible. 
    2021* 
  • trunk/blade/CodegenX86.d

    r126 r136  
    273273    char [] result = ""; 
    274274    for (int i=2; i<numVectors; ++i) result~= " push " ~ vectorRegister[i] ~ ";"; 
    275     return result ~ "\n"
     275    return result ~ \n
    276276} 
    277277