Trailing-Edge
-
PDP-10 Archives
-
FORTRAN-10_V7wLink_Feb83
-
inpt.bli
There are 12 other files named inpt.bli in the archive. Click here to see a list.
!THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
! OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
!COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1972, 1983
!AUTHOR: S.MURPHY/HPW/TFV
MODULE INPT(RESERVE(0,1,2,3),DREGS=4,SREG=#17,FREG=#16,VREG=#15,GLOROUTINES)=
BEGIN
GLOBAL BIND INPTV = 7^24 + 0^18 + #1530; ! Version Date: 4-May-82
%(
***** Begin Revision History *****
83 ----- ----- INTERFACE TO SKOPTIO
***** Begin Version 7 *****
1530 TFV 4-May-82
Setup IOLSTATEMENT filed in IOLSCLS nodes.
***** End Revision History *****
)%
SWITCHES NOLIST;
REQUIRE FIRST.BLI;
REQUIRE TABLES.BLI;
SWITCHES LIST;
EXTERNAL
BASE CSTMNT,
DOWDP, ! Global used in determining whether a given loop can
! have its loop index live in a register.
FOLDIOLST,
NEGFLG,
NOTFLG,
P2SKL1DISP,
P2SKSTMNT,
%1530% TOPIO; ! Pointer to the I/O statement above an IOLSCLS node.
GLOBAL ROUTINE SKIOLIST=
BEGIN
!***************************************************************
! Perform phase 2 skeleton optimizations on an iolist. Makes 3
! passes over the list:
!
! 1. Perform phase 2 skeleton optimizations on the
! expressions under the iolist elements.
! 2. Detect DO loops that can be folded into elists and
! fold them (not implemented in release 1).
! 3. Detect groups of DATACALLs and SLISTCALLs that can be
! folded into a single IOLISTCALL and fold them.
!
! Called with the global CSTMNT pointing to a statement with a
! potential iolist.
!***************************************************************
REGISTER
PEXPRNODE ARGNODE,
BASE IOLELEM,
BASE SAVSTMNT;
MAP OBJECTCODE DOWDP;
! Return if this statement has no iolist
IF .CSTMNT[IOLIST] EQL 0 THEN RETURN;
! Save pointer to this statement (will recurse through SKSTMN
! routines if there are any statements on this iolist
SAVSTMNT = .CSTMNT;
! Walk down the iolist performing phase 2 skeleton optimizations
! on each element
IOLELEM = .CSTMNT[IOLIST];
UNTIL .IOLELEM EQL 0
DO
BEGIN ! Walk down the iolist
IF .IOLELEM[OPRCLS] EQL STATEMENT
THEN
BEGIN
CSTMNT = .IOLELEM;
P2SKSTMNT(); ! Do skeleton optimizations
END
ELSE IF .IOLELEM[OPRCLS] EQL IOLSCLS
THEN
BEGIN
%1530% ! Setup pointer to the I/O statement above the IOLSCLS
%1530% IOLELEM[IOLSTATEMENT] = .TOPIO;
! For a DATACALL node, perform phase 2 skeleton
! optimizations on expressions under this node
IF .IOLELEM[OPERSP] EQL DATACALL
THEN
BEGIN
NEGFLG = FALSE;
NOTFLG = FALSE;
ARGNODE = .IOLELEM[DCALLELEM];
IOLELEM[DCALLELEM] = (.P2SKL1DISP[.ARGNODE[OPRCLS]])(.ARGNODE);
! Check whether the argument to FOROTS is the
! index of the current DO loop. If so, don't
! make it an AOBJN loop (problems with using
! right-half of register.
ARGNODE = .IOLELEM[DCALLELEM];
IF .ARGNODE EQL .DOWDP[DOINDUC]
THEN DOWDP[DONOAOBJN] = 1;
END;
END;
! Go on to next element
IOLELEM = .IOLELEM[CLINK];
END; ! Walk down iolist
CSTMNT = .SAVSTMNT; ! Restore CSTMNT
! Walk down the iolist performing folding of DO loops into ELISTs is
! not implemented in release 1 (Aug 17,1972 - SRM).
! Walk down the iolist, folding groups of elements that can form a
! single IOLISTCALL
FOLDIOLST();
END; ! of SKIOLIST
END
ELUDOM