*DECK     IF
          IDENT  IF 
 IF       SECT   (*IF* STATEMENT PROCESSORS),1
  
          SST    B,D,EXIT.
          NOREF  B,D,EXIT.
  
 B=IF     RPVDEF             DEFINE ROUTINE FWA FOR REPRIEVE UTILITY
  
          ENTRY  INIF,IFSN,IFREL1,IFRESLT,IFMOD,IFS,IFS11 
  
*         IN TABLES 
          EXT    ARGCOMA,ARGMODE,CSNTAG,DTI,FIRSTV,HANGER,IFARM,NOPATH
          EXT    REFVAR,TT.PAR,TG.PRO 
  
*         IN ERRORS 
          EXT    E.IF,E.IF2,E.IF3,E.IF4,E.IF5,E.IF6,E.IF7 
          EXT    FILL.
          EXT    E.IF8
  
*         IN MAIN 
          EXT    CUS.RET,IFS.X,CSB,CST
  
*         IN NUM
          EXT    PSN,ISN
  
*         IN PAR
          EXT    PAR
  
*         IN GEN
          EXT    IFEN2,IFE1N,IFI111,IFLN2,IFL1N,IFL12,IFBASE
          EXT    NSTDIF,STDIF,MXP 
  
 IFS      SPACE  4,8
**        IFS -  PROCESS *IF* STATEMENT.
*         ENTRY  B4 - *(* FOLLOWING *IF*
  
  
 IFS      RJ     MXP         MARK EXTERNAL PROCESS
          =B2    0           NORMAL MODE
          =B4    B4+1        SET PAST *IF* IN *SB*. 
          =X6    O.SLP
          SA6    B4          DUMMY TO SET UP PARSED MODE. 
          SA2    IFARM
          =X7    0
          BX6    X2 
          SA7    ARGCOMA
          SA6    ARGMODE
          SA7    IFREL1      CLEAR ONE RELATIONAL *IF* CELL 
  
          RJ     PAR         PARSE IT...
  
**        RETURN FROM PARSER WITH *B4* _ CLOSING *)* OF *IF*
*         (IFMOD) = RESULTANT MODE OF *IF* EXPRESSION 
*         (IFRESLT) = RESULT EXPRESSION TAG, EITHER AN INTERMEDIATE OR
*                     SIMPLE VARIABLE 
  
          SA1    B4+1 
          MX0    L.SYM
          =B4    B4+1        POINT TO 1ST OF OBJECT 
          ZR     X1,E.IF     IF MISSING OBJECT OF *IF*
          =B2    X1-O.CONS
          BX6    X0*X1
          SA6    FILL.       RESET FILL.
          SA2    IFMOD
          SA6    FIRSTV      RESET FIRST VARIABLE FOR *CST* 
          ZR     B2,IFS40    IF OBJECT OF *IF* IS A STATEMENT NUMBER
          SB7    X2-M.LOG 
          ZR     B7,IFS10    IF *LOGICAL* (ONE BRANCH) *IF* 
  
**        IF EXPRESSION NOT LOGICAL, YET SINGLE BRANCH SPECIFIED
*         OUTPUT *ANSI* ERROR AND HANDLE LIKE *3600* - ONE BRANCH *IF*
  
          EQ     =XE.IF9     ARITHMETIC IF CANNOT HAVE STMT AS OBJECT 
 IFS10    SA2    INIF 
          NZ     X2,=XE.IF11       IF LOGICAL IF IS OBJECT OF IF
 IFS11    RJ     CST
          MI     B5,=XE.FM   IF UNRECOGNIZABLE STATEMENT
          BX6    X5 
          SA6    "SB.KEY" 
          BX0    X5 
          SX4    IFLN2
          SX5    IFL1N       OPPOSITE LOGIC IF ONE BRANCH 
          IFBIT  X0,-SNIF,IFS12 
          EQ     E.IF6       OBJECT NOT ALLOWED. (RETURN TO PSN)
  
**        HERE IF LOGICAL *IF* AND OBJECT IS LEGAL. *IF(L)N,2 
*         (LOGICAL = 1 BRANCH IF...)
*         WHERE 2 IS EITHER A PROGRAMMER DEFINED LABEL OR ONE GENERATED 
*         BY THE COMPILER TO JUMP TO. 
*                IE.  IF(EXP) 1,2     EQUIVALENT   IF(EXP)C=D 
*                   1  C=D                      2  X=Y
*                   2  X=Y
  
 IFS12    SA1    DTI
          ZR     X1,IFS15    IF NOT *DO* TERMINATOR.
          IFBIT  X0,-SDON/SNIF,IFS15
          ANSI   E.IF2       OBJECT OF IF IS ILLEGAL DO TERMINATOR
          SX4    IFLN2
          SX5    IFL1N       OPPOSITE LOGIC IF ONE BRANCH 
 IFS15    SA1    =XFLOW 
          NZ     X1,IFS.X    IF NO PATH 
          ALLOC  TT.PAR,L.TURP
  
