public override void Compile(CEnv env, Generator gen) { foreach (Expression arg in args) { arg.Compile(env, gen); env.PushTemporary(); } String fLabel = env.getFunctionLabel(fName); gen.Emit(new CALL(args.Count, fLabel)); foreach (Expression arg in args) { env.PopTemporary(); } }
public override void Compile(CEnv env, Generator gen) { e1.Compile(env, gen); env.PushTemporary(); e2.Compile(env, gen); switch (op) { case Operator.Add: gen.Emit(Instruction.ADD); break; case Operator.Div: gen.Emit(Instruction.DIV); break; case Operator.Mul: gen.Emit(Instruction.MUL); break; case Operator.Sub: gen.Emit(Instruction.SUB); break; case Operator.Eq: gen.Emit(Instruction.EQ); break; case Operator.Ne: gen.Emit(Instruction.EQ); gen.Emit(Instruction.NOT); break; case Operator.Ge: gen.Emit(Instruction.LT); gen.Emit(Instruction.NOT); break; case Operator.Gt: gen.Emit(Instruction.SWAP); gen.Emit(Instruction.LT); break; case Operator.Le: gen.Emit(Instruction.SWAP); gen.Emit(Instruction.LT); gen.Emit(Instruction.NOT); break; case Operator.Lt: gen.Emit(Instruction.LT); break; case Operator.And: gen.Emit(Instruction.MUL); break; case Operator.Or: gen.Emit(Instruction.ADD); gen.Emit(new CSTI(0)); gen.Emit(Instruction.EQ); gen.Emit(Instruction.NOT); break; default: throw new Exception("Unknown binary operator: " + op); } env.PopTemporary(); }