public override void Visit(AmlParser.DefDivide defDivide)
        {
            const int divisorLocal  = AmlStackFrame.FirstReservedLocal;
            const int dividendLocal = divisorLocal + 1;

            // Push all operands on stack first, since subexpressions may use the reserved locals
            if (!IsNullTarget(defDivide.remainder.target))
            {
                defDivide.remainder.target.Accept(this);
            }
            if (!IsNullTarget(defDivide.quotient.target))
            {
                defDivide.quotient.target.Accept(this);
            }
            result.Add(new PushLocalObj(divisorLocal));
            defDivide.divisor.Accept(this);
            result.Add(new PushLocalObj(dividendLocal));
            defDivide.dividend.Accept(this);

            result.Add(new Store()); // Store dividend expression in dividendLocal
            result.Add(new Store()); // store divisor expression in divisorLocal

            if (!IsNullTarget(defDivide.quotient.target))
            {
                result.Add(new PushLocalObj(divisorLocal));
                result.Add(new PushLocalObj(dividendLocal));
                result.Add(new Divide());
                result.Add(new Store()); // Store quotient in quotient.target
            }

            if (!IsNullTarget(defDivide.remainder.target))
            {
                result.Add(new PushLocalObj(divisorLocal));
                result.Add(new PushLocalObj(dividendLocal));
                result.Add(new Remainder());
                result.Add(new Store()); // Store remainder in remainder.target
            }
        }
Exemple #2
0
 public virtual void Visit(AmlParser.DefDivide defDivide)
 {
     UnhandledNodeType("DefDivide");
 }