Beispiel #1
0
def p_LValueExpr(p):
    """LValueExpr : ID '[' Expr ']'
                  | ID"""
    # ID '[' Expr ']'
    if len(p) == 5:
        p[0] = IR.VecAcc(p[1], p[3])

    # ID
    elif len(p) == 2:
        p[0] = IR.Var(p[1])
Beispiel #2
0
 def factor(self, symtab):
     if self.accept('ident'):
         var = symtab.find(self.value)
         offs = self.array_offset(symtab)
         if offs is None:
             return ir.Var(var=var, symtab=symtab)
         else:
             return ir.ArrayElement(var=var, offset=offs, symtab=symtab)
     if self.accept('number'):
         return ir.Const(value=int(self.value), symtab=symtab)
     elif self.accept('lparen'):
         expr = self.expression()
         self.expect('rparen')
         return expr
     else:
         self.error("factor: syntax error")
         self.getsym()
Beispiel #3
0
 def linearize_cjump(self, tree, children):
     if isinstance(children[0], ir.ESeq):
         # cjump(eseq[stms,e1],e2) => seq([stms,cjump(e1,e2)])
         eseq = children[0]
         stms = self.stms(eseq)
         e1 = eseq.children[-1]
         assert (not isinstance(e1, ir.ESeq))
         e2 = children[1]
         newtree = ir.Seq(
             stms + [
                 ir.CJump(tree.op, e1, e2, tree.trueDest, tree.falseDest,
                          tree.node)
             ], eseq.node)
         newtree = self.linearize(newtree)
     elif isinstance(children[1], ir.ESeq):
         #cjump(e1,eseq(stms,e2))
         # => seq([stms,cjump(e1,e2)]) IF commutes(e1,stms)
         # => seq(move(temp(t),e1), seq(stms,cjump(t, e2)) otherwise
         eseq = children[1]
         e1 = children[0]
         e2 = eseq.children[-1]
         stms = self.stms(eseq)
         if commutes(e1, stms):
             newtree = ir.Seq(
                 stms + \
                 [ir.CJump(tree.op,e1,e2,
                           tree.trueDest, tree.falseDest,
                           tree.node)],
                 eseq.node)
             newtree = self.linearize(newtree)
         else:
             t = ir.Var(self.symbols.newTemp(e1.datatype), e1.node,
                        e1.datatype)
             move = ir.Move(t, e1, e1.node, e1.datatype)
             cjump = ir.CJump(tree.op, t, e2, tree.trueDest, tree.falseDest,
                              tree.node)
             newtree = ir.Seq([move] + stms + [cjump], tree.node)
             newtree = self.linearize(newtree)
     else:
         newtree = copy.copy(tree)
         newtree.children = children
     return newtree
Beispiel #4
0
 def linearize_binop(self, tree, children):
     if isinstance(children[0], ir.ESeq):
         # binop(eseq[stms,e1],e2) => eseq([stms,binop(e1,e2)])
         eseq = children[0]
         stms = self.stms(eseq)
         e1 = eseq.children[-1]
         assert (not isinstance(e1, ir.ESeq))
         e2 = children[1]
         newtree = ir.ESeq(
             stms, ir.Binop(tree.op, [e1, e2], tree.node, tree.datatype),
             eseq.node, eseq.datatype)
         newtree = self.linearize(newtree)
     elif isinstance(children[1], ir.ESeq):
         #binop(e1,eseq(stms,e2))
         # => eseq([stms,binop(e1,e2)]) IF commutes(e1,stms)
         # => eseq(move(temp(t),e1), eseq(stms,binop(t, e2)) otherwise
         eseq = children[1]
         e1 = children[0]
         e2 = eseq.children[-1]
         stms = self.stms(eseq)
         if commutes(e1, stms):
             newtree = ir.ESeq(
                 stms, ir.Binop(tree.op, [e1, e2], tree.node,
                                tree.datatype), eseq.node, eseq.datatype)
             newtree = self.linearize(newtree)
         else:
             t = ir.Var(self.symbols.newTemp(e1.datatype), e1.node,
                        e1.datatype)
             move = ir.Move(t, e1, e1.node, e1.datatype)
             binop = ir.Binop(tree.op, [t, e2], tree.node, tree.datatype)
             eseq = ir.ESeq(stms, binop, eseq.node, eseq.datatype)
             newtree = ir.ESeq([move], eseq, tree.node, tree.datatype)
             newtree = self.linearize(newtree)
     else:
         newtree = ir.Binop(tree.op, children, tree.node, tree.datatype)
     return newtree
Beispiel #5
0
def p_PrimExprID(p):
    """PrimExpr : ID"""
    p[0] = IR.Var(p[1])
Beispiel #6
0
 def get_gradient_var(self):
     temp_ir = ir.Var("@_gradient", absyn.Empty(0), fracttypes.Gradient)
     var = self.var(temp_ir)
     return var
 def var(self, name="a"):
     return ir.Var(name, self.fakeNode, Int)