Trailing-Edge
-
PDP-10 Archives
-
decuslib10-05
-
43,50337/13/cgiw.mac
There are 2 other files named cgiw.mac in the archive. Click here to see a list.
COMMENT;
AUTHOR: I WENNERSTR@M
UPDATED AT ACADIA UNIVERSITY FOR KA10
VERSION:3A [14]
PURPOSE(S):THIS MODULE IS PART OF THE CODE GENERATION IN PASS 2
IT ADMINISTRATES THE USE OF THE RUN TIME ACCUMULATORS
XWAC1 TO XWACL.
TWO SUBROUTINES GET ACCUMULATORS CGG AND RELEASE ACCUMULATORS CGR
WITH MULTIPLE ENTRY POINTS ARE DEFINED.
CODE TO STORE AND RESTORE THE ACCUMULATORS IN THE PSEUDOREGISTER
STACK ARE GENERATED WHEN THE REAL ACCUMULATORS ARE OCCUPIED
ONE COMPLICATION IS THAT THE RESERVED ACCUMULATORS MUST BE
CONSECUTIVE AND IF AT RESERVATION TIME SOME ACCUMULATORS WERE
SKIPPED IN ORDER TO GET CONSECUTIVE ACCUMULATORS
,THEN AT RELEASE TIME CODE MUST BE GENERATED
TO MOVE THE RESULT TO THE FIRST UNUSED ACCUMULATOR.
CONTENTS:
ROUTINE CGG WITH ENTRY POINTS CGG1,CGG2,......,CGG10
ROUTINE CGR WITH ENTRY POINTS CGR,CGR1,CGR2,......,CGR7
;
TWOSEG
SALL
SEARCH SIMMAC,SIMMC2,SIMMCR
CTITLE CGIW
CGINIT
MACINIT
RELOC 400K
EXTERN CGAD,CGCA,CGCC,CGCO,CGIM,CGIM1,CGMO,CGMO1,CGPU,CGVA,O2AD,O2GI,O2GWD
EXTERN CADS,O2CF,O2DF,O2GA,O2GF,O2GR,O2GW,O2IV,CGLO,CGLO1,M2CO
EXTERN YTAC,YACTAB,YCGXAC,YCGNAC,YCGSK,YCGACT ;EXTERNAL VARIABLES
EXTERN YDCSTO,YDCSTP
INTERN CGG1,CGG2,CGG3,CGG4,CGG5,CGG6,CGG7,CGG8,CGG9,CGG10 ;GET AC's
INTERN CGR,CGR1,CGR2,CGR3,CGR4,CGR5,CGR6,CGR7 ;RELEASE ACCUMULATORS
INTERN CGPD,CGRA
INTERN CGIACT ;[14]
SUBTTL LOCAL DECLARATIONS
QNXAC=QNAC+QNAC
YACTAP=YACTAB+QNAC ;FIRST PSEUDOREGISTER ENTRY IN YACTAB
YACTAE=YACTAP+QNAC
;YACTAB IS USED TO CONTROL THE RTS ACCUMULATORS XWAC1,...XWACL
;FIRST PART OF TABLE HAS ONE ENTRY PER REAL ACCUMULATOR
;AND LAST PART HAS ONE ENTRY PER PSEUDOACCUMULATOR
;WHICH CAN ONLY BE ONE PER REAL ACCUMULATOR
DF (YACTPF,0,18,17) ;POINTER FIELD IN YACTAB
;CONTENTS:
;AT EXIT FROM RESERVATION /GET ROUTINE
;0 IF RESERVATION PERFORMED AND
; XCUR VALUE IN FIRST ENTRY
;OR
; POINTER POINTS AT ITSELF WHEN THE ENTRY WAS
;SKIPPED IN ORDER TO GET CONSECUTIVE
; ACCUMULATORS
;
;AT EXIT FROM RELEASE ROUTINE
;SKIPPED ENTRIES REMOVED AND
;POINTER FIELD IS COPIED FROM XWAC1 (AND XWAC2)
;ENTRIES
;NORMAL CASE UNCHANGED
DF (YACTAF,0,18,35) ;ADDRESS FIELD IN YACTAB
;CONTAINS:
;ACCUMULATOR NUMBER IF RESERVED OR REAL NOT
;USED ACCUMULATOR
;OR
;PSEUDOREGISTER FIXUP INDEX IF
; SAVED ACCUMULATOR (ONLY TEST VERSION)
;OR
;777777 IF NOT USED PSEUDOREGISTER ENTRY
;LOCAL REGISTER ASSIGNMENTS
XCG1=X2
XCG2=X3
SUBTTL CGG,GET (OR RESERVE) ACCUMULATORS
COMMENT;
PURPOSE:TO RESERVE ACCUMULATORS AND GENERATE CODE IF PSEUDOREGISTER
STACK INVOLVED
ENTRIES:CGG1,CGG2,...,CGG7
INPUT ARGUMENTS:ENTRY POINT ESTABLISH NUMBER OF ACCUMULATORS NEEDED
YTAC POINTS AT FIRST ACCUMULATOR
TO BE USED TO SATISFY THE REQUEST
NORMAL EXIT: RETURN
OUTPUT ARGUMENTS:YTAC POINTS AT FIRST OF THE RESERVED ENTRIES
CALL FORMAT:EXEC CGG1,....,EXEC CGG7
ERRORS GENERATED:RFAIL MESSAGES CG YACTAB ERR0R1 ,ENTRY NEITHER 777777 NOR ACC.NUMBER
CG YACTAB ERR0R2 ,ENTRY YTAC<YACTAB
CG YACTAB ERR0R9 ,SKIPPED ACCUM IS<= XWAC1+YCGNAC-1
USED SUBROUTINES:GENFIX
;
PROC
CGG10: LI X1,^D10
GOTO CGG
CGG9: LI X1,9
GOTO CGG
CGG8: LI X1,8
GOTO CGG
CGG7: LI X1,7
GOTO CGG
CGG6: LI X1,6
GOTO CGG
CGG5: LI X1,5
GOTO CGG
CGG4: LI X1,4
GOTO CGG
CGG3: LI X1,3
GOTO CGG
CGG2: LI X1,2
GOTO CGG
CGG1: LI X1,1
CGG: ;COMMON ENTRY X1 CONTAINS NUMBER OF ACCUMULATORS
; TO BE RESERVED
ADD X1,YTAC
ASSERT <
IF L X0,YTAC
STACK X1
SUBI X1,YACTAB
PUSHJ XPDP,GATAB(X1)
UNSTK X1
CAIL X0,YACTAB
GOTO FALSE
THEN
RFAIL (CG YACTAB ERR0R2)
GATAB: REPEAT 30,<POPJ XPDP,0
>
FI
>
IF CAILE X1,YACTAP
GOTO FALSE
THEN WHILE
CAMN X1,YTAC
GOTO FALSE
DO
HRRZS ,-1(X1) ;ZERO TO POINTER FIELD
SOJ X1,
OD
HRLM XCUR,@YTAC ;SET POINTER IN FIRST RESERVED ENTRY
RETURN ;RETURN IF NO PSEUDOREGISTERS INVOLVED
FI
;REAL ACCUMULATORS ARE NOT AVAILABLE
SUB X1,YTAC
ST X1,YCGNAC ;SAVE NUMBER OF ACCUMULATORS TO BE RESERVED
STACK XCG1
STACK XCG2 ;SAVE REGISTERS
L X1,YTAC
IF CAILE X1,YACTAP ;[14] CAILE INSTEAD OF CAIL TO GET THE
; WARNING ALSO WHEN CGG1 IS CALLED TO
; GET THE FIRST PSEUDO AC.
GOTO FALSE
THEN
WARNING 1,INTERMEDIATE QUANTITIES SAVED
FI
LF (XCG2) YACTAF(X1,-1) ;FETCH LAST RESERVED ACCUMULATOR
;SKIP UNTIL OUT IF SKIP NECESSARY
WHILE AOJ XCG2, ;FIND FIRST TO BE RESERVED
CAIN XCG2,XWACL+1
LI XCG2,XWAC1 ;FIRST AFTER LAST
ADD XCG2,YCGNAC ;FIND LAST+1 ACCUMULATOR TO BE RESERVED
CAIG XCG2,XWACL+1
GOTO FALSE ;CONSECUTIVE ACCUMULATORS POSSIBLE WITHOUT SKIP
DO
;FIND NEXT XWAC1
SETON SCGSKP
SF (X1) YACTPF(X1) ;MARK THAT THIS ENTRY HAS BEEN SKIPPED
;POINTER FIELD POINTS AT ITSELF
CAIL X1,YACTAE-QNAC
GOTO L1 ;YACTAB OVERFLOW
LF (X0) YACTAF(X1)
SF (X0) YACTAF(X1,QNAC) ;INDICATE THAT REGISTER IS FREE AND SKIPPED
ASSERT <
IF SUB X0,YCGNAC
CAILE X0,XWAC1-1
GOTO FALSE
THEN ;FIRST SKIPPED IS LESS THAN OR EQUAL XWAC1+YCGNAC-1
RFAIL (CG YACTAB ERR0R9)
FI
>
AOJ X1, ;NEXT ENTRY
SUB XCG2,YCGNAC ;RESTORE ACCUMULATOR NUMBER AND HANDLE
;NEXT ENTRY
; LOOP STOP WHEN LAST+1 ACCUMULATOR IS REACHED
OD
SUB XCG2,YCGNAC ;FIND FIRST ACCUMULATOR TO BE RESERVED
ST X1,YTAC ;RETURN VALUE OF YTAC FOUND
;???/SA CAIN X1,YACTAP
L XCG1,YCGXAC ;FETCH PSEUDOREGISTER STACK POINTER
; WITH FIXUP INDEX IN RIGHT HALF
;GENERATE CODE TO STORE RESERVED ACCUMULATORS IN PSEUDOREGISTER STACK
;AND UPDATE YACTAB ENTRIES
LOOP CAIL X1,YACTAE
GOTO L1 ;FATAL ERROR IF YACTAB OVERFLOW
LF (X0) YACTAF(X1)
IF CAMN X0,XCG2
GOTO FALSE ;REGISTER ALREADY FREE
THEN ;ACCUMULATOR MUST BE SAVED
STACK X1
ASSERT < IF CAIN X0,777777
GOTO FALSE
THEN RFAIL (CG YACTAB ERROR 1)
FI
>
ASSERT <
SF (XCG1) YACTAF(X1,-QNAC) ;STORE PSEUDOREGISTER
; FIXUP INDEX
>
;GENERATE SAVE ACCUMULATOR IN PSEUDOREGISTER STACK
;***AUBEG
;IGNORE KA10WARNING SINCE DMOVE AND DMOVEM ARE UUOS
; KA10WARNING
;***AUEND
OP (DMOVEM) ;ASSUME DMOVEM INSTRUCTION
LF (X1) YACTAF(X1,+1)
CAIE X1,777777
OP (MOVEM) ;ASSUME MOVEM IF NEXT ENTRY IS ALREADY FREE
IF L X1,YCGNAC
TRNN X1,1
GOTO FALSE ;YCGNAC IS EVEN
THEN
CAME XCG1,YCGXAC
GOTO L3 ;NO GENERATION OF CODE IF
;YCGNAC IS ODD AND NOT FIRST,
;DMOVEM IS USED
;***AUBEG
;IGNORE KA10WARNING SINCE DMOVE AND DMOVEM ARE UUOS
KA10WARNING
;***AUEND
OP (MOVEM) ;GENERATE MOVEM
FI
DPB XCG2,[POINT 4,X0,12]
;STORE ACCUMULATOR IN INSTRUCTION
HRR X0,XCG1 ;STORE PSEUDOREGISTER
; FIXUP INDEX IN INSTRUCTION
GENFIX
L3(): UNSTK X1 ;RESTORE TO CURRENT ENTRY IN YACTAB
AOBJP XCG1,L1 ;FATAL ERROR IF PSEUDOREGISTER OVERFLOW
FI
AS
ST XCG2,(X1) ;0,ACCUMULATOR NUMBER TO ENTRY
AOJ XCG2, ;NEXT ACCUMULATOR
SOSE ,YCGNAC ;SKIP IF ALL ACCUMULATORS RESERVED
AOJA X1,TRUE ;HANDLE NEXT ENTRY
ST XCG1,YCGXAC
;SAVE NEW PSEUDOREGISTER POINTER
UNSTK XCG2
UNSTK XCG1
HRLZ @YTAC
LSH 5 ; UPDATE TOP AC IN ACFIELD
ST YCGACT
HRLM XCUR,@YTAC ;SET POINTER IN FIRST RESERVED ENTRY
RETURN ;RETURN IF PSEUDOREGISTERS INVOLVED
SA
L1(): ERROR2 35,EXPRESSION TOO COMPLICATED
UNSTK XCG2
UNSTK XCG1
BRANCH CGPU ; PURGE CURRENT EXPRESSION AND CONTINUE
EPROC
SUBTTL CGR,RELEASE ACCUMULATORS ROUTINE
COMMENT;
PURPOSE:TO RELEASE ACCUMULATORS THAT IS TO GENERATE CODE IF RESERVED
ACCUMULATORS ARE STORED IN PSEUDOREGISTER STACK
ENTRIES:CGR,CGR1,....,CG7
ALL ENTRY POINTS ARE THE SAME,THE DIFFERENT NAMES ARE KEPT TO
FACILITATE MATCHING WITH THE GET ACCUMULATORS ROUTINE
INPUT ARGUMENTS:YTAC POINTS AT LAST OR LAST-1 YACTAB ENTRY THAT SHOULD
STILL BE RESERVED.
WHETHER THE RESULT OCCUPIES ONE OR TWO ACCUMULATORS IS
ESTABLISHED VIA THE ZNO-RECORD POINTER IN YACTPF.
NORMAL EXIT: RETURN
ERROR EXIT: NONE
OUTPUT ARGUMENTS:YTAC UNCHANGED UNLESS SOME ENTRIES WERE SKIPPED AT
RESERVATION TIME.
IF SO YTAC POINTS TO FIRST OF THESE AND THE POINTER FIELDS
ARE UPDATED.CODE IS GENERATED TO MOVE XWAC1 (AND XWAC2) TO THE
NEW ACCUMULATORS.
CALL FORMAT: EXEC CGR,EXEC CGR1,....EXEC CGR7
ERRORS GENERATED:RFAIL MESSAGES CG YACTAB ERR0R2 ,YTAC<YACTAB
CG YACTAB ERR0R4 ,TOO MANY ACCUMULATORS RELEASED
CG YACTAB ERR0R5 ,PSEUDOREGISTER ERROR IN ADDRESS
CG YACTAB ERR0R6 ,SKIPPED WAS NOT PERFORMED
CG YACTAB ERR0R7 ,YTAC POINTER OUT OF TABLE
CG YACTAB ERR0R8 ,LONG ARGUMENT NEEDS TWO ACCUMULATORS
USED SUBROUTINES:GENFIX,GENABS
;
PROC
CGR7:
CGR6:
CGR5:
CGR4:
CGR3:
CGR2:
CGR1:
CGR: ; COMMON ENTRY
; RELEASE ALL ENTRIES FOLLOWING YTAC ENTRY OR
; YTAC ENTRY +1 IF LONG ARGUMENT
L X1,YTAC
ASSERT <
IF CAIL X1,YACTAB
GOTO FALSE
THEN RFAIL (CG YACTAB ERR0R2)
FI
>
CAIGE X1,YACTAP
RETURN ;RETURN WHEN NO PSEUDOREGISTERS INVOLVED
;RESTORE OF ACCUMULATORS NECESSARY
; RESET YTAC TO VALUE AFTER CORRESPONDING GETAC
HRRZ X1,YLINK
IFOFF SCGSKP
SKIPA X1,2(X1) ; YTAC STACK LOCATION
LI X1,YACTAP
ST X1,YTAC ; RESET YTAC
STACK XCG1
STACK XCG2
L XCG1,YCGXAC ;FETCH PSEUDOREGISTER STACK POINTER
; WITH FIXUP INDEX IN RIGHT HALF
L XCG2,X1 ;CURRENT ENTRY IN YACTAB
SETZM ,YCGNAC ;0 INDICATES ONE ACCUMULATOR LEFT AFTER RELEASE
L X1,XCUR
IFLONG
AOS ,YCGNAC ;1 INDICATES TWO ACCUMULATORS LEFT AFTER RELEASE
;FIND OUT IF SKIP WAS PERFORMED AT RESERVATION TIME
IF LF (X0) YACTAF(XCG2) ;FETCH ACCUMULATOR NUMBER
CAIE X0,XWAC1
GOTO FALSE ;NOT FIRST AND SKIP NOT INVOLVED
IFOFF SCGSKP
;WITH SKIP THAT HAS BEEN DONE
GOTO FALSE ;NOT LAST RELEASE
ASSERT <
IF LF (X0) YACTPF(XCG2,-1)
AOJ X0,
CAMN X0,XCG2
GOTO FALSE
THEN RFAIL (CG YACTAB ERR0R6)
FI
>
THEN ; PERFORM
LOOP SOJ XCG2, ;PREVIOUS ENTRY
SETZ X0,
SF (X0) YACTPF(XCG2) ;REMOVE POINTER
LI X0,777777
SF (X0) YACTAF(XCG2,QNAC) ;INDICATE THAT THIS
;ACCUMULATOR IS NO LONGER SKIPPED
LF (X0) YACTPF(XCG2,-1)
AOJ X0,
AS CAMN X0,XCG2
GOTO TRUE ;CONTINUE IF NOT FIRST OF SKIPPED ENTRIES
SA
;FIRST ENTRY FOUND
EXCH XCG2,YTAC ;AT EXIT YTAC MUST POINT TO FIRST OF SKIPPED ENTRIES
LF (X0) YACTPF(XCG2) ;FETCH POINTER FIELD OF XWAC1 ENTRY
HRLM X0,@YTAC ;TO NEW RESULT ENTRY
L X0,@YTAC ;FETCH ACCUMULATOR NUMBER
OP (MOVEM XWAC1,)
IF SKIPN ,YCGNAC
GOTO FALSE ;ONLY ONE ACCUMULATOR LEFT IN RESULT
THEN L X1,YTAC
ASSERT <
IF LF (X0) YACTAF(X1)
CAIE X0,XWACL
GOTO FALSE
THEN RFAIL (CG YACTAB ERR0R8)
FI
>
LF (X0) YACTPF(XCG2,1) ;FETCH POINTER FIELD OF XWAC2 ENTRY
SF (X0) YACTPF(X1,1) ;TO NEW RESULT ENTRY
L X0,@YTAC
;***AUBEG
;IGNORE KA10WARNING SINCE DMOVE AND DMOVEM ARE UUOS
; KA10WARNING
;***AUEND
OP (DMOVEM XWAC1,) ;GENERATE DMOVEM XWAC1,
SOJ XCG2,
FI
GENABS ;GENERATE MOVEM XWAC1,CURRENT ACCUMULATOR
;OR DMOVEM XWAC1,CURRENT ACCUMULATOR
SOJ XCG2, ;XWACL ENTRY
FI ;RESTORE ALL ACCUMULATORS STARTING TO TEST ENTRY XCG2+1
ADD XCG2,YCGNAC ;SKIP ONE MORE ACCUMULATOR IF LONG
SETZM ,YCGNAC
WHILE CAIL XCG2,YACTAE-1
GOTO FALSE ;END OF TABLE REACHED
LF (X0) YACTAF(XCG2,1)
CAIN X0,777777
GOTO FALSE ;ACCUMULATOR NOT RESERVED
LF (X0) YACTPF(XCG2,1-QNAC)
ADDI X0,QNAC-1
CAMN X0,XCG2
GOTO FALSE ;ENTRY SKIPPED,
; DO NOT RELEASE ACCUMULATOR
DO
AOS ,YCGNAC ;UPDATE COUNTER
AOJ XCG2, ;NEXT ENTRY
OD
ASSERT <
IF CAIGE XCG2,YACTAE
GOTO FALSE
THEN ;POINTER OUTOF TABLE
RFAIL (CG YACTAB ERR0R7)
FI
>
;YCGNAC =NUMBER OF ENTRIES TO RELEASE
;XCG2 POINTS AT LAST ENTRY TO RELEASE
WHILE
SKIPG ,YCGNAC
GOTO FALSE ;EXIT IF LAST ACCUMULATOR RESTORED
DO
IF L X0,YCGNAC
TRNN X0,1
GOTO FALSE ;YCGNAC EVEN ,DO NOT GENERATE
THEN ;YCGNAC ODD ,ALWAYS GENERATE
;***AUBEG
;IGNORE KA10WARNING SINCE DMOVE AND DMOVEM ARE UUOS
; KA10WARNING
;***AUEND
OP (DMOVE) ;ASSUME DMOVE
CAMN XCG1,YCGXAC ;
OP (MOVE) ;GENERATE MOVE IF FIRST RESTORE
;INSTRUCTION
HRR X0,XCG1 ;INSERT PSEUDOREGISTER FIXUP INDEX
SOJ X0, ;CORRECT FIXUP INDEX
LF (X1) YACTAF(XCG2) ;FETCH ACCUMULATOR NUMBER
DPB X1,[POINT 4,X0,12] ;AND MOVE TO INSTRUCTION
GENFIX ;GENERATE RESTORE INSTRUCTION
FI
SUB XCG1,[XWD 1,1] ;UPDATE STACK POINTER
LF (X1) YACTAF(XCG2) ;SAVE REGISTER NUMBER
LI X0,777777
SF (X0) YACTAF(XCG2) ;SET ENTRY TO 777777
LF (X0) YACTAF(XCG2,-QNAC)
SF (X1) YACTAF(XCG2,-QNAC) ;RESTORE ENTRY
ASSERT <
IF HRRZ X1,XCG1
CAMN X0,X1
GOTO FALSE
THEN ;ACCUMULATORS ARE NOT OK
RFAIL (CG YACTAB ERR0R5)
FI
>
;CONTINUE WITH PREVIOUS ENTRY
SOS ,YCGNAC
SOJ XCG2,
OD
UNSTK XCG2
ST XCG1,YCGXAC ;UPDATE PSEUDOREGISTER POINTER
ASSERT <
IF HLRZ X0,XCG1
CAIL X0,-QNXAC-1
GOTO FALSE
;TOO MANY ACCUMULATORS RELEASED
THEN RFAIL (CG YACTAB ERROR 4)
FI
>
UNSTK XCG1
RETURN ;RETURN WHEN PSEUDOREGISTERS INVOLVED
EPROC
SUBTTL CGPD-PUSH DOWN YACTAB IN DECLARATION STACK
COMMENT;
PURPOSE: PUSH DOWN AC DESCRIPTION AND INITIALIZE A NEW ONE
ENTRY: CGPD
;
SSIZE=QNXAC
TSIZE=SSIZE+6
CGPD: PROC
SAVE<X2,X3>
L X2,YDCSTP
LI X3,TSIZE(X2)
CAML X3,YDCSTO
EXEC M2CO
ST X3,YDCSTP
MOVSI YACTAB
ADD X2
BLT SSIZE(X2)
L YTAC
ST SSIZE+1(X2)
L YCGXAC
ST SSIZE+2(X2)
L YCGACT
ST SSIZE+5(X2)
EXEC CGIACT ;[14]
RETURN
EPROC
SUBTTL CGIACT INITIATE YACTAB AND YTAC
COMMENT;
PURPOSE: TO INITIATE THE DESCRIPTION IN YACTAB
AND TO SET YTAC TO POINT TO YACTAB
SET YCGXAC TO [-QNAC-1,,YXA1]
ENTRY: CGIACT
CALL FORMAT: EXEC CGIACT
;
CGIACT: PROC
LI X2,YACTAB
ST X2,YTAC
LI XWAC1
LI X1,-1
WHILE CAME (X2)
CAIL X2,YACTAB+QNAC
GOTO FALSE
DO
ST (X2)
ST X1,QNAC(X2)
ADDI 1
ADDI X2,1
OD
L X0,[-QNAC-1,,YXA1]
ST X0,YCGXAC
RETURN
EPROC
SUBTTL CGRA-RESTORE YACTAB DESCRIPTION
CGRA: PROC
SAVE <X2,X3>
L X2,YDCSTP
SUBI X2,TSIZE
ST X2,YDCSTP
LI YACTAB
HRLI (X2)
BLT YACTAE-1
L SSIZE+1(X2)
ST YTAC
L SSIZE+2(X2)
ST YCGXAC
L SSIZE+3(X2)
ST YCGNAC
L SSIZE+4(X2)
ST YCGSK
L SSIZE+5(X2)
ST YCGACT
RETURN
EPROC
END