|
|
@@ -2771,10 +2771,8 @@ PRODUCTIONS
|
|
|
lNext, lFalse, lDone, qr, qs: QbeGen.QVal;
|
|
|
astA, astB: AST.Node;
|
|
|
astOp: INTEGER; .)
|
|
|
- = Fact<t, q> (. astA := astCur; .) { MulOp<op> (. IF op = SymTab.OpAnd THEN
|
|
|
- QbeGen.DelayBegin END; .)
|
|
|
- Fact<t2, q2> (. astB := astCur; IF op = SymTab.OpAnd THEN
|
|
|
- QbeGen.DelayEnd END; .)
|
|
|
+ = Fact<t, q> (. astA := astCur; .) { MulOp<op>
|
|
|
+ Fact<t2, q2> (. astB := astCur; .)
|
|
|
(. astOp := AST.OpMul;
|
|
|
IF op = SymTab.OpSlash THEN astOp := AST.OpDiv
|
|
|
ELSIF op = SymTab.OpDiv THEN astOp := AST.OpDiv
|
|
|
@@ -2787,39 +2785,19 @@ PRODUCTIONS
|
|
|
IF SymTab.BoolCheck(t) AND SymTab.BoolCheck(t2) THEN
|
|
|
t := SymTab.BoolType()
|
|
|
ELSE SemError(212); t := SymTab.InvalidType END;
|
|
|
- IF t # SymTab.InvalidType THEN
|
|
|
- QbeGen.Slot4(qs);
|
|
|
- QbeGen.NewLabel(lNext);
|
|
|
- QbeGen.NewLabel(lFalse);
|
|
|
- QbeGen.NewLabel(lDone);
|
|
|
- QbeGen.Jnz(q, lNext, lFalse);
|
|
|
- QbeGen.EmitLabel(lNext);
|
|
|
- QbeGen.DelayFlush;
|
|
|
- QbeGen.StoreW(qs, q2);
|
|
|
- QbeGen.Jmp(lDone);
|
|
|
- QbeGen.EmitLabel(lFalse);
|
|
|
- QbeGen.StoreW(qs, "0");
|
|
|
- QbeGen.Jmp(lDone);
|
|
|
- QbeGen.EmitLabel(lDone);
|
|
|
- QbeGen.LoadW(qs, qr);
|
|
|
- QbeGen.CopyOp(qr, q)
|
|
|
- ELSE QbeGen.DelayFlush; QbeGen.CopyOp("0", q)
|
|
|
- END
|
|
|
+ IF t # SymTab.InvalidType THEN QbeGen.CopyOp("@", q)
|
|
|
+ ELSE QbeGen.CopyOp("0", q)
|
|
|
+ END
|
|
|
ELSIF (t # SymTab.InvalidType) AND (t2 # SymTab.InvalidType)
|
|
|
AND (SymTab.ClassOf(t) = SymTab.ClSet)
|
|
|
AND (SymTab.ClassOf(t2) = SymTab.ClSet) THEN
|
|
|
- lw := SymTab.SetWords(t); rw := SymTab.SetWords(t2);
|
|
|
- mw := lw;
|
|
|
- IF rw > mw THEN mw := rw END;
|
|
|
- IF op = SymTab.OpTimes THEN
|
|
|
- QbeGen.SetBinOp(1, q, q2, lw, rw, qt)
|
|
|
- ELSE
|
|
|
- QbeGen.SetBinOp(3, q, q2, lw, rw, qt)
|
|
|
- END;
|
|
|
- t := SymTab.NewSet(
|
|
|
- SymTab.NewSubR(0,
|
|
|
- VAL(INTEGER, mw) * 32 - 1));
|
|
|
- QbeGen.CopyOp(qt, q)
|
|
|
+ lw := SymTab.SetWords(t); rw := SymTab.SetWords(t2);
|
|
|
+ mw := lw;
|
|
|
+ IF rw > mw THEN mw := rw END;
|
|
|
+ t := SymTab.NewSet(
|
|
|
+ SymTab.NewSubR(0,
|
|
|
+ VAL(INTEGER, mw) * 32 - 1));
|
|
|
+ QbeGen.CopyOp("@", q)
|
|
|
ELSE
|
|
|
IF SymTab.ArithCheck(t, t2,
|
|
|
(op = SymTab.OpDiv) OR (op = SymTab.OpMod),
|
|
|
@@ -2841,36 +2819,9 @@ PRODUCTIONS
|
|
|
END
|
|
|
END;
|
|
|
IF folded THEN QbeGen.CopyOp(qf, q)
|
|
|
- ELSE
|
|
|
- IF isL THEN
|
|
|
- IF SymTab.IsIntFamily(lt) THEN
|
|
|
- QbeGen.WidenLong(q, wq); QbeGen.CopyOp(wq, q)
|
|
|
- END;
|
|
|
- IF SymTab.IsIntFamily(rt) THEN
|
|
|
- QbeGen.WidenLong(q2, wq); QbeGen.CopyOp(wq, q2)
|
|
|
- END;
|
|
|
- QbeGen.NewTemp(qt);
|
|
|
- IF op = SymTab.OpTimes THEN
|
|
|
- QbeGen.Op3L("mul", qt, q, q2)
|
|
|
- ELSIF (op = SymTab.OpDiv)
|
|
|
- OR (op = SymTab.OpSlash) THEN
|
|
|
- QbeGen.Op3L("div", qt, q, q2)
|
|
|
- ELSE
|
|
|
- QbeGen.Op3L("rem", qt, q, q2)
|
|
|
- END
|
|
|
- ELSE
|
|
|
- QbeGen.NewTemp(qt);
|
|
|
- IF op = SymTab.OpTimes THEN
|
|
|
- QbeGen.Op3("mul", qt, q, q2, isR)
|
|
|
- ELSIF (op = SymTab.OpDiv)
|
|
|
- OR (op = SymTab.OpSlash) THEN
|
|
|
- QbeGen.Op3("div", qt, q, q2, isR)
|
|
|
- ELSE
|
|
|
- QbeGen.Op3("rem", qt, q, q2, isR)
|
|
|
- END
|
|
|
- END;
|
|
|
- QbeGen.CopyOp(qt, q)
|
|
|
- END
|
|
|
+ ELSE
|
|
|
+ QbeGen.CopyOp("@", q)
|
|
|
+ END
|
|
|
ELSE QbeGen.CopyOp("0", q)
|
|
|
END
|
|
|
END; .) } .
|