DataMuseum.dk

Presents historical artifacts from the history of:

DANOSI

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DANOSI

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦986b85b1a⟧ TextFile

    Length: 32421 (0x7ea5)
    Types: TextFile
    Names: »P435EOPR.PAS«

Derivation

└─⟦a2bcc95d7⟧ Bits:30010511 DVBS1.SW2114.src.2.14-2 SW2114 REAL #2/4 TIME PASCAL SOURCE REL 2.14 92.09.01
    └─⟦this⟧ »RTP\P435EOPR.PAS« 

TextFile

{$O+,F+}\r
unit p435eopr;\r
interface\r
uses pscplm,mpaunit,sthunit,p4unit;\r
\r
\r
    PROCEDURE MegaLoad(e : ESTelementRef);\r
    Procedure MegaStore(size : Integer);\r
    Procedure PushOperand;\r
    Procedure PushOperands;\r
    procedure MegaOperationOnStack(Inst : Instruction;commutativ : BOOLEAN);\r
    PROCEDURE CMPTopelements(Inst : Instruction; neg : boolean);\r
    PROCEDURE PushAddr(PtrSt : St_ElemPtr);\r
    Function megaoffset(niv,offset : word) : word;\r
    Procedure StoreStackToTemp(e : ESTElementRef);\r
    Procedure MegaPointer;\r
    Procedure MegaMakeAddr(e : ESTelementRef);\r
    Function  MegaAllign(e : ESTelementRef) : Boolean;\r
    Procedure MegaMoveToTemp(e : ESTelementRef);\r
    PROCEDURE PopPackedElement;\r
    PROCEDURE PutPackedElement;\r
    PROCEDURE GetPackedElement(e : ESTElementRef; TypeAddr : St_Address);\r
    PROCEDURE LoadPacked(e : ESTElementRef);\r
    Procedure MakeFreeReg(no : integer);\r
    Procedure PushParam(paramkind : codes);\r
    Procedure StartCall;\r
    Procedure EndCall(ParamSize : Integer);\r
    Procedure LoadFirstParams(ParamSize : Integer; Routinekind : st_DeclareMode);\r
    Procedure InitParamList;\r
    Procedure ExchangeTopElements;\r
    Procedure AddOffsetToAddr(e: ESTElementRef;Offset : integer);\r
    Procedure AllocDynamic(InSymbol : St_address;AddLength : Integer;\r
                off : integer);\r
    Procedure MakeCopyOfTop;\r
    Procedure MakeSetOprReady;\r
    PROCEDURE PushSetOnStack(TypeAddr : St_Address);\r
    PROCEDURE MakeProgramDesc(ProgOffset : Word; ProgState : State;\r
                              PoolParam : boolean; lab : St_Address);\r
    PROCEDURE MegaAllocTemp(No:Integer);\r
    Procedure MegaAllocParam(No:Integer);\r
   PROCEDURE LoadAbsAddr(e : ESTElementRef);\r
implementation\r
uses sthcom,sthp34,p4evalst,p435code,p435bool,p435stat;\r
\r
\r
  (********************** PROCEDURE ESTOPR ****************)\r
  (* This module impl.  operations on the stack elements  *)\r
\r
\r
    (********************************************************)\r
 TYPE\r
   ParamType = (AReg,BReg,Stop,Loaded);\r
\r
   ParamRecordType = ^RecordType;\r
\r
\r
   RecordType =\r
     RECORD\r
       InOut : Boolean;\r
       Kind :  ParamType;\r
       NextParamNo : integer;\r
       TempOffset : Integer;\r
       Next : ParamRecordType;\r
     END;\r
\r
 VAR\r
   ParamList : ParamRecordType;\r
\r
    (* ---------------------------------------------- *)\r
\r
\r
    PROCEDURE ESTPushTemp (LOprType : st_address;\r
                           LIndVar : Boolean;\r
                           Offset : Word;\r
                           IndexSTL : Integer);\r
\r
      BEGIN\r
\r
\r
        MakeNewStackTop;\r
        WITH ESTTop^ DO\r
          BEGIN\r
            Kind := O_Temp;\r
            OprType := LOprType;\r
            Par := P_Normal;\r
            IndVar := LIndVar;\r
            T_Offset := Offset;\r
            T_IndexToSTL := IndexSTL;\r
            T_address := false;\r
          END;\r
\r
        LastOnStack := ESTTop;\r
\r
\r
\r
      END;  (* ESTPushTemp *)\r
\r
    Procedure StoreStackToTemp(e : ESTElementRef);\r
      BEGIN\r
      END;\r
\r
    Procedure MakeFreeReg(no : integer);\r
      VAR i : integer;\r
          e: ESTElementRef;\r
      BEGIN\r
        i := 0;\r
        e := ESTTop;\r
        WHILE e <> Bottom_ESTTop DO\r
          BEGIN\r
           if ESTSort(e) = S_Stack then\r
             BEGIN\r
               i := i + 1;\r
               if i > (3 - no) THEN\r
                BEGIN\r
                END;\r
             END;\r
           e := e^.backward;\r
          END;\r
      END;\r