**        (X4) = ADDRESS OF SKELETON FOR *IF* CODE. 
*         (B7) = LWA+1
  
          SA2    IFREL1 
          ZR     X2,IFS17    IF NOT SPECIAL ONE BRANCH *IF* 
          SX5    X2          OPPOSITE LOGIC 
          AX2    18 
          SX4    X2 
 IFS17    BX7    X5 
          LX4    P.JPAD 
          SA1    TG.PRO 
          SA7    A2          OPPOSITE LOGIC MACRO ADDRESS 
          SA5    IFRESLT
          =X7    X1+1 
          BX6    X5 
          BX0    X7 
          SA7    A1          RESET GENERATED ST-NO CELL.
          LX0    P.PTAGM
          SA7    INIF        INDICATE DELAYED STORE *BSS* NEEDED
          IX7    X0+X7       BROADCAST TAG
          =A7    B7-1        OR.2OP = JUMP ADDRESS
          SX3    O.IF 
          =A6    A7-1        RESULTS OF *IF* EXPRESSION = OR.1OP
          IX7    X3+X4
          BX2    0           INDICATE NO LOCATION TAG.
          =A7    A6-1        (OR.OPR) = OPERATOR (CONTAINS DUMMY 1ST.)
          RJ     CSB         CHECK FOR SEQUENCE BREAK DUE TO OBJECT 
          EQ     IFS.X       RETURN TO MASTER LOOP. 
  
**        HERE IF OBJECT OF *IF* MUST BE A STATEMENT NUMBER.
*         ENTRY  (B4) _ 1ST STATEMENT NUMBER. 
*                SAVE STATEMENT NUMBERS IN IFSN AND RETURN TO MASTER
*                LOOP TO GET NEXT EXECUTABLE STATEMENT. 
* 
*                RETURN TO IFS50 AND SET-UP SKELETON MACRO FOR PROPER 
*                JUMP FOR *IF*. 
  
  
 IFS40    SA1    INIF 
          BX6    X1 
          SA6    IFNEST 
          =X6    CR.IFN 
          SB6    0
          SA6    REFVAR      INDICATE OBJECT OF IF REFERENCE. 
          SA1    B4          PRELOAD 1ST STATEMENT NUMBER.
          =B5    3           MAXIMUM NUMBER OF STATEMENT LABELS POSSIBLE
  
**        IDENTIFY STATEMENT LABELS.
  
 IFS42    =B4    B4+1 
          =B2    M.SNLAB+M.SNREF
          BX6    X1 
          RJ     ISN         IDENTIFY STATEMENT NUMBER. 
          AX6    P.TAG       WANT TAG ONLY
          SA1    B4 
          SA6    B6+IFSN     SAVE TAG.
          =B2    X1-O.COMMA 
          =B6    B6+1 
          ZR     X1,IFS45    IF *EOS* 
          NZ     B2,E.IF3    IF MISSING COMMA SEPARATOR 
          =B4    B4+1 
          SA1    B4          NEXT STATEMENT NUMBER. 
          ZR     X1,=XE.IF13 IF *EOS* 
          NE     B6,B5,IFS42 LOOP ON NEXT NUMBER. 
  
          =B4    B4-1 
          SA1    B4          TEST FOR CLEAN STATEMENT ENDING
          NZ     X1,E.IF3    IF NOT *EOS* 
**        GO OFF TO HANGER PROCESSING.
  
 IFS45    =X6    0
          SB7    B6-3 
          =A6    A6+1        INDICATE END OF TABLE
          MI     B7,IFS46    IF LESS THAN 3 LABELS
          SA1    IFMOD
          SB7    X1-M.LOG 
          NZ     B7,IFS47    IF NOT LOGICAL IF
          EQ     =XE.IF12    3 LABELS ON LOGICAL IF 
  
 IFS46    SX4    A6          SAVE *A6*
          ANSI   =XE.IF1
          SA6    X4          RESTORE *A6* 
          SA1    A6-2 
          EQ     B6,B1,=XE.IF10    IF ONLY ONE LABEL
          BX6    X1 
          =X7    0
          SA6    A6          SET 3RD = 1ST
          =A7    A6+1 
  
 IFS47    SA1    DTI
          SX7    IFS50       (X7) = RETURN ADDR FOR *HANGER*
          =X6    0
          SA1    =XFLOW 
          ZR     X1,IFS48    IF NOT DEAD CODE 
          SX7    0           ELSE NO HANGING PROCESS
 IFS48    SA7    HANGER      SET RETURN ADDRESS 
          SA1    DTI
          SA6    INIF        INDICATE TO *PSN* NO TAG NECESSARY 
          ZR     X1,PSN      IF NOT DO TERMINAL 
          FATAL  =XE.MDO     *ILLEGAL DO TERMINAL*
          EQ     PSN         RETURN FOR NEXT EXECUTABLE STATEMENT.
  
