CastOp : FoldCast (tokenno, p, quad, op1, op2, op3) |
InclOp : FoldIncl (tokenno, p, quad, op1, op3) |
ExclOp : FoldExcl (tokenno, p, quad, op1, op3) |
- IfEquOp : FoldIfEqu (tokenno, p, quad, op1, op2, op3) |
- IfNotEquOp : FoldIfNotEqu (tokenno, p, quad, op1, op2, op3) |
- IfLessOp : FoldIfLess (tokenno, p, quad, op1, op2, op3) |
- IfLessEquOp : FoldIfLessEqu (tokenno, p, quad, op1, op2, op3) |
- IfGreOp : FoldIfGre (tokenno, p, quad, op1, op2, op3) |
- IfGreEquOp : FoldIfGreEqu (tokenno, p, quad, op1, op2, op3) |
- IfInOp : FoldIfIn (tokenno, p, quad, op1, op2, op3) |
- IfNotInOp : FoldIfNotIn (tokenno, p, quad, op1, op2, op3) |
+ IfEquOp : FoldIfEqu (tokenno, quad, op1, op2, op3) |
+ IfNotEquOp : FoldIfNotEqu (tokenno, quad, op1, op2, op3) |
+ IfLessOp : FoldIfLess (tokenno, quad, op1, op2, op3) |
+ IfLessEquOp : FoldIfLessEqu (tokenno, quad, op1, op2, op3) |
+ IfGreOp : FoldIfGre (tokenno, quad, op1, op2, op3) |
+ IfGreEquOp : FoldIfGreEqu (tokenno, quad, op1, op2, op3) |
+ IfInOp : FoldIfIn (tokenno, quad, op1, op2, op3) |
+ IfNotInOp : FoldIfNotIn (tokenno, quad, op1, op2, op3) |
LogicalShiftOp : FoldSetShift(tokenno, p, quad, op1, op2, op3) |
LogicalRotateOp : FoldSetRotate (tokenno, p, quad, op1, op2, op3) |
ParamOp : FoldBuiltinFunction (tokenno, p, quad, op1, op2, op3) |
if op1 < op2 then goto op3.
*)
-PROCEDURE FoldIfLess (tokenno: CARDINAL; p: WalkAction;
+PROCEDURE FoldIfLess (tokenno: CARDINAL;
quad: CARDINAL; left, right, destQuad: CARDINAL) ;
BEGIN
(* Firstly ensure that constant literals are declared. *)
END FoldIfLess ;
-(*
- QuadCondition - Pre-condition: left, right operands are constants
- which have been resolved.
- Post-condition: return TRUE if the condition at
- quad is TRUE.
-*)
-
-PROCEDURE QuadCondition (quad: CARDINAL) : BOOLEAN ;
-VAR
- left, right, dest, combined,
- leftpos, rightpos, destpos : CARDINAL ;
- constExpr, overflow : BOOLEAN ;
- op : QuadOperator ;
-BEGIN
- GetQuadOtok (quad, combined, op,
- left, right, dest, overflow,
- constExpr,
- leftpos, rightpos, destpos) ;
- CASE op OF
-
- IfInOp : PushValue (right) ;
- RETURN SetIn (left, combined) |
- IfNotInOp : PushValue (right) ;
- RETURN NOT SetIn (left, combined)
-
- ELSE
- END ;
- PushValue (left) ;
- PushValue (right) ;
- CASE op OF
-
- IfGreOp : RETURN Gre (combined) |
- IfLessOp : RETURN Less (combined) |
- IfLessEquOp: RETURN LessEqu (combined) |
- IfGreEquOp : RETURN GreEqu (combined) |
- IfEquOp : RETURN GreEqu (combined) |
- IfNotEquOp : RETURN NotEqu (combined)
-
- ELSE
- InternalError ('unrecognized comparison operator')
- END ;
- RETURN FALSE
-END QuadCondition ;
-
-
(*
FoldIfGre - check to see if it is possible to evaluate
if op1 > op2 then goto op3.
*)
-PROCEDURE FoldIfGre (tokenno: CARDINAL; p: WalkAction;
+PROCEDURE FoldIfGre (tokenno: CARDINAL;
quad: CARDINAL;
left, right, destQuad: CARDINAL) ;
BEGIN
if op1 <= op2 then goto op3.
*)
-PROCEDURE FoldIfLessEqu (tokenno: CARDINAL; p: WalkAction;
+PROCEDURE FoldIfLessEqu (tokenno: CARDINAL;
quad: CARDINAL;
left, right, destQuad: CARDINAL) ;
BEGIN
if op1 >= op2 then goto op3.
*)
-PROCEDURE FoldIfGreEqu (tokenno: CARDINAL; p: WalkAction;
+PROCEDURE FoldIfGreEqu (tokenno: CARDINAL;
quad: CARDINAL;
left, right, destQuad: CARDINAL) ;
BEGIN
if op1 in op2 then goto op3
*)
-PROCEDURE FoldIfIn (tokenno: CARDINAL; p: WalkAction;
+PROCEDURE FoldIfIn (tokenno: CARDINAL;
quad: CARDINAL;
left, right, destQuad: CARDINAL) ;
BEGIN
if not (op1 in op2) then goto op3
*)
-PROCEDURE FoldIfNotIn (tokenno: CARDINAL; p: WalkAction;
+PROCEDURE FoldIfNotIn (tokenno: CARDINAL;
quad: CARDINAL;
left, right, destQuad: CARDINAL) ;
BEGIN
if op1 = op2 then goto op3.
*)
-PROCEDURE FoldIfEqu (tokenno: CARDINAL; p: WalkAction;
+PROCEDURE FoldIfEqu (tokenno: CARDINAL;
quad: CARDINAL;
left, right, destQuad: CARDINAL) ;
BEGIN
if op1 # op2 then goto op3.
*)
-PROCEDURE FoldIfNotEqu (tokenno: CARDINAL; p: WalkAction;
+PROCEDURE FoldIfNotEqu (tokenno: CARDINAL;
quad: CARDINAL;
left, right, destQuad: CARDINAL) ;
BEGIN
END GenQuadOTypetok ;
-(*
- GenQuadOTypeUniquetok - assigns the fields of the quadruple with
- the parameters and marks the quad as constexpr.
-*)
-
-PROCEDURE GenQuadOTypeUniquetok (TokPos: CARDINAL;
- Operation: QuadOperator;
- Op1, Op2, Op3: CARDINAL;
- overflow, typecheck: BOOLEAN;
- Op1Pos, Op2Pos, Op3Pos: CARDINAL) ;
-VAR
- f: QuadFrame ;
-BEGIN
- (* WriteString('Potential Quad: ') ; *)
- IF QuadrupleGeneration
- THEN
- IF NextQuad # Head
- THEN
- f := GetQF (NextQuad-1) ;
- f^.Next := NextQuad
- END ;
- PutQuadOType (NextQuad, Operation, Op1, Op2, Op3, overflow, typecheck) ;
- f := GetQF (NextQuad) ;
- WITH f^ DO
- Next := 0 ;
- LineNo := GetLineNo () ;
- IF TokPos = UnknownTokenNo
- THEN
- TokenNo := GetTokenNo ()
- ELSE
- TokenNo := TokPos
- END ;
- op1pos := Op1Pos ;
- op2pos := Op2Pos ;
- op3pos := Op3Pos ;
- ConstExpr := TRUE ;
- IF GetDebugTraceQuad ()
- THEN
- printf0('generating: ') ;
- DisplayQuad (NextQuad) ;
- (* MetaErrorT1 (TokenNo, '{%1On}', NextQuad) *)
- END
- END ;
- IF NextQuad=BreakAtQuad
- THEN
- stop
- END ;
- NewQuad (NextQuad)
- END
-END GenQuadOTypeUniquetok ;
-
-
(*
DumpUntil - dump all quadruples until we seen the ending quadruple
with procsym in the third operand.