{ Module 29 Code Generator Initialisation The code-generator is initialised systematically on a module by module basis by a call to procedure InitCodeGeneration made from the compiler program body. However, a number of generator vari- ables not associated with any module in particular are initialised here by procedures InitPCodes, InitDefaults, and InitOthers. } program CodeInit; #include "globals.x" #include "varref.pf" #include "expeval.pf" #include "datareps.pf" #include "statstore.pf" #include "withstmts.pf" #include "stdprocs.pf" #include "ctlstructs.pf" #include "objvalues.pf" {procedure InitPcodes; begin IntCodes[ Mul] := MultInteger; RealCodes[ Mul] := MultiplyReal; IntCodes[ Rdiv] := NoOperation; RealCodes[ Rdiv] := DivideReal; IntCodes[AndOp] := NoOperation; RealCodes[AndOp] := NoOperation; IntCodes[ Idiv] := DivInteger; RealCodes[ Idiv] := NoOperation; IntCodes[ Imod] := ModInteger; RealCodes[ Imod] := NoOperation; IntCodes[ Plus] := AddInteger; RealCodes[ Plus] := AddReal; IntCodes[Minus] := SubInteger; RealCodes[Minus] := SubtractReal; IntCodes[ OrOp] := NoOperation; RealCodes[ OrOp] := NoOperation; IntCodes[ LtOp] := TestILess; RealCodes[ LtOp] := TestRLess; IntCodes[ LeOp] := TestILtOrEqual; RealCodes[ LeOp] := TestRLtOrEqual; IntCodes[ GeOp] := NoOperation; RealCodes[ GeOp] := NoOperation; IntCodes[ GtOp] := NoOperation; RealCodes[ GtOp] := NoOperation; IntCodes[ NeOp] := TestIUnequal; RealCodes[ NeOp] := TestRUnequal; IntCodes[ EqOp] := TestIEqual; RealCodes[ EqOp] := TestREqual; IntCodes[ InOp] := NoOperation; RealCodes[ InOp] := NoOperation; IntCodes[NotOp] := NoOperation; RealCodes[NotOp] := NoOperation; IntCodes[SingleOp]:= NoOperation; RealCodes[SingleOp] := NoOperation; IntCodes[RangeOp] := NoOperation; RealCodes[RangeOp] := NoOperation; StringCodes[ Mul] := NoOperation; SetCodes[ Mul] :=SetIntersection; StringCodes[ Rdiv] := NoOperation; SetCodes[ Rdiv] := NoOperation; StringCodes[AndOp] := NoOperation; SetCodes[AndOp] := NoOperation; StringCodes[ Idiv] := NoOperation; SetCodes[ Idiv] := NoOperation; StringCodes[ Imod] := NoOperation; SetCodes[ Imod] := NoOperation; StringCodes[ Plus] := NoOperation; SetCodes[ Plus] := SetUnion; StringCodes[Minus] := NoOperation; SetCodes[Minus] := SetDifference; StringCodes[ OrOp] := NoOperation; SetCodes[ OrOp] := NoOperation; StringCodes[ LtOp] := TestSLess; SetCodes[ LtOp] := NoOperation; StringCodes[ LeOp] :=TestSLtOrEqual;SetCodes[ LeOp] := TestSubset; StringCodes[ GeOp] := NoOperation; SetCodes[ GeOp] := NoOperation; StringCodes[ GtOp] := NoOperation; SetCodes[ GtOp] := NoOperation; StringCodes[ NeOp] := TestSUnequal; SetCodes[ NeOp] := TestSetUnequal; StringCodes[ EqOp] := TestSEqual; SetCodes[ EqOp] := TestSetEqual; StringCodes[ InOp] := NoOperation; SetCodes[ InOp] := InSet; StringCodes[NotOp] := NoOperation; SetCodes[NotOp] := NoOperation; StringCodes[SingleOp]:=NoOperation;SetCodes[SingleOp]:=MakeSingletonSet; StringCodes[ RangeOp]:=NoOperation; SetCodes[ RangeOp]:= MakeRangeSet; PtrCodes[EqOp] := TestPEqual; PtrCodes[NeOp] := TestPUnequal; AccessCodes[ LoadOp, Local] := LoadLocal; AccessCodes[ LoadOp, Enclosing] := LoadEnclosing; AccessCodes[ LoadOp,Intermediate] := LoadIntermediate; AccessCodes[ LoadOp, Global] := LoadGlobal; AccessCodes[ StoreOp, Local] := StoreLocal; AccessCodes[ StoreOp, Enclosing] := StoreEnclosing; AccessCodes[ StoreOp,Intermediate] := StoreIntermediate; AccessCodes[ StoreOp, Global] := StoreGlobal; AccessCodes[LoadRefOp, Local] := LoadRefLocal; AccessCodes[LoadRefOp, Enclosing] := LoadRefEnclosing; AccessCodes[LoadRefOp,Intermediate] :=LoadRefIntermediate; AccessCodes[LoadRefOp, Global] := LoadRefGlobal; CheckCodes[false,false] := NoOperation; CheckCodes[false,true ] := CheckUpper; CheckCodes[true ,false] := CheckLower; CheckCodes[true ,true ] := CheckLimits; TransferCodes[false,false] := Pack; TransferCodes[false,true ] := Unpack; TransferCodes[true ,false] := Packc; TransferCodes[true ,true ] := Unpackc; end ; initpcodes } procedure InitDefaults ; begin with UndefinedValue do begin Defined := false; Multiple := 1 end; with BufferOffset do begin WordOffset := BufferVarOffset; Level := 0; PartWord := false; WordSize := 1 end; with DftAddress do begin BlockLevel := 0; WordOffset := FirstOffset end ; with DftOffset do begin WordOffset := 0; Level := 0; PartWord := false; WordSize := 1 end; with DftLabel do begin BlockLevel := 0; EntryOffset := 0 end; end { initdefaults }; procedure InitOthers; begin StackConstant(ZeroValue); Pop(ZeroEntry); StackConstant(DftLayout); Pop(DefaultWidth); ItemShapes[false,false] := Word; ItemShapes[false,true ] := WordStructure; ItemShapes[true ,false] := PartWrd; ItemShapes[true ,true ] := PartWrdStructure; ContextOfCheck := IsUnknown end { initothers }; procedure InitCodeGeneration; visible; begin {InitPcodes;} InitDefaults; InitValues; InitRepresentations; InitFrames; {InitEmitter; } InitStack; InitIO; InitWith; InitCase; InitFor; InitOthers end { initcodegeneration }; procedure EndCodeGeneration; visible; begin {EndEmitter } end { endcodegeneration }; begin {end of module } end.