Changeset 137

Show
Ignore:
Timestamp:
11/15/07 03:34:56 (10 months ago)
Author:
Don Clugston
Message:

X87 code generation now uses the revised expressions.

Files:

Legend:

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

    r136 r137  
    170170{ 
    171171    char [] result = assertAllVectorLengthsEqual(tree); 
    172     result ~= "X87VECGEN!(" ~ wrapInQuotes(tree.expression); 
     172    result ~= "X87VECGEN!(" ~ wrapInQuotes(revised.expression); 
    173173    char [] vals; 
    174 /*     
     174     
    175175    for (int i=0; i<revised.mapping.length;++i) { 
    176176        int x = revised.mapping[i]-'A'; 
    177177        char rnk; 
    178178        char [] v; 
     179        char [] t; 
    179180        if (x<tree.symbolTable.length) { 
    180181            // it's an original symbol 
    181182            rnk = tree.symbolTable[x].rank; 
    182183            v = tree.symbolTable[x].value; 
     184            t = tree.symbolTable[x].type; 
    183185        } else { 
    184186            // it's a compound 
     
    189191                else v ~= c; 
    190192            } 
    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 */ 
    200     for (int i=0; i<tree.symbolTable.length;++i) { 
    201         char [] t = tree.symbolTable[i].type; 
    202         if (tree.symbolTable[i].rank=='0') { 
     193            v ~= ")"; 
     194            if (rnk=='0') t = "real"; // convert all compounds to real 
     195            else { // for arrays, the type is the type of the original array 
     196                t = tree.symbolTable[revised.compounds[x-tree.symbolTable.length][0]].type; 
     197            } 
     198        } 
     199        result ~= ","; 
     200        if (rnk=='0') { 
    203201            // Convert scalars into standard form. 
    204202            // long, ulong, and real must become real. 
    205203            // We convert everything else to double, since that uses less 
    206204            // FPU stack space.            
    207             if (t == "real" || t == "double" || t == "float") result ~= "," ~ t; 
    208             else if (t == "long" || t == "ulong") result ~= ",real"; 
     205            if (t == "real" || t == "double" || t == "float") result ~= t; 
     206            else if (t == "long" || t == "ulong") result ~= "real"; 
    209207            else result ~= "double"; // Convert all other scalars into doubles. 
    210208         } 
    211         else if (startsWith(t, "real[")) result ~= ",real*"; 
    212         else if (startsWith(t, "float[")) result ~= ",float*"; 
    213         else if (startsWith(t, "double[")) result~= ",double*"; 
    214         // else error. 
    215         vals ~="," ~ tree.symbolTable[i].value; 
     209        else if (startsWith(t, "real[")) result ~= "real*"; 
     210        else if (startsWith(t, "float[")) result ~= "float*"; 
     211        else if (startsWith(t, "double[")) result~= "double*"; 
     212        vals ~= "," ~ v; 
    216213        // for vectors, we only need the pointer, not the length 
    217         if (tree.symbolTable[i].rank=='1') vals ~= ".ptr"; 
    218     }     
     214        if (rnk=='1') vals ~= ".ptr"; 
     215    } 
    219216    result ~= ")("; 
    220217    int firstVector = findVectorForLength(tree);