\r
\r
    Procedure PointerInDirect(E :ESTElementRef);\r
      VAR offset,niv : word;\r
      BEGIN\r
        IF e^.Kind = O_Addr THEN\r
          BEGIN\r
            offset := E^.A_offset;\r
            niv := E^.A_Niv;\r
            E^.Kind := O_IndAddr;\r
            E^.I_Offset := offset;\r
            E^.I_Niv := Niv;\r
            E^.I_ObjectOffset := 0;\r
            E^.AccessCheck := true;\r
            E^.I_Allign := true;\r
          END\r
        ELSE\r
          BEGIN\r
             E^.IndVar := true;\r
             Megaload(E);\r
          END;\r
      END;\r
\r
\r
    Procedure MegaPointer;\r
      BEGIN\r
        PointerIndirect(ESTTop);\r
      END;\r
\r
\r
    Function  MegaAllign(e : ESTelementRef) : Boolean;\r
      BEGIN\r
\r
        Case e^.Kind OF\r
\r
          O_Addr   :\r
            BEGIN\r
              MegaAllign := (e^.A_Offset MOD 4 = 0);\r
            END;\r
\r
          O_IndAddr:\r
           BEGIN\r
             MegaAllign := e^.I_Allign and (e^.I_ObjectOffset MOD 4 = 0);\r
           END;\r
\r
          O_Temp,\r
          O_Stack,\r
          O_StackOrTemp :\r
            BEGIN\r
              IF e^.T_Address THEN\r
                 MegaAllign :=  e^.T_Allign AND\r
                               (e^.T_ObjectOffset MOD 4 = 0)\r
              ELSE MegaAllign := True;\r
            END;\r
\r
\r
          O_CAddr :  MegaAllign := (e^.C_ObjectOffset MOD 4 = 0);\r
\r
          else MegaAllign := true;\r
        END;  (* end case *)\r
\r
      END;\r
\r
    Procedure MegaMakeaddr(e : ESTelementRef);\r
      BEGIN\r
        MegaLoad(e);\r
      END;  (* MegaMakeAddr *)\r
\r
    Procedure Loadaddr(e : ESTelementRef);\r
      VAR Offset : word;\r
          OffsetI: Integer;\r
          ObjectOffset : word;\r
          Allign : boolean;\r
          Typeaddr : St_Address;\r
          indvar : boolean;\r
      BEGIN\r
      if e = bottom_esttop then\r
      begin\r
        writeln('not ok ',ord(e^.kind));\r
      end;\r
          IF e^.Par = P_Share THEN\r
            BEGIN\r
              e^.Par := P_Normal;\r
              TypeAddr := e^.OprType;\r
              AddOffsetToAddr(e,ReferenceSize);\r
              indvar := e^.Indvar;\r
              e^.OprType := PointerType;\r
              PointerInDirect(e);\r
              e^.Indvar := indvar;\r
              e^.OprType := TypeAddr;\r
            END;\r
\r
\r
\r
\r
        ObjectOffset := 0;\r
\r
        Case e^.Kind OF\r
\r
          O_Addr   :\r
            BEGIN\r
             If e^.A_Niv = CurrentNiv THEN\r
               CodeConst(rREALD,e^.A_offset,e^.spix)\r
             ELSE\r
             If e^.A_Niv = Program_Level THEN\r
               CodeConst(rREAGD,e^.A_offset,e^.spix)\r
             ELSE\r
             BEGIN\r
               CodeConst(rREAID,CurrentNiv - e^.A_Niv,anonymousSpix);\r
               ObjectOffset := e^.A_Offset;\r
             END;\r
          END;\r
\r
          O_IndAddr:\r
           BEGIN\r
             If e^.I_Niv = Program_Level THEN\r
               CodeConst(rREVGA,e^.I_offset,e^.spix)\r
             ELSE\r
             If e^.I_Niv = CurrentNiv THEN\r
               CodeConst(rREVLA,e^.I_offset,e^.spix)\r
             ELSE\r
              BEGIN\r
                CodeConst(rREAID,CurrentNiv - e^.I_Niv,anonymousSpix);\r
                CodeConst(rREVSA,e^.I_Offset,e^.Spix);\r
              END;\r
              ObjectOffset := e^.I_ObjectOffset;\r
           END;\r
\r
          O_Stack :\r
            BEGIN\r
             ObjectOffset := e^.T_ObjectOffset;\r
            END;\r
\r
          O_StackOrTemp :\r
            BEGIN\r
            END;\r
\r
          O_CAddr :  BEGIN\r
                       CodeLoadEffAddr(e^.C_Label,e^.C_ObjectOffset);\r
                     END;\r
        END;  (* end case *)\r
\r
      e^.Kind := O_Stack;\r
      e^.T_ObjectOffset := ObjectOffset;\r
\r
      END;  (* LoadAddr *)\r
\r
\r
   PROCEDURE LoadAbsAddr(e : ESTElementRef);\r
     BEGIN\r
       LoadAddr(e);\r
       IF e^.T_ObjectOffset <> 0 THEN\r
          CodeConst(rREASD,e^.T_ObjectOffset,AnonymousSpix);\r
       e^.T_ObjectOffset := 0;\r
     END;\r
