DIRECTORY
Alloc: TYPE USING [Notifier],
Basics: TYPE USING [BITAND, BITOR, BITSHIFT],
Code: TYPE USING [codeptr],
CodeDefs:
TYPE
USING [
Base, CCIndex, CCNull, CodeCCIndex, codeType, JumpCCIndex],
FOpCodes:
TYPE
USING [
qDB, qGA, qLA, qLG, qLGD, qLI, qLL, qLLD, qRGDI, qRGI,
qRKDI, qRKI, qRLI, qRLDI],
OpCodeParams:
TYPE
USING [
BYTE, GlobalHB, LoadImmediateSlots, LocalHB, zLIn],
OpTableDefs: TYPE USING [InstLength],
P5: TYPE USING [NumberOfParams, P5Error],
P5U: TYPE USING [AllocCodeCCItem, DeleteCell, ParamCount],
PeepholeDefs:
TYPE
USING [
ConsPeepState, JumpPeepState, NullComponent, NullConsState,
NullJumpState, NullState, PeepComponent, PeepState, StateExtent],
PrincOps: TYPE USING [FieldDescriptor, zLIB, zLIHB, zLIN1, zLINB, zLINI, zLIW],
PrincOpsUtils: TYPE USING [Copy];
PeepholeU:
PROGRAM
IMPORTS CPtr: Code, Basics, P5U, OpTableDefs, P5, PrincOpsUtils
EXPORTS P5, PeepholeDefs =
BEGIN OPEN OpCodeParams, CodeDefs, PeepholeDefs;
InitParameters:
PUBLIC
PROC [
p: POINTER TO PeepState, ci: CodeCCIndex, extent: StateExtent] =
BEGIN -- ci # CCNull and cb[ci].cctag = code
ai, bi: CCIndex;
p^ ← NullState;
IF ~InitComponent[@p.cComp, ci] THEN RETURN;
CPtr.codeptr ← ci;
IF extent = c THEN RETURN;
IF (bi ← PrevInteresting[ci]) = CCNull THEN RETURN;
[] ← InitComponent[@p.bComp, bi];
IF extent = bc THEN RETURN;
IF (ai ← PrevInteresting[bi]) = CCNull THEN RETURN;
[] ← InitComponent[@p.aComp, ai];
END;
CondFillInC:
PROC [p:
POINTER
TO PeepState, ci: CodeCCIndex] =
BEGIN
p.cComp ← NullComponent;
IF InitComponent[@p.cComp, ci] THEN CPtr.codeptr ← ci;
END;
InitConsState:
PUBLIC
PROC [p:
POINTER
TO ConsPeepState, di: CodeDefs.CodeCCIndex] =
BEGIN
ai, bi, ci: CCIndex;
p^ ← NullConsState;
IF ~InitComponent[@p.d, di] THEN RETURN;
CPtr.codeptr ← di;
IF (ci ← PrevInteresting[di]) = CCNull THEN RETURN;
[] ← InitComponent[@p.c, ci];
IF (bi ← PrevInteresting[ci]) = CCNull THEN RETURN;
[] ← InitComponent[@p.b, bi];
IF (ai ← PrevInteresting[bi]) = CCNull THEN RETURN;
[] ← InitComponent[@p.a, ai];
END;
SlideConsState:
PUBLIC
PROC [p:
POINTER
TO ConsPeepState, di: CodeDefs.CodeCCIndex] =
BEGIN
PrincOpsUtils.Copy[
from: @p.b,
to: @p.a,
nwords: 3*PeepComponent.SIZE];
p.d ← NullComponent;
IF InitComponent[@p.d, di] THEN CPtr.codeptr ← di;
END;