**        HERE WITH NEXT EXECUTABLE STATEMENT.
  
 IFS50    =X7    0
          SA1    IFSN+2      PRELOAD *3RD* STATMENT NUMBER
          SA7    HANGER 
          LX6    X1          SAME *3RD* NUMBER
          SA4    CSNTAG      NEXT EXECUTABLE STATEMENT TAG. 
          SB4    3+1
  
 IFS52    =B4    B4-1 
          IX0    X1-X4       COMPARE *IF* NUMBER TO UPCOMING NUMBER 
          =A1    A1-1        LOAD NEXT NUMBER 
          NZ     X0,IFS53    IF NOT MATCH 
          SA1    =XFLOW 
          ZR     X1,IFS60    IF NOT DEAD CODE 
          SA1    =XLDEAD     ELSE RESET PARSE-FILE
          SX6    6B          LENGTH 
          IX6    X1-X6
          SA6    =XTT=PAR 
 IFS53    NZ     B4,IFS52    IF NOT END OF TABLE
  
**        SET-UP JUMP FOR COMPILING CODE FOR IF-JUMP. 
  
 IFS60    SA1    IFSN        1ST
          SX5    B4          SET UPCOMING STATEMENT NUMBER FLAG 
          =A2    A1+1        2ND
          BX7    0
          IX3    X1-X6       1ST-3RD
          NZ     X3,IFS61    IF 1ST"3RD 
          SX7    X7+3 
 IFS61    BX0    X2-X6       2ND-3RD
          NZ     X0,IFS62    IF 2ND"3RD 
          SX7    X7+2 
 IFS62    IX0    X1-X2       1ST-2ND
          NZ     X0,IFS63    IF 1ST"2ND 
          =X7    X7+1 
  
**        HERE WITH 
*         (X7) = 0 = 1ST"2ND"3RD       (X5)  1 = 1ST = N
*                1 = 1ST=2ND                 2 = 2ND = N
*                2 = 2ND=3RD                 3 = 3RD = N
*                3 = 3RD=1ST                 0 = N NOT REFERENCED.
*                6 = 1ST=2ND=3RD
  
 IFS63    SA1    IFNEST 
          NZ     X1,IFS64    IF APPENDED TO LOGICAL IF
          SX6    1
          SA6    NOPATH 
 IFS64    SB3    X7-6 
          NZ     B3,IFS70    IF NO POSSIBLE NULL-TRANSFER.
          ZR     X5,IFS65    IF NOT NULL TRANSFER.
          WARN   E.IF5       DO NOTHING STATEMENT.
          EQ     CUS.RET     FINISH PROCESSING HANGER.
  
 IFS65    SX3    IFI111 
          SA1    IFNEST 
          NZ     X1,IFS90    IF APPENDED TO LOGICAL IF
          WARN   E.IF4
          EQ     IFS90       CONTINUE.
  
 IFS70    SA1    IFMOD
          SB6    STDIF
          SB7    X1-M.LOG 
          =B3    0
          NZ     B7,IFS71    IF NOT LOGICAL *IF*
          SB7    X5-3 
          SA1    IFREL1 
          MI     B7,IFS72    IF NOT DUMMY *3RD* NUMBER
          =X5    1
 IFS72    SA3    X5+LGIF     LOAD *LOGICAL* *IF* SKELETON ADDRESS 
          ZR     X1,IFS90    IF MORE THAN ONE RELATIONAL IN *IF*
          AX3    18          GET SHIFT COUNT
          SB7    X3 
          AX3    B7,X1
          EQ     IFS90       CONTINUE 
  
**        TABLE OF LOGICAL 2 BRANCH IF MACRO ADDRESSES
  
 LGIF     VFD    24/0,18/36,18/IFL12
          VFD    24/0,18/18,18/IFLN2
          VFD    24/0,18/00,18/IFL1N
  
 IFS71    ZR     X5,IFS80    IF NO REFERENCE TO UPDCOMING STATMENT NUM
          SB6    X5+STDIF+3 
          ZR     X7,IFS80    IF ONLY ONE REFERENCE AND NOT 2 ALIKE. 
          SB6    NSTDIF-4 
          =X7    X7+1 
          =B3    1
          SB2    X5-3 
          LX7    1           *2 
          PL     B2,IFS80    IF *N* IS *3RD* NUMBER IN *IF* 
          =B3    0
  