\r
\r
   Procedure NewParam(PInOut : Boolean;\r
                      PKind : ParamType;\r
                      PTempOffset : Integer);\r
      VAR Ptr : ParamRecordType;\r
      BEGIN\r
      END;\r
    Procedure InitParamList;\r
      BEGIN\r
      END;\r
    Procedure StartCall;\r
      BEGIN\r
      END;\r
\r
    Procedure EndCall(ParamSize : Integer);\r
      VAR Ptr : ParamRecordType;\r
      BEGIN\r
      END;\r
\r
    Procedure LoadFirstParams(ParamSize : Integer;routinekind : st_declaremode);\r
      VAR Ptr : ParamRecordType;\r
      VAR oldkind : ParamType;\r
      BEGIN\r
      END;\r
\r
    PROCEDURE PushParam(ParamKind : codes);\r
      VAR\r
        Addr : Address;\r
        St_AddrRef : St_elemptr;\r
        offset : Integer;\r
	LoadAdr : boolean;\r
        Size  : Integer;\r
        e,CurE : ESTelementRef;\r
\r
    Procedure Load(Ce : EstElementRef);\r
      BEGIN\r
	 IF (Size > 0) AND (Size <= 4) THEN\r
         CodeConst(Instruction(ord(rREVSB) - 1 + size),\r
					      CE^.T_ObjectOffset, CE^.Spix)\r
	 ELSE\r
	   BEGIN\r
             LoadAbsAddr(Ce);\r
             IF odd(size) THEN Size := Size + 1;\r
             CodeConst(rRECHW,Size,AnonymousSpix);\r
             GenCode(rREVSM);\r
	   END;\r
      END;\r
\r
      BEGIN\r
        IF (ESTSort(ESTTop) <> S_Stack) AND\r
           (ESTTop^.Backward <> Bottom_ESTTop) THEN MegaLoad(ESTTop^.Backward);\r
        CurE := ESTTop;\r
        St_RetrieveType(CurE^.OprType,St_AddrRef);\r
        Size := ST_AddrRef^.St_Size;\r
	LoadAdr := (ParamKind <> cValueParam) OR Is_Dynamic(St_AddrRef,Size);\r
        IF ParamKind = cShared THEN\r
           CodeConst(rRENHB,referencesize - 1,Anonymousspix);\r
	IF Not LoadAdr THEN\r
        BEGIN\r
          IF (Size = 3) AND (St_AddrRef^.St_Kind <> CpointerType) THEN\r
            Size := 4\r
          ELSE\r
          IF (Size = 1) AND (St_AddrRef^.St_Kind <> CSubrange) AND\r
                            (St_AddrRef^.St_Kind <> CBoolean) AND\r
                            (St_AddrRef^.St_Kind <> CChar) AND\r
                            (St_AddrRef^.St_Kind <> CScalar) THEN Size := 2;\r
        END;\r
          CASE CurE^.Kind OF\r
\r
            O_Addr,O_IndAddr,O_CAddr :\r
              BEGIN\r
                IF (CurE^.Par = P_Normal) AND\r
		   (Not LoadAdr) AND\r
                   (CurE^.Kind = O_Addr) AND\r
                   ( (CurrentNiv = CurE^.A_Niv) OR\r
                     (CurE^.A_Niv = Program_Level) ) AND\r
                   (Size > 0) AND (Size <= 4) THEN\r
                  BEGIN\r
                    IF CurE^.A_Niv = CurrentNiv THEN\r
                        CodeConst(Instruction(ord(rREVLB) - 1 + size),\r
                                              CurE^.A_Offset, CurE^.Spix)\r
                    ELSE\r
                    IF CurE^.A_Niv = Program_Level THEN\r
                       CodeConst(Instruction(ord(rREVGB) - 1 + size),\r
                                              CurE^.A_Offset, CurE^.Spix)\r
                  END\r
                 ELSE\r
                  BEGIN\r
		   IF Not LoadAdr THEN\r
                     BEGIN\r
                        LoadAddr(CurE);\r
                        Load(CurE);\r
                     END\r
                   ELSE\r
		     LoadAbsAddr(CurE);\r
		  END;\r
              END;\r
\r
            O_Stack :\r
              BEGIN\r
		IF LoadAdr THEN\r
		  LoadAbsAddr(CurE)\r
		ELSE\r
		 IF CurE^.IndVar THEN\r
                 BEGIN\r
		  LoadAddr(CurE);\r
		  load(CurE);\r
                 END;\r
              END;\r
\r
            O_Const :\r
              BEGIN\r
                CodeConst(rRECHW,CurE^.Value,CurE^.spix);\r
              END;\r
\r
	    O_Decode : ;\r
\r
          END;  (* END CASE *)\r
\r
\r
        ESTPop;\r
      END;\r
\r
    PROCEDURE MegaLoadAssign;\r
\r
      VAR\r
        Addr : Address;\r
        St_AddrRef : St_elemptr;\r
        offset : Integer;\r
        Loaded : boolean;\r
        Size  : Integer;\r
        CurE : ESTelementRef;\r
