|
|
@@ -1794,7 +1794,11 @@ PROCEDURE LowerBuiltinStmt (n: AST.Node; nm: SymTab.Name);
|
|
|
IF at = SymTab.InvalidType THEN
|
|
|
ELSIF SymTab.ClassOf(at) # SymTab.ClSet THEN
|
|
|
ELSE
|
|
|
- IF SymTab.IsPackedSet(at) THEN
|
|
|
+ IF SymTab.IsBigSet(at) THEN
|
|
|
+ IF isInc THEN QbeGen.BigSetBit(qd, qe, SymTab.BigSetSigned(at))
|
|
|
+ ELSE QbeGen.BigSetClearBit(qd, qe, SymTab.BigSetSigned(at))
|
|
|
+ END
|
|
|
+ ELSIF SymTab.IsPackedSet(at) THEN
|
|
|
IF isInc THEN QbeGen.PackedSetBit(qd, at, qe,
|
|
|
SymTab.SetBaseLo(at),
|
|
|
SymTab.SetCount(at))
|
|
|
@@ -2169,17 +2173,29 @@ PROCEDURE LowerExprFull (n: AST.Node; VAR t: SymTab.TypeIndex;
|
|
|
END
|
|
|
ELSIF AST.Kind(n) = AST.NkSetLit THEN
|
|
|
t := AST.Ty(n); IF t = -1 THEN t := SymTab.NewSet(SymTab.NewSubR(0, 255)) END;
|
|
|
- QbeGen.NewSetTemp(8, q); QbeGen.SetZero(q, 8);
|
|
|
+ IF SymTab.IsBigSet(t) THEN
|
|
|
+ QbeGen.NewSetTemp(2, q); QbeGen.SetZero(q, 2)
|
|
|
+ ELSE
|
|
|
+ QbeGen.NewSetTemp(8, q); QbeGen.SetZero(q, 8)
|
|
|
+ END;
|
|
|
i := 0;
|
|
|
WHILE i < AST.NChild(n) DO
|
|
|
el := AST.Child(n, i);
|
|
|
IF AST.Kind(el) = AST.NkSubrange THEN
|
|
|
LowerExpr(AST.Child(el, 0), t2, q2);
|
|
|
LowerExpr(AST.Child(el, 1), t2, qt);
|
|
|
- QbeGen.SetRange(q, q2, qt, SymTab.SetBaseLo(t), SymTab.SetCount(t))
|
|
|
+ IF SymTab.IsBigSet(t) THEN
|
|
|
+ QbeGen.BigSetRange(q, q2, qt, SymTab.BigSetSigned(t))
|
|
|
+ ELSE
|
|
|
+ QbeGen.SetRange(q, q2, qt, SymTab.SetBaseLo(t), SymTab.SetCount(t))
|
|
|
+ END
|
|
|
ELSE
|
|
|
LowerExpr(el, t2, q2);
|
|
|
- QbeGen.SetBit(q, q2, SymTab.SetBaseLo(t), SymTab.SetCount(t))
|
|
|
+ IF SymTab.IsBigSet(t) THEN
|
|
|
+ QbeGen.BigSetBit(q, q2, SymTab.BigSetSigned(t))
|
|
|
+ ELSE
|
|
|
+ QbeGen.SetBit(q, q2, SymTab.SetBaseLo(t), SymTab.SetCount(t))
|
|
|
+ END
|
|
|
END;
|
|
|
INC(i)
|
|
|
END
|
|
|
@@ -2189,7 +2205,9 @@ PROCEDURE LowerExprFull (n: AST.Node; VAR t: SymTab.TypeIndex;
|
|
|
constructors are not lowered here yet. *)
|
|
|
t := AST.Ty(n);
|
|
|
IF (t # SymTab.InvalidType) AND (SymTab.ClassOf(t) = SymTab.ClSet) THEN
|
|
|
- IF SymTab.SetWords(t) = 0 THEN
|
|
|
+ IF SymTab.IsBigSet(t) THEN
|
|
|
+ QbeGen.NewSetTemp(2, q); QbeGen.SetZero(q, 2)
|
|
|
+ ELSIF SymTab.SetWords(t) = 0 THEN
|
|
|
QbeGen.NewSetTemp(8, q); QbeGen.SetZero(q, 8)
|
|
|
ELSE
|
|
|
QbeGen.NewSetTemp(SymTab.SetWords(t), q);
|
|
|
@@ -2204,11 +2222,19 @@ PROCEDURE LowerExprFull (n: AST.Node; VAR t: SymTab.TypeIndex;
|
|
|
IF AST.Kind(el) = AST.NkSubrange THEN
|
|
|
LowerExpr(AST.Child(el, 0), t2, q2);
|
|
|
LowerExpr(AST.Child(el, 1), t2, qt);
|
|
|
- QbeGen.SetRange(q, q2, qt, SymTab.SetBaseLo(t),
|
|
|
- SymTab.SetCount(t))
|
|
|
+ IF SymTab.IsBigSet(t) THEN
|
|
|
+ QbeGen.BigSetRange(q, q2, qt, SymTab.BigSetSigned(t))
|
|
|
+ ELSE
|
|
|
+ QbeGen.SetRange(q, q2, qt, SymTab.SetBaseLo(t),
|
|
|
+ SymTab.SetCount(t))
|
|
|
+ END
|
|
|
ELSE
|
|
|
LowerExpr(el, t2, q2);
|
|
|
- QbeGen.SetBit(q, q2, SymTab.SetBaseLo(t), SymTab.SetCount(t))
|
|
|
+ IF SymTab.IsBigSet(t) THEN
|
|
|
+ QbeGen.BigSetBit(q, q2, SymTab.BigSetSigned(t))
|
|
|
+ ELSE
|
|
|
+ QbeGen.SetBit(q, q2, SymTab.SetBaseLo(t), SymTab.SetCount(t))
|
|
|
+ END
|
|
|
END
|
|
|
END;
|
|
|
INC(i)
|
|
|
@@ -2287,7 +2313,9 @@ PROCEDURE LowerExprFull (n: AST.Node; VAR t: SymTab.TypeIndex;
|
|
|
END;
|
|
|
rop := SymTab.OpEq; folded := RelSym(op, rop);
|
|
|
IF op = AST.OpIn THEN
|
|
|
- IF SymTab.IsPackedSet(t2) THEN
|
|
|
+ IF SymTab.IsBigSet(t2) THEN
|
|
|
+ QbeGen.BigInSet(q, q2, SymTab.BigSetSigned(t2), qt)
|
|
|
+ ELSIF SymTab.IsPackedSet(t2) THEN
|
|
|
QbeGen.PackedInSet(q, q2, SymTab.SetBaseLo(t2),
|
|
|
SymTab.SetCount(t2), t2, qt)
|
|
|
ELSE QbeGen.InSet(q, q2, SymTab.SetBaseLo(t2),
|
|
|
@@ -2300,12 +2328,20 @@ PROCEDURE LowerExprFull (n: AST.Node; VAR t: SymTab.TypeIndex;
|
|
|
t := SymTab.BoolType(); QbeGen.CopyOp(qt, q)
|
|
|
ELSIF (SymTab.ClassOf(t) = SymTab.ClSet)
|
|
|
OR (SymTab.ClassOf(t2) = SymTab.ClSet) THEN
|
|
|
- IF SymTab.IsPackedSet(t) OR SymTab.IsPackedSet(t2) THEN
|
|
|
- QbeGen.PackedCmpSet(rop, q, t, q2, t2, qt)
|
|
|
+ IF SymTab.IsBigSet(t) OR SymTab.IsBigSet(t2) THEN
|
|
|
+ QbeGen.BigSetEqual(q, q2, qt);
|
|
|
+ IF (rop = SymTab.OpNeq1) OR (rop = SymTab.OpNeq2) THEN
|
|
|
+ QbeGen.NotQ(qt, q)
|
|
|
+ ELSE QbeGen.CopyOp(qt, q)
|
|
|
+ END
|
|
|
+ ELSIF SymTab.IsPackedSet(t) OR SymTab.IsPackedSet(t2) THEN
|
|
|
+ QbeGen.PackedCmpSet(rop, q, t, q2, t2, qt);
|
|
|
+ QbeGen.CopyOp(qt, q)
|
|
|
ELSE QbeGen.CmpSet(rop, q, q2, SymTab.SetWords(t),
|
|
|
- SymTab.SetWords(t2), qt)
|
|
|
+ SymTab.SetWords(t2), qt);
|
|
|
+ QbeGen.CopyOp(qt, q)
|
|
|
END;
|
|
|
- t := SymTab.BoolType(); QbeGen.CopyOp(qt, q)
|
|
|
+ t := SymTab.BoolType()
|
|
|
ELSIF SymTab.StrCompat(t, t2) THEN
|
|
|
QbeGen.StrEq(rop, q, q2, qt);
|
|
|
t := SymTab.BoolType(); QbeGen.CopyOp(qt, q)
|
|
|
@@ -2372,7 +2408,15 @@ PROCEDURE LowerExprFull (n: AST.Node; VAR t: SymTab.TypeIndex;
|
|
|
ELSIF op = AST.OpMul THEN idx := 1
|
|
|
ELSE idx := 3
|
|
|
END;
|
|
|
- IF SymTab.IsPackedSet(t) OR SymTab.IsPackedSet(t2) THEN
|
|
|
+ IF SymTab.IsBigSet(t) OR SymTab.IsBigSet(t2) THEN
|
|
|
+ QbeGen.NewSetTemp(2, qt);
|
|
|
+ QbeGen.SetZero(qt, 2);
|
|
|
+ QbeGen.BigSetBin(idx, qt, q, q2);
|
|
|
+ IF SymTab.IsBigSet(t) THEN
|
|
|
+ t := SymTab.NewBigSet(SymTab.SetBase(t))
|
|
|
+ ELSE t := SymTab.NewBigSet(SymTab.SetBase(t2))
|
|
|
+ END
|
|
|
+ ELSIF SymTab.IsPackedSet(t) OR SymTab.IsPackedSet(t2) THEN
|
|
|
QbeGen.PackedSetBinOp(idx, q, t, q2, t2, qt);
|
|
|
t := SymTab.NewSet(SymTab.NewSubR(0, 31))
|
|
|
ELSE
|
|
|
@@ -2693,8 +2737,12 @@ PROCEDURE LowerStmt (seq: AST.Node);
|
|
|
IF SymTab.ClassOf(procRes[emitProc]) = SymTab.ClArray THEN
|
|
|
QbeGen.CopyArray(qt, q, procRes[emitProc])
|
|
|
ELSIF SymTab.ClassOf(procRes[emitProc]) = SymTab.ClSet THEN
|
|
|
- QbeGen.CopySet(qt, q, SymTab.SetWords(procRes[emitProc]),
|
|
|
+ IF SymTab.IsBigSet(procRes[emitProc]) THEN
|
|
|
+ QbeGen.BigSetCopy(qt, q)
|
|
|
+ ELSE
|
|
|
+ QbeGen.CopySet(qt, q, SymTab.SetWords(procRes[emitProc]),
|
|
|
SymTab.SetWords(procRes[emitProc]))
|
|
|
+ END
|
|
|
ELSE QbeGen.CopyRecord(qt, q, procRes[emitProc])
|
|
|
END;
|
|
|
QbeGen.EmitRet("0", FALSE)
|