! ftriads1 ! 10/10/86 - copied from ftntriads6 ! ! 20/02/86 - comment out code for SW(ARREL) in PRINT TRIAD ! 22/01/86 - insert FPTOS, change PRINT TR for type 4 STMT triads ! - include updated ftn_fmts files ! 14/01/85 - conditional compilation ! 28/11/84 - include cfort_ files for common version ! 18/09/84 - insert switch for STFNID in ANAL and set QUAL(24) to "STFNID" ! 10/07/84 - new version of targ_fptos ! 03/07/84 - put FPTOS in an include file ! - set up string REG1 in tagr_taget & substitute for "reg-1" ! 21/03/84 - amend arrays OPVALS, ST, SZTY & REG ! 19/03/84 - change some address increments to W! etc. ! 08.03.84 - change INTEGER mapping increments to W1 ! 28/02/84 - FPTOS inserted !* ! 01/11/83 copied from ercs06.rel90_optextb15 !* %CONSTINTEGER OPSYS=0 ! =0 (Emas ISO) ! =1 (VME EBCDIC) !* %include "ftn_ht" {%include "ftn_consts3"} !* modified 23/09/86 !* !* %constinteger WSCALE = 2;! scale word address to byte address %constinteger BSCALE = 0;! scaling factor for words to architectural units %constinteger CSCALE = 0;! byte offset to architectural unit offset %constinteger DSCALE = 2;! dict pointer scaling in RES records !* %constinteger W1 = 4 ;! 1 word in architectural units %constinteger W2 = 8 ;! 2 words in architectural units %constinteger W3 = 12 ;! 3 words in architectural units %constinteger W4 = 16 ;! 4 words in architectural units !* %constinteger TRIADLENGTH = 12 ;! size of an individual triad %constinteger BLRECSIZE = 44 ;! size of a block table entry in architectural units %constinteger LOOPRECSIZE = 16 ;! size of a loop table entry %constinteger PROPRECSIZE = 12 ;! size of a propagation table entry %constinteger CLOOPSZ = 12 ;! size of cloop table entry %constinteger FRSIZE = 8 ;! size of freelist created by PUSHFREE %constinteger TESZ = 20 %constinteger DTSZ = 20 %constinteger ARTICSZ = 4 %constinteger CTSIZE = 2 ;! used in OP3 %constinteger EXTNSIZE = 4 ;! used in OP3 !* !* following used in strength reduction !* %constinteger RDSZ = 8 %constinteger RUSESZ = 12 %constinteger RTESTSZ = 4 %constinteger RDEFSZ = 16 %constinteger USESZ = 32 %constinteger SRUSESZ = 2 %constinteger SRSCALE = 2;! SR==RECORD(ABLOCKS + SRPTR< SW(TAB) %IF TAB<2 %AND TAB>=0 -> PRINT SW(0): NEWLINE PRINTSTRING("TRIADNO LHS OP RHS") %IF LEVEL=2 %THEN %START SPACES(11) PRINTSTRING("QL QR MODE") %FINISH NEWLINE %RETURN SW(1): PRINTSTRING("t".S) SPACES(INDENT(TAB)-LEN-1) %RETURN PRINT: PRINTSTRING(S) %IF IRADR#0 %THENSTART WRITE(IRADR,12) IRADR=0 LEN=LEN+12 %FINISH SPACES(INDENT(TAB)-LEN) %RETURN %END !* *! !* ITOS *! !* *! %STRING(31) %FN ITOS(%INTEGER N) %CONSTINTEGERARRAY TENS(0:9)=%C 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000 %STRING(11) RES %INTEGER M,R,I,STARTED,J %IF N=0 %THEN %RESULT="0"; %IF N<0 %THEN N=-N %AND RES="-" %ELSE RES="" STARTED=0 %CYCLE I=9,-1,0 R=TENS(I) %IF N>=R %OR STARTED#0 %START STARTED=1 M=N//R RES=RES.TOSTRING(M+'0') N=N-M*R %FINISH %REPEAT %RESULT=RES %END !* *! !* ANAL *! !* *! %ROUTINE ANAL(%INTEGER INDEX,OPD,TAB,ADICT,ANAMES,LEVEL) %SWITCH SW(0:66) %SWITCH T(0:14) %STRING(32) S %INTEGER J,LEN,ADR,IDEN,I,K %REAL X,Y %LONGREAL XX,YY {%LONGLONGREAL XXX,YYY } %RECORD (CONSTRECF) %NAME CNST %RECORD (PRECF) %NAME SCAL %RECORD (PRECF) %NAME PROC %RECORD (TMPF) %NAME TMP %RECORD (LABRECF) %NAME LAB %RECORD(PLABF)%NAME PLAB %RECORD(TERECF)%NAME TE %RECORD(DTRECF)%NAME DT -> SW(INDEX) SW(*):%RETURN SW(NULL): !NULL NULL PSTRING(TAB,QUAL(0),LEVEL) %RETURN SW(LIT): !LITERAL LIT S=ITOS(OPD) SW1: PSTRING(TAB,S,LEVEL) %RETURN SW(NEGLIT): S="-".ITOS(OPD) ->SW1 SW(CNSTID): !CONST RECORD IN DICT CNSTID CNST==RECORD(OPD< T(CNST_MODE) T(INT2): %if HOST=PERQPNX %or HOST=ICL2900 %thenstart J=HALFINTEGER(ADR+ADICT) %finishelsestart J=SHORTINTEGER(ADR+ADICT) %finish -> INT T(INT4): J=INTEGER(ADR+ADICT) -> INT T(INT8): J=INTEGER(ADR+ADICT+W1) INT: S=ITOS(J) SOUT: PSTRING(TAB,S,LEVEL) %RETURN T(REAL4): X=REAL(ADR+ADICT) S=FPTOS(ADDR(X),3) ->SOUT T(REAL8): XX=LONGREAL(ADR+ADICT) S=FPTOS(ADDR(XX),4) ->SOUT !* {%include "targ_text2"} ! *********************************************************************** ! include code for REAL*16 numbers if required in OPTEXTnn ! *********************************************************************** {end "targ_text2"} !* T(CMPLX8): X=REAL(ADR+ADICT) Y=REAL(ADR+ADICT+W1) S="(".FPTOS(ADDR(X),3).",".FPTOS(ADDR(Y),3).")" ->SOUT T(CMPLX16): XX=LONGREAL(ADR+ADICT) YY=LONGREAL(ADR+ADICT+W2) S="(".FPTOS(ADDR(XX),4).",".FPTOS(ADDR(YY),4).")" -> SOUT SP: %IF CNST_MODE<6 %THEN J=9 %ELSE J=21 SPACES(INDENT(TAB)-J) %RETURN T(LOG4): J=INTEGER(ADR+ADICT) -> LOG T(LOG8): J=INTEGER(ADR+ADICT+W1) LOG: %IF J#0 %THEN J=1 PSTRING(TAB,LOGVAL(J),LEVEL) %RETURN T(CHARMODE): T(HOLMODE): LEN=INTEGER(ADR+ADICT) %IF LEN>4 %THEN LEN=4 COPY(LEN,ADR+ADICT,4,ADDR(S),1) LENGTH(S)=LEN S="'".S."'" LEN=LEN+2 {%include "targ_text1"} ! ************************************************************************* ! include code for EBCDIC/ISO conversion if required in OPTEXTnn ! ************************************************************************* {end "targ_text1"} PSTRING(TAB,S,LEVEL) %RETURN T(*): %RETURN SW(SRTEMP): ! strength reduction temporary S="sr".ITOS(OPD) ->SOUT SW(ARREL): ! ARRAY ELEMENT TRIAD SW(CHAREL): ! CHAR SUBSTRING TRIAD SW(TRIAD): !TRIAD TRIAD S=ITOS(OPD) S="t".S ->SOUT SW(LSCALID): !LOCAL SCALAR LSCALID SW(OSCALID): !OWN SCALAR OSCALID SW(CSCALID): !COMMON SCALAR CSCALID SW(ASCALID): ! scalar equivalenced to array SW(PSCALID): !PARAMETER SCALAR PSCALID SW(ARRID): !ARRAY ID ARRID SCAL==RECORD(OPD<SOUT SW(PERMID): SW(TMPID): !TEMP SCALAR TMPID TMP==RECORD(OPD<SOUT SW(LABID): !LABEL IDENTIFIER LABID LAB==RECORD(OPD<SOUT SW(PLABID): !PRIVATE LABEL IDENTIFIER PLABID PLAB==RECORD(ADICT+OPD<SOUT SW(PROCID): !PROCEDURE IDENTIFIER PROCID SW(STFNID): !STMT. FUNCTION IDENTIFIER PROC==RECORD(ADICT+OPD<SOUT !SW(ARREL): !ARRAY ELEMENT REFERENCE ARREL ! PROC==RECORD(OPD<SOUT SW(VALTEMP): TE==RECORD(ADICT+OPD<SOUT SW(DESTEMP): DT==RECORD(ADICT+OPD<SOUT SW(BREG): S=REG1 ->SOUT %END !* !* PRINT TRIAD !* %CONSTBYTEINTEGERARRAY HEX(0 : 15) = %C '0','1','2','3','4','5','6', '7','8','9','A','B','C','D','E','F' %ROUTINE PRHEX(%INTEGER J) %INTEGER K %CYCLE K = 28,-4,0 PRINT SYMBOL(HEX((J>>K)&15)) %REPEAT %END %ROUTINE DUMP(%INTEGER AD,LEN) %INTEGER I %CYCLE I=1,1,3 SPACES(2) PRHEX(INTEGER(AD)) AD=AD+W1 %REPEAT %END;! DUMP !* %externalroutine Print Tr(%integer Index,Adict,Anames,Level, %record(Triadf)%name Triads) %INTEGER I,J,VAL %STRING(32) MODE,OP,NO,SPARE %STRING(1) P NO="" SPARE="" IRADR=0 %IF LEVEL<0 %THENSTART LEVEL=-LEVEL PSTRING(0,NO,LEVEL) %FINISH NO=ITOS(INDEX) PSTRING(1,NO,LEVEL) P="t" OP=OPVALS(TRIADS_OP&X'7F') %IF OP="PAUSE" %OR OP="STOP" %THENSTART PSTRING(2," ",LEVEL) ->SKIP %FINISH %IF OP="IOSPEC" %THENSTART PRINTSTRING(" IOSPEC ") ->OUT %FINISH %IF OP="IO" %THENSTART PRINTSTRING(" IO ") ->OUT %FINISH %IF OP="PA" %THENSTART PSTRING(2,"NULL",LEVEL) PSTRING(3,OP,LEVEL) PSTRING(4,"NULL",LEVEL) -> OUT %FINISH %IF OP="STMT" %THENSTART PSTRING(2,ITOS(TRIADS_SLN),LEVEL) MODE="NULL" %IF TRIADS_VAL2=4 %THENSTART PSTRING(3,OP,LEVEL) %IF TRIADS_QOPD2=0 %THEN SPARE="start " %ELSE SPARE="end " SPARE=SPARE.STRING(TRIADS_OPD2<SKIP2 %FINISH %FINISHELSESTART ANAL(TRIADS_QOPD1,TRIADS_OPD1,2,ADICT,ANAMES,LEVEL) MODE=SZTY(TRIADS_MODE&15) %FINISH SKIP: PSTRING(3,OP,LEVEL) ANAL(TRIADS_QOPD2,TRIADS_OPD2,4,ADICT,ANAMES,LEVEL) SKIP2:%IF LEVEL=2 %THEN %START PSTRING(5,MODE,LEVEL) PSTRING(6,QUAL(TRIADS_QOPD1),LEVEL) PSTRING(7,QUAL(TRIADS_QOPD2),LEVEL) %IF SPARE#"" %THEN PSTRING(8,SPARE,LEVEL) %AND SPARE="" %FINISH OUT: DUMP(ADDR(TRIADS_OP),12) NEWLINE %end;! Print Tr !* %endoffile