\r
    Procedure Load(Ce : EstElementRef);\r
      BEGIN\r
         CodeConst(Instruction(ord(rREVSB) - 1 + size),\r
                                              CE^.T_ObjectOffset, CE^.Spix)\r
      END;\r
\r
      BEGIN\r
        IF (ESTSort(ESTTop) <> S_Stack) AND\r
           (ESTTop^.Backward <> Bottom_ESTTop) THEN MegaLoad(ESTTop^.Backward);\r
        CurE := ESTTop;\r
          Loaded := True;\r
          St_RetrieveType(CurE^.OprType,St_AddrRef);\r
          Size := ST_AddrRef^.St_Size;\r
\r
          CASE CurE^.Kind OF\r
\r
            O_Addr,O_IndAddr,O_CAddr :\r
              BEGIN\r
                IF (CurE^.Par = P_Normal) AND\r
                   (CurE^.Kind = O_Addr) AND\r
                   ( (CurrentNiv = CurE^.A_Niv) OR\r
                     (CurE^.A_Niv = Program_Level) ) AND\r
                   (Size > 0) AND (Size <= 4) THEN\r
                  BEGIN\r
                    IF CurE^.IndVar = False THEN Loaded := false\r
                    ELSE\r
                     BEGIN\r
                      IF CurE^.A_Niv = CurrentNiv THEN\r
                        CodeConst(Instruction(ord(rREVLB) - 1 + size),\r
                                              CurE^.A_Offset, CurE^.Spix)\r
                      ELSE\r
                      IF CurE^.A_Niv = Program_Level THEN\r
                       CodeConst(Instruction(ord(rREVGB) - 1 + size),\r
                                              CurE^.A_Offset, CurE^.Spix)\r
                     END;\r
                  END\r
                 ELSE\r
                  BEGIN\r
                   LoadAddr(CurE);\r
                   IF CurE^.IndVar THEN\r
                     BEGIN\r
                      if (Size = 0) OR (Size > 4) THEN\r
                        LoadAbsAddr(CurE)\r
                      else\r
                        load(CurE);\r
                     END;\r
                   END;\r
              END;\r
\r
            O_Stack :\r
              BEGIN\r
                IF CurE^.IndVar THEN\r
                 BEGIN\r
                   if (Size = 0) OR (Size > 4) THEN\r
                      LoadAbsAddr(CurE)\r
                   else\r
                      load(CurE);\r
\r
                 END;\r
              END;\r
\r
            O_Const :\r
              BEGIN\r
                CodeConst(rRECHW,CurE^.Value,CurE^.spix);\r
              END;\r
\r
            O_Decode : Loaded := false;\r
\r
          END;  (* END CASE *)\r
\r
          IF Loaded THEN\r
          BEGIN\r
            CurE^.Kind      := O_Stack;\r
            CurE^.IndVar    := false;\r
          END;\r
\r
        LastOnStack := CurE;\r
\r
      END;  (* LoadRegister *)\r
\r
\r
    PROCEDURE MegaStore(Size : Integer);\r
      VAR Inst : Instruction;\r
          PtrSt : St_elemptr;\r
      \r
      BEGIN\r
        IF (Size >= 1) AND (Size <= 4) THEN\r
          BEGIN\r
            MegaLoadAssign;\r
            ESTPop;\r
            if (ESTTop^.kind = O_Addr) AND ( CurrentNIV = ESTTop^.A_Niv)\r
               AND (ESTTop^.Par = P_Normal) THEN\r
	      BEGIN\r
                Inst := Instruction(ord(rSTVLB) - 1 + Size);\r
                CodeConst(Inst,ESTTop^.A_Offset,ESTTop^.Spix);\r
              END\r
            else\r
            if (ESTTop^.kind = O_Addr) AND ( Program_Level = ESTTop^.A_Niv)\r
               AND (ESTTop^.Par = P_Normal) THEN\r
            BEGIN\r
                Inst := Instruction(ord(rSTVGB) - 1 + Size);\r
                CodeConst(Inst,ESTTop^.A_Offset,ESTTop^.Spix);\r
            END\r
            ELSE\r
              BEGIN\r
                Inst := Instruction(ord(rSTVSB) - 1 + Size);\r
                CodeConst(Inst,ESTTop^.T_ObjectOffset,ESTTop^.Spix);\r
              END;\r
          END\r
        ELSE (* Size > 4 *)\r
         BEGIN\r
          LoadAbsAddr(ESTTop^.BackWard);\r
          LoadAbsAddr(ESTTop);\r
          St_RetrieveType(ESTTop^.OprType,PtrSt);\r
          IF is_dynamic(PtrSt,size) then\r
                BEGIN\r
                  PushAddr(PtrSt);\r
                  MegaLoad(ESTTop);\r
                  ESTPop;\r
                END\r
              ELSE\r
            CodeConst(rRECHW,Size,AnonymousSpix);\r
          GenCode(rMOVEG);\r
          ESTPop;\r
         END;\r
        ESTPop;\r
      END;\r
\r
\r
\r
\r
    PROCEDURE MegaLoad(e : ESTelementRef);\r
\r
      VAR\r
        Addr : Address;\r
        St_AddrRef : St_elemptr;\r
        offset : Integer;\r
        Loaded : boolean;\r
        Size  : Integer;\r
        CurE : ESTelementRef;\r
        Arrayaddr : boolean;\r
