AstNodePtr SymbolicMultiply:: CodeGenOP( AstInterface &fa, const AstNodePtr& a1, const AstNodePtr& a2) const { int val = 0; if (fa.IsConstInt(a1, &val) && val == -1) return fa.CreateUnaryOP(AstInterface::UOP_MINUS, a2); else if (fa.IsConstInt(a2, &val) && val == -1) return fa.CreateUnaryOP(AstInterface::UOP_MINUS, a1); return fa.CreateBinaryOP(AstInterface::BOP_TIMES, a1, a2); }
AstNodePtr SymbolicFunction :: CodeGen( AstInterface &_fa) const { AstInterface::AstNodeList l; for (const_iterator i = args.begin(); i != args.end(); ++i) { SymbolicVal cur = *i; AstNodePtr curast = cur.CodeGen(_fa); l.push_back(curast); } if (t == AstInterface::OP_NONE) { return _fa.CreateFunctionCall( op, l); } else if (t == AstInterface::OP_ARRAY_ACCESS) { AstNodePtr arr = l.front(); l.pop_front(); return _fa.CreateArrayAccess(arr, l); } else if (t == AstInterface::OP_ASSIGN && l.size() == 2) { return _fa.CreateAssignment(l.front(), l.back()); } else if (l.size() == 2) return _fa.CreateBinaryOP( t, l.front(), l.back()); else { assert(l.size() == 1); return _fa.CreateUnaryOP( t, l.front()); } }