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();
            }
        }
Beispiel #2
0
        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();
        }