\r
    Procedure Load(Ce : EstElementRef);\r
      BEGIN\r
         CodeConst(Instruction(ord(rREVSB) - 1 + size),\r
                                              CE^.T_ObjectOffset, CE^.Spix);\r
         CurE^.T_ObjectOffset := 0;\r
      END;\r
\r
      BEGIN\r
        CurE := LastOnStack;\r
        IF (ESTSort(e) = S_Stack) OR\r
           (CurE <> Bottom_ESTTop) THEN CurE := CurE^.Backward;\r
        WHILE e <> CurE DO\r
        BEGIN\r
          Loaded := True;\r
          CurE := CurE^.xForward;\r
          IF CurE^.Par = P_Share THEN\r
              LoadAddr(CurE);\r
\r
          St_RetrieveType(CurE^.OprType,St_AddrRef);\r
\r
\r
          Size := ST_AddrRef^.St_Size;\r
          IF (Size = 3) AND (St_AddrRef^.St_Kind <> CpointerType)\r
          THEN Size := 4;\r
          ArrayAddr := (St_AddrRef^.St_Kind = cArrayType) OR\r
                       (St_AddrRef^.St_Kind = cSetType);\r
\r
          St_Retrieve(CurE^.OprType,St_AddrRef);\r
\r
          IF (((st_AddrRef^.Type_Mode = Bound_Fam) OR\r
          (st_AddrRef^.Type_Mode = Named_Bound_Fam)) AND\r
           Equal_addr(St_AddrRef^.St_Family_Ref,St_String_Type_Addr)) THEN\r
             Size := 0;  (* The address is always loaded *)\r
          CASE CurE^.Kind OF\r
\r
            O_Addr,O_IndAddr,O_CAddr :\r
              BEGIN\r
                IF (CurE^.Par = P_Normal) AND\r
                   (CurE^.Kind = O_Addr) AND\r
                   ( (CurrentNiv = CurE^.A_Niv) OR\r
                     (CurE^.A_Niv = Program_Level) ) AND\r
                   (  NOT ArrayAddr OR CurE^.IndVar) AND\r
                   (  ( (Size > 0) AND (Size <= 3) AND (CurE^.IndVar) ) OR\r
                      ( (Size > 0) AND (Size <= 4) AND (NOT CurE^.IndVar) ) )\r
                   THEN\r
                  BEGIN\r
                    IF CurE^.IndVar = False THEN Loaded := false\r
                    ELSE\r
                     BEGIN\r
                      IF CurE^.A_Niv = CurrentNiv THEN\r
                        CodeConst(Instruction(ord(rREVLB) - 1 + size),\r
                                              CurE^.A_Offset, CurE^.Spix)\r
                      ELSE\r
                      IF CurE^.A_Niv = Program_Level THEN\r
                       CodeConst(Instruction(ord(rREVGB) - 1 + size),\r
                                              CurE^.A_Offset, CurE^.Spix)\r
                     END;\r
                  END\r
                 ELSE\r
                 if (Size = 0) OR (Size >= 4) OR\r
                    (ArrayAddr AND NOT CurE^.Indvar) THEN\r
                        LoadAbsAddr(CurE)\r
                 ELSE\r
                  BEGIN\r
                   LoadAddr(CurE);\r
                   IF CurE^.IndVar THEN\r
                     BEGIN\r
                        load(CurE);\r
                     END;\r
                   END;\r
\r
\r
              END;\r
\r
            O_Stack :\r
              BEGIN\r
                  IF (Size = 0) OR (Size >= 4) THEN\r
                      LoadAbsAddr(CurE)\r
                  ELSE\r
                  IF CurE^.IndVar THEN\r
                      load(CurE);\r
              END;\r
\r
            O_Const :\r
              BEGIN\r
                CodeConst(rRECHW,CurE^.Value,CurE^.spix);\r
              END;\r
\r
            O_Decode : Loaded := false;\r
\r
          END;  (* END CASE *)\r
\r
          IF Loaded THEN\r
          BEGIN\r
            CurE^.Kind      := O_Stack;\r
            CurE^.IndVar    := false;\r
          END;\r
        END;\r
\r
        LastOnStack := CurE;\r
\r
      END;  (* LoadRegister *)\r
\r
\r
\r
    PROCEDURE MegaMoveToTemp(e : ESTelementRef);\r
\r
      VAR\r
        Addr : Address;\r
        St_AddrRef : St_elemptr;\r
        Size  : Integer;\r
\r
      BEGIN\r
      END;\r
\r
    Procedure PushOperand;\r
    BEGIN\r
      LoadAbsAddr(ESTTop);\r
    END;\r
\r
\r
\r
    Procedure PushOperands;\r
     BEGIN\r
\r
     END;\r
\r
\r
    Procedure MegaOperationOnStack(inst : Instruction; commutativ : boolean);\r
\r
    BEGIN\r
       MegaLoad(ESTTop^.Backward);\r
       MegaLoad(ESTTop);\r
\r
       Gencode(inst);\r
       ESTPop;\r
    END;\r
    (* ---------------------------------------------- *)\r
