Changeset 301 for proto


Ignore:
Timestamp:
Sep 11, 2009, 2:52:16 PM (10 years ago)
Author:
eamiri
Message:

simple_op supports any number of variables

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/parabix2/Compiler/bitstream_compiler.py

    r299 r301  
    66#  Code Generation
    77#
     8
     9def pairs(lst):
     10        if lst == []:
     11                return []
     12        return zip(lst,lst[1:]+[lst[0]])
    813
    914Nop = 'nop'
     
    1318Xor = 'simd_xor'
    1419Not = 'not'
     20Sel = 'simd_if'
    1521Add = 'simd_add'
    1622Sub = 'simd_sub'
     
    2228        def __init__(self, *arg):
    2329                self.op = arg[0]
    24                 self.first = arg[1]
    25                 if len(arg) > 2:
    26                         self.second = arg[2]
    27                 else:
    28                         assert(self.op==Nop)
    29                         self.second = None
    30 
     30                self.vars = list(arg[1:])
     31               
    3132        def show(self):
    3233                if self.op == Nop:
    33                         return "%s\n"%self.first
     34                        return "%s\n"%self.vars[0]
    3435                else:
    35                         return "%s(%s, %s)\n"%(self.op, self.first, self.second)
     36                        line_of_code = self.op + "("
     37                       
     38                        for index, var in enumerate(self.vars):
     39                                line_of_code += str(var)
     40                                if index+1 < len(self.vars):
     41                                        line_of_code += ', '
     42                       
     43                        line_of_code += ')\n'
     44                       
     45                        return line_of_code
     46       
    3647        def update_var(self, old, new):
    37                 if self.first == old:
    38                         self.first = new
    39                 if self.second == old:
    40                         self.second = new
     48                while old in self.vars:
     49                        i = self.vars.index(old)
     50                        self.vars[i] = new
    4151
    4252class CodeGenObject:
     
    108118       e1 = genobj.expr_string_to_variable(expr2simd(genobj, expr.true_branch))
    109119       e2 = genobj.expr_string_to_variable(expr2simd(genobj, expr.false_branch))
    110        return None
    111        #return 'simd_if(%s, %s, %s)' %(sel, e1, e2)
    112        ## TODO; Do something for this. It should be removed
     120       return simple_op(Sel, sel, e1, e2)
    113121    elif isinstance(expr, bitexpr.Add):
    114122       e1 = genobj.expr_string_to_variable(expr2simd(genobj, expr.operand1))
     
    136144                        table[stmt.LHS] = [[index],[]]
    137145               
    138                 if stmt.RHS.first in table:
    139                         table[stmt.RHS.first][1].append(index)
    140                 else:
    141                         table[stmt.RHS.first] = [[], [index]]
    142                
    143                 if stmt.RHS.second is None or stmt.RHS.second==stmt.RHS.first:
    144                         continue
    145                
    146                 if stmt.RHS.second in table:
    147                         table[stmt.RHS.second][1].append(index)
    148                 else:
    149                         table[stmt.RHS.second] = [[], [index]]
    150 
     146                for var in stmt.RHS.vars:
     147                        if var in table:
     148                                table[var][1].append(index)
     149                        else:
     150                                table[var] = [[], [index]]
     151                               
    151152        return table
    152 
    153 
    154 def pairs(lst):
    155         if lst == []:
    156                 return []
    157         return zip(lst,lst[1:]+[lst[0]])
    158 
    159153
    160154def make_SSA(code, st):
     
    175169                                use_index += 1
    176170                                uline = st[var][1][use_index]
    177 
    178 
    179 
    180 
    181 def copy_propagation(code, st):
    182         """Assumes the code is in SSA form"""
    183         """TODO: THIS IS NOT COMPLETE"""
    184         dic = {}
    185         for stmt in code:
    186                 if stmt.RHS.op == Nop:
    187                         dic[stmt.LHS] = stmt.RHS.first
    188        
    189         for i in dic:
    190                 if not dic[i] in dic:
    191                         continue
    192                 while dic[i] in dic:
    193                         i = dic[i]
    194                 dic[i] = i
    195 
    196         return dic
    197 
    198 
    199 
    200171
    201172if __name__ == '__main__':
Note: See TracChangeset for help on using the changeset viewer.