**        HERE WITH 
*         (B3) = OFFSET FOR STATEMENT NUMBER CONFIGURATION. 
*         (B6) = BASE TABLE TO USE. 
*         (X7) = SPECIAL OFFSET WHEN *N* IS ONE OF STATEMENT NUMBERS. 
  
 IFS80    SA2    IFMOD
          SB3    X7+B3       TABLE ADDRESS. 
          MX0    8
          SX6    X2-M.CPLX
          LX2    3           *8 
          SA1    B3+B6       LOAD JUMP TABLE WORD.
          SB2    X2 
          LX3    X1,B2
          BX2    X0*X3       EXTRACT RELATIVE SKELETON ADDRESS
          ZR     X6,IFS82    IF EXPRESSION IS COMPLEX MODE
          PL     X2,IFS85    IF NO ERROR
          FATAL  E.IF7       BRANCH IF NOT ALLOWED WITH LOGICAL RESULT
          EQ     CUS.RET     RETURN TO FINISH PROCESSING HANGER 
  
 IFS82    LX6    X2 
          SA6    IFSA 
          ANSI   E.IF8       ONLY REAL PART WILL BE USED
          SA2    IFSA 
 IFS85    LX2    8
          SA1    =XFLOW 
          SX3    X2+IFBASE
          NZ     X1,CUS.RET  IF NO PATH 
  
**        SET-UP PARSED FILE ENTRY. 
*         (X3) = *IF*S SKELETON ADDRESS.
*         (IFSN) = TAGS FOR JUMPS.
* 
*         GENERAL FORM OF A 3-BRANCH *IF* MACRO 
* 
*         OR.OPR = MACRO SKELETON ADDRESS 
*         OR.1OP = TEST OPERAND FOR JUMPS (EITHER INTERMEDIATE OR 
*                  SIMPLE OPERAND.) 
*         OR.2OP = L.PTAGU/3RD JUMP,L.PTAGM/2ND JUMP,L.PTAGL/1ST JUMP 
  
 IFS90    SX6    X3 
          SA1    TT.PAR 
          SA6    IFSA        SAVE *SKELETON* ADDRESS
          ALLOC  A1,L.TURP
          SA1    =XFLOW 
          ZR     X1,IFS92    IF NOT DEAD CODE 
          SA1    =XTT=PAR    ELSE RESET PARSE-FILE
          SX6    6B          LENGTH 
          IX6    X1-X6
          SA6    =XTT=PAR 
 IFS92    =X0    M.INTR 
          SA4    IFSA 
          SA5    IFRESLT
          SA2    IFSN+2      3RD NUMBER 
          LX4    P.JPAD      MACRO ADDRESS
          =X7    O.IF 
          SB2    B7-L.TURP
          BX7    X4+X7       ADD IN OPERATOR
          LX2    P.PTAGU
          SA7    B2          OPERATOR 
          =A3    A2-1        2ND NUMBER 
          BX6    X5 
          LX3    P.PTAGM
          =A1    A3-1        1ST NUMBER 
          IX7    X3+X2       3RD + 2ND
          =A6    A7+1        IF EXPRESSION RESULTS
          IX7    X7+X1       3RD + 2ND + 1ST
          =A7    A6+1 
          SA2    IFNEST 
          ZR     X2,CUS.RET  IF THIS ARITH IF NOT OBJ OF LOG IF 
          RJ     CSB         EMIT BSS TURPLE
          BX6    0
          SA6    IFNEST      SO ONLY ONE BSS TURPLE EMITTED 
          EQ     CUS.RET     RETURN TO FINISH PROCESSING HANGER 
  
 INIF     DATA   0           "0 WHEN PROCESSING A LOGICAL IF
 IFNEST   DATA   0           "0 IF NESTED IF
 IFMOD    DATA   0           RESULTANT MODE OF IF EXPRESSION
 IFRESLT  DATA   0           RESULTANT OPERAND FROM IF EXPRESSION 
 IFREL1   DATA   0           =0, MORE THAN ONE RELATIONAL IN *IF* 
 IFSN     DATA   0,0,0,0     IF STATEMENT NUMBER TAGS.
 IFSA     DATA   0           ENTRY CONDITION ON *B4*
          LIST   D
          END 