\r
\r
    PROCEDURE CMPTopelements(inst : instruction; neg : boolean);\r
      (* The procedure generates code to compare the two topelements*)\r
\r
\r
\r
      VAR\r
        Value : word;\r
        PtrSt : st_ElemPtr;\r
        Length : Word;\r
        FirstOpr : ESTelementRef;\r
        helpbool : boolean;\r
      BEGIN\r
\r
        St_RetrieveType(ESTTop^.OprType,PtrSt);\r
        Length := PtrSt^.St_Size;\r
\r
\r
        IF (Length = 1) OR (Length = 2) THEN\r
        BEGIN\r
            IF (ESTSort(ESTTop) = S_Const) AND\r
               (ESTTop^.Value = 1) AND\r
               ( (Inst = rLT) OR (Inst = rGE))\r
             THEN\r
               BEGIN\r
                 ESTTop^.Value := 0;\r
                 IF Inst = rLT THEN Inst := rLE ELSE Inst := rGT;\r
               END;\r
\r
           IF (ESTSort(ESTTop) = S_Const) AND\r
              (ESTTop^.Value = 0) THEN\r
              BEGIN\r
                 ESTPop;\r
                 MegaLoad(ESTTop);\r
                 ESTPop;\r
                 ESTPushDecode(St_NillAddr,St_NillAddr,Inst);\r
               END\r
             ELSE\r
               BEGIN\r
                 MegaOperationOnStack(Inst,True);\r
                 ESTPop;\r
                 ESTPushStack(BooleanType,false);\r
               END;\r
         END\r
        ELSE\r
        IF PtrSt^.St_Kind = cPointerType THEN\r
          BEGIN\r
            MegaOperationOnStack(rTEQAD,True);\r
            ESTPop;\r
            IF Inst = rNE THEN Inst := rNOT ELSE Inst := rOR;\r
            ESTPushDecode(St_NillAddr,St_NillAddr,Inst);\r
          END\r
        ELSE\r
          BEGIN\r
            MegaLoad(ESTTop);\r
            IF is_dynamic(PtrSt,length) then\r
                BEGIN\r
                  PushAddr(PtrSt);\r
                  MegaLoad(ESTTop);\r
                  ESTPop;\r
                END\r
              ELSE\r
            CodeConst(rRECHW,Length,AnonymousSpix);\r
            MegaOperationOnStack(rSTCEA,True);\r
            ESTPop;\r
            (*IF Inst = rNE THEN Inst := rNOT ELSE Inst := rOR;*)\r
            ESTPushDecode(St_NillAddr,St_NillAddr,Inst);\r
          END;\r
\r
      END;\r
\r
    Function megaoffset(niv,offset : word) : word;\r
    var off : integer;\r
    BEGIN\r
      IF Niv = Program_Level then\r
        BEGIN\r
          MegaOffset := Offset - Prog_Descr_Size + Proc3502_Descr_Size;\r
        END\r
      ELSE\r
        MegaOffset := Offset;\r
    END;\r
\r
\r
    PROCEDURE PushAddr(PtrSt : St_ElemPtr);\r
      (* The procedure push the address given by the STH_node PtrSt\r
         onto the evalstack *)\r
      VAR Par : ParType;\r
          AddrType : Address_Type;\r
          TypeAddr : boolean;\r
          Spix : SpixRange;\r
          Ptr : ST_ElemPtr;\r
          off,funclev : integer;\r
          helpaddr : st_Address;\r
      BEGIN\r
         TypeAddr := false;\r
         Par := P_Normal;\r
         WITH PtrST^ DO\r
           BEGIN\r
             Spix := PtrST^.ST_Spix;\r
             IF St_Kind = CType THEN\r
               BEGIN\r
                 AddrType := Type_Address;\r
                 TypeAddr := true;\r
               END\r
             ELSE\r
             IF St_Kind = CRecField THEN\r
               BEGIN\r
                 AddrType := Field_Addr;\r
                 TypeAddr := true;\r
               END\r
             ELSE\r
             IF (St_Kind = CSubrange) or (ST_Kind = CsetType) THEN\r
               BEGIN\r
                 AddrType := Subr_Addr;\r
                 TypeAddr := true;\r
                 Spix := AnonymousSpix;\r
               END\r
             ELSE\r
             IF St_Kind = CArrayType THEN\r
               BEGIN\r
                 AddrType := Array_Addr;\r
                 TypeAddr := true;\r
                 Spix := AnonymousSpix;\r
               END\r
             ELSE\r
             IF St_Kind = CRecordType THEN\r
               BEGIN\r
                 AddrType := Record_Addr;\r
                 TypeAddr := true;\r
                 Spix := AnonymousSpix;\r
               END;\r
\r
\r
\r
             IF TypeAddr THEN\r
               BEGIN\r
                 WITH AddrType DO\r
                   BEGIN\r
                     IF AddrType_Mode = direct THEN\r
                       ESTPushAddr(Spix,IntegerType,true,Par,\r
                                   level,MegaOffset(level,Offset))\r
                     ELSE\r
                     IF AddrType_Mode = indirect THEN\r
                      BEGIN\r
                       ESTPushIndAddr(Spix,IntegerType,true,Par,\r
                              Level,MegaOffset(Level,Offset),dopeoffset);\r
                       ESTTop^.I_Allign := True;\r
                      END\r
                     ELSE\r
                       ESTPushCAddr(Spix,IntegerType,true,par,addr_label,\r
                                                         dopeoffset);\r
                   END;\r
               END\r
             ELSE\r
\r
             IF ST_Kind = CFunction THEN\r
               BEGIN\r
                 (* a Function *)\r
                 Off := Func_Result_offset;\r
                 funclev := st_Level;\r
                 HelpAddr := TypeRef;\r
                 St_Retrievetype(HelpAddr,Ptr);\r
\r
                 if not SimpelFuncRes(Ptr)\r
   then\r
   BEGIN\r
    estpushindaddr(spix,HelpAddr,false,par,\r
               funclev,MegaOffset(funclev,off),0);\r
    ESTTop^.I_Allign := true;\r
   END\r
   else ESTPushAddr(Spix,HelpAddr,false,Par,\r
               funclev,MegaOffset(funclev,Off));\r
               END\r
             ELSE\r
             IF ST_Kind = CProgram THEN\r
               (* a Program *)\r
               ESTPushAddr(Spix,St_NillAddr,false,Par,\r
                      0,MegaOffset(0,Prog_descr_Offset))\r
             ELSE\r
               BEGIN\r
                 (* a variabel or a parameter *)\r
                 IF (( ST_Kind = cSharedParam) OR\r
                     ( ST_Kind = cShared )) THEN Par := P_Share;\r
\r
\r
                 IF Var_Indir = false THEN\r
                   ESTPushAddr(Spix,TypeRef,false,Par,\r
                          Var_Level,MegaOffset(Var_level,Var_offset))\r
                 ELSE\r
                  BEGIN\r
                   ESTPushIndAddr(Spix,TypeRef,false,Par,\r
                          Var_Level,MegaOffset(Var_level,Var_Offset),0);\r
                   IF (St_Kind = cVarParam) OR (St_Kind =cInspectParam) THEN\r
                    BEGIN\r
                      St_RetrieveType(ESTTop^.OprType,Ptr);\r
                      IF St_Kind = cVarParam THEN\r
                      ESTTop^.I_Allign := ( (Ptr^.St_Size >=1) AND\r
                                            (Ptr^.St_Size <= 4)) OR\r
                                             ((ShieldType * Ptr^.Spec_Struct) <> [] ) OR\r
                                             ((ShieldType * Spec_Struct) <> [] )\r
                      ELSE\r
                      ESTTop^.I_Allign :=\r
                          (ShieldType * Ptr^.Spec_Struct) <> [] ;\r
\r
                    END\r
\r
                   ELSE\r
                    IF (St_Kind = cWithVar) THEN ESTTop^.I_Allign := false\r
                    ELSE ESTTop^.I_Allign := true;\r
                  END;\r
             END;\r
          END;\r
\r
\r
      END;\r
    PROCEDURE PopPackedElement;\r
      BEGIN\r
        ESTPop;\r
      END;\r
    PROCEDURE PutPackedElement;\r
    VAR e : ESTElementRef;\r
        allign : boolean;\r
        mask : integer;\r
    BEGIN\r
        MegaLoad(ESTTop);\r
        GenCode(rSTVSF);\r
        ESTPop;\r
        ESTPop;\r
    END;\r
\r
    PROCEDURE GetPackedElement(e : ESTElementRef; TypeAddr : St_Address);\r
      (* e holding the BitOffset. E^.BackWard holding the byte offset address\r
         The element is returned in Reg *)\r
      VAR\r
        BitLength : integer;\r
        Addr : Address;\r
        Ptr : St_ElemPtr;\r
\r
      BEGIN\r
        GenCode(rREVSF);\r
      END;\r
\r
      PROCEDURE LoadPacked(e : ESTElementRef);\r
       BEGIN\r
         CodeConst(rRECHW,(E^.BitLength + E^.Value-1) + E^.Value SHL 8,\r
                           Anonymousspix);\r
         E^.Backward^.BitLength := E^.BitLength;\r
         ESTPop;\r
       END;\r
\r
    Procedure ExchangeTopElements;\r
      VAR e : ESTElementRef;\r
      BEGIN\r
        e := ESTTop^.Backward;\r
        e^.Backward^.xForward := ESTTop;\r
        ESTTop^.xforward := e;\r
        e^.xForward := nil;\r
        ESTTop^.BackWard := e^.Backward;\r
        e^.Backward := ESTTop;\r
        ESTtop := e;\r
      END;\r
\r
    Procedure AddOffsetToAddr(e: ESTElementRef;Offset : integer);\r
      BEGIN\r
\r
         IF e^.Par = P_Share THEN LoadAbsAddr(e);\r
\r
         CASE E^.Kind OF\r
             O_Addr : E^.A_Offset := E^.A_Offset + offset;\r
             O_IndAddr : E^.I_ObjectOffset :=\r
                      E^.I_ObjectOffset + offset;\r
             O_AbsAddr : E^.A_Displacement := E^.A_Displacement +\r
                                offset;\r
\r
             O_CAddr : E^.C_ObjectOffset :=\r
                     E^.C_ObjectOffset + offset;\r
             O_Stack,O_StackOrTemp,O_Temp :\r
                    E^.T_ObjectOffset :=\r
                     E^.T_ObjectOffset + offset;\r
          END;\r
      END;\r
\r
    Procedure AllocDynamic(InSymbol : St_address; AddLength : Integer;\r
                           off : integer);\r
      VAR\r
          PtrSt : st_ElemPtr;\r
      BEGIN\r
            GenCode(rREAXD);\r
            CodeConst(rUADHW,1,Anonymousspix);\r
            CodeConst(rSTVLA,off,Anonymousspix);\r
            St_RetrieveType(InSymbol,PtrSt);\r
            IF is_dynamic(PtrST,PtrSt^.St_Size) THEN\r
              BEGIN\r
                PushAddr(PtrSt);\r
                IF AddLength <> 0 THEN\r
                 BEGIN\r
                   MegaLoad(ESTTop);\r
                   CodeConst(rUADHW,AddLength,AnonymousSpix);\r
                 END;\r
                MegaLoad(ESTTop);\r
                GenCode(rREVPW);\r
                CodeConst(rRECHW,1,Anonymousspix);\r
                GenCode(rAND);\r
                GenCode(rUADD);\r
                GenCode(rRENPB);\r
                ESTPop;\r
              END\r
            ELSE CodeConst(rRENHB,(PtrST^.St_Size + AddLength) +\r
                   ord(odd(PtrST^.St_Size + AddLength)), anonymousspix);\r
      END;\r
\r
  PROCEDURE MakeCopyOfTop;\r
    VAR e : ESTElementRef;\r
      BEGIN\r
      if ESTSort(ESTTop) = S_Stack THEN\r
        BEGIN\r
          GenCode(rREVPD);\r
        END;\r
      e := ESTTop;\r
      ESTPushconst(IntegerType,0);\r
      ESTTop^ := ESTTop^.BackWard^;\r
      ESTTop^.xforward := nil;\r
      ESTTop^.BackWard := e;\r
\r
    END;\r
\r
\r
\r
    Procedure MakeSetOprReady;\r
      (* The procedure generates code to push the last setoperand to a set opr. *)\r
      VAR\r
        ptr : st_elemptr;\r
\r
      BEGIN\r
        IF NOT ((ESTTop^.Kind =O_Stack) AND (ESTTop^.IndVar = false))THEN\r
        BEGIN\r
          ESTTop^.IndVar := False;\r
          MegaLoad(ESTTop);\r
          IF ESTTOP^.T_ObjectOffset <> 0 THEN\r
            CodeConst(rREASD,ESTTop^.T_ObjectOffset,AnonymousSpix);\r
          St_Retrieve(ESTTop^.OprType,Ptr);\r
          ESTPushConst(IntegerType,Ptr^.St_Size);\r
          MegaLoad(ESTTop);\r
          ESTPop;\r
          GenCode(rSETRE);\r
        END;\r
        ESTPop;\r
      END;\r
\r
   PROCEDURE PushSetOnStack(TypeAddr : St_Address);\r
      VAR\r
        ptr : st_elemptr;\r
        length : integer;\r
      BEGIN\r
         St_RetrieveType(TypeAddr,Ptr);\r
         Length := ptr^.St_Size;\r
         Makesetoprready;\r
         CodeConst(rRECHW,Length,Anonymousspix);\r
         GenCode(rSETAD);\r
         CodeConst(rSTNHB,2,Anonymousspix);\r
      END;\r
\r
\r
\r
\r
    PROCEDURE MakeProgramDesc(ProgOffset : Word; ProgState : State;\r
                              PoolParam : boolean; lab : St_Address);\r
      (* The procedure generate code to make the program describtion at\r
         address 'Addr'. This procedure has to be change if the pi3 type\r
         programdescribtion is change *)\r
\r
      VAR\r
        Str   : Ptr_String;\r
        Ch    : Char;\r
        Str12 : String[12];\r
        i     : integer;\r
\r
      BEGIN\r
\r
        (* Generate code to push the parameter to init_internal or\r
           init_external  *)\r
\r
        IF ProgState = Internal THEN\r
          BEGIN\r
            CodeConst(rREALD,MegaOffset(CurrentNiv,ProgOffset),Anonymousspix);\r
            CodeLoadEffAddr(LastInternalLBDRLabel,0);\r
            CallRoutine(AnonymousSpix,Init_Internal,St_extern);\r
          END;\r
\r
\r
\r
      END; (* MakeProgramDesc *)\r
\r
  Procedure MegaAllocTemp(No: Integer);\r
   var i : integer;\r
  BEGIN\r
  END;\r
\r
  Procedure MegaAllocParam(No:Integer);\r
  VAR i : Integer;\r
  BEGIN\r
  END;\r
  (* ------------------------------------------------------------- *)\r
\r
\r
END.\r
\r
\r
      (* -------------END  PROCEDURE   ESTOPR -------- ESTOPR -- *)\r
\r
«eof»