'HEAD' COMPARISON CODE GENERATION C EDIT DATE 26JAN79 10:16 C SOURCE FILE CGENAJH.FS C AUTHOR A. J. HOWARD C CLUSTER 19 'OUTFILE' CGENAJH.FR N OVERLAY OLCGN SUBROUTINE CGEN C GENERATE CODE FOR COMPARISONS 'INCLUDE' ATESTAJH.IN, 'INCLUDE' CPAREAJH.IN, 'INCLUDE' NLISTCFTM.IN, 'INCLUDE' OPERSAJH.IN, 'INCLUDE' REGSJHP.IN, 'INCLUDE' RMCODES.IN, 'INCLUDE' STKDFA.IN, 'INCLUDE' STKDFB.IN, 'INCLUDE' STKDFE.IN, 'INCLUDE' WFLAGSJHP.IN, 'INCLUDE' GENCMA.IN, INTEGER NLOPS INTEGER STEP4 (6), STEP5 (48), STEP10 (12) INTEGER S4SAVE 'EJECT' DATA STEP4 / 1, 1, 0, 1, 1, -1/ DATA STEP5 / ^ 240, -1, ^ // SP = SP BEQ T 208, -1, ^ // SP # SP BNE T 208, -1, ^ // SP > SP BNE T 176, -1, ^ // SP >= SP BCS T 144, -1, ^ // SP < SP BCC T 240, -1, ^ // SP <= SP BEQ T 208, 0, ^ // DP = DP BNE F1 208, -1, ^ // DP # DP BNE T 0, 0, ^ // DP > DP NO CODE 0, 0, ^ // DP >= DP NO CODE 0, 0, ^ // DP < DP NO CODE 0, 0, ^ // DP <= DP NO CODE 240, -1, ^ // SP = 0 BEQ T 208, -1, ^ // SP # 0 BNE T 208, -1, ^ // SP > 0 BNE T -1, 0, ^ // SP >= 0 FAULT 39 -1, 0, ^ // SP < 0 FAULT 39 240, -1, ^ // SP <= 0 BEQ T 0, 0, ^ // DP = 0 NO CODE 0, 0, ^ // DP # 0 NO CODE 48, 0, ^ // DP > 0 BMI F1 16, -1, ^ // DP >= 0 BPL T 48, -1, ^ // DP < 0 BMI T 48, -1/ // DP <= 0 BMI T DATA STEP10 / ^ 240, 208, ^ // DP = DP BEQ DP # DP BNE 208, 16, ^ // DP > DP BNE DP >= DP BPL 48, 240, ^ // DP < DP BMI DP <= DP BEQ 240, 208, ^ // DP = 0 BEQ DP # 0 BNE 208, 0, ^ // DP > 0 BNE DP >= 0 --- 0, 240/ // DP < 0 --- DP <= 0 BEQ 'EJECT' C OP IS =, #, >, >=, <, <= BASE = OP - EQUAL + 1 C CHECK FOR COMPARE AGAINST 0 COMZER = .FALSE. IF (NAMEX (RIGHT) .EQ. NULLX ^ .AND. BIAS (RIGHT) .EQ. 0 ^ .AND. OPCODE (RIGHT) .EQ. LDAI) ^ COMZER = .TRUE. C SETUP ORDER OF COMPARE FOR DP COMPARE 'IF' (MODE (LEFT) .EQ. DPMODE) 'IF' (OP .LE. NEQUAL) C =, # CAN BE DONE IN EITHER ORDER 'IF' (STAREG .EQ. LEFT .AND. ACTHI .EQ. AREG) C THE AREG HAS THE HI BYTE THIS = HI OTHER = LOW 'ENDIF' 'ELSE' C >, >=, <, <= 'IF' (COMZER) C MUST BE DONE HI/LOW FOR A OP 0: IF (STAREG .EQ. LEFT .AND. ACTLO .EQ. AREG) ^ CALL GENMOV // SAVE LOW BYTE, LOAD HI BYTE THIS = HI OTHER = LOW 'ELSE' C MUST BE DONE LOW/HI FOR A OP B: 'IF' (STAREG .EQ. LEFT .AND. ACTHI .EQ. AREG) THIS = HI OTHER = LOW CALL GENMOV 'ENDIF' 'ENDIF' 'ENDIF' 'ENDIF' 'EJECT' C STEP 1, LOAD A WITH LEFT [THIS] 'IF' (STAREG .NE. LEFT) CALL REGSRC (4, NAMEX (LEFT), MODE (LEFT), ^ SUBX (LEFT), SUBXM (LEFT), ^ BIAS (LEFT), TS) IF (.NOT. COMZER .OR. TS .EQ. 0) ^ CALL GENLA 'ENDIF' C STEP 2, $SEC IF REQUIRED IF (OP .GE. GTR .AND. .NOT. COMZER) ^ CALL BLDBLK (SEC, WF4) C STEP 3, SET CONDITION CODE 'IF' (.NOT. COMZER) SIDE = RIGHT CALL GENDO IF (OP .GE. GTR) CALL REGMAN (CLRACV, AREG, 0) 'ENDIF' C STEP 4, TEST CONDITION CODE OR SAVE REGISTER S4SAVE = 0 'IF' (.NOT. COMZER .AND. STEP4 (BASE) .LE. 0) 'IF' (MODE (LEFT) .EQ. SPMODE) CALL GENJMP (STEP4 (BASE), BCC, WF5) 'ELSE' CALL REGMAN (CTFREE, S4SAVE, 1) S4SAVE = REGS (S4SAVE) CALL BLDOP (133, WF5, 0, S4SAVE, WF7) // STAZP 'ENDIF' 'ENDIF' C STEP 5, TEST CONDITION CODE TS = 2*BASE - 1 IF (MODE (LEFT) .EQ. DPMODE) TS = TS + 12 IF (COMZER) TS = TS + 24 'IF' (STEP5 (TS) .NE. 0) 'IF' (STEP5 (TS) .LT. 0) 'IF' (ATEST) ATEST = .FALSE. 'ELSE' IF (OP .EQ. GEQ) ILB = 1 // SUPPRESS JMP FALSE CALL FAULTP (39) 'ENDIF' TS = TS + 12 'ENDIF' CALL GENJMP (STEP5 (TS+1), STEP5 (TS), WF5) 'ENDIF' 'EJECT' C STEPS 6 - 10 ARE FOR DP ONLY 'IF' (MODE (LEFT) .EQ. DPMODE) C STEP 6, SETUP FOR NEXT LOAD/ORA SIDE = LEFT 'IF' (.NOT. COMZER .OR. (OP .NE. GEQ .AND. OP .NE. LESS)) 'IF' (COMZER) C ORA MUST BE FROM MEMORY TS = ACTREG (OTHER) 'IF' (TS .EQ. XREG) // GET XREG INTO MEMORY CALL REGMAN (CTFREE, TS, 1) CALL BLDOP (134, WF5, OTHER-1, REGS (TS), WF7) // STX 'ENDIF' 'IF' (TS .GT. YREG) CALL BLDOP ( 5, WF5, OTHER-1, REGS (TS), WF7) // ORA 'ELSE' RIGHT = LEFT BASE = AOROP - EQUAL + 1 CALL GENMOV 'ENDIF' 'ELSE' CALL GENMOV 'ENDIF' 'ENDIF' C STEPS 7 - 9 ONLY IF NOT TESTING 0 'IF' (.NOT. COMZER) C STEP 7, ADJUST CARRY NO LONGER REQUIRED C STEP 8, DO $CMP OR $SBC SIDE = RIGHT BASE = OP - EQUAL + 1 CALL GENDO C STEP 9, TEST CONDITION CODE IF (STEP4 (BASE) .LE. 0) ^ CALL GENJMP (STEP4 (BASE), 48, WF5) // BMI IF (S4SAVE .NE. 0) ^ CALL BLDOP (5, WF5, 0, S4SAVE, WF7) // ORAZP 'ENDIF' C STEP 10, TEST CONDITION CODE TS = OP - EQUAL + 1 IF (COMZER) TS = TS + 6 IF (STEP10 (TS) .NE. 0) ^ CALL GENJMP (-1, STEP10 (TS), WF5) 'ENDIF' C HAS THERE BEEN AN INTERMEDIATE BRANCH IF (INTBR .NE. 0) CALL DEFTL (INTBR) INTBR = 0 C BUILD A JUMP TO FALSE IF (ILB .EQ. 0) CALL GENJMP (1, JMP, WF8) RETURN END 'OUTFILE' GENJMPAJH.FR SUBROUTINE GENJMP (CSIDE, OPTS, WFTS) INTEGER CSIDE, OPTS, WFTS, TFSIDE 'INCLUDE' CODE1FTM.IN, 'INCLUDE' CPAREAJH.IN, 'INCLUDE' LOGOSAJH.IN, 'INCLUDE' WFLAGSJHP.IN, 'INCLUDE' GENCMA.IN, C 'INCLUDE' PRTCOMFTM.IN, //DEBUG ONLY C GENERATE A BRANCH/JUMP TO SIDE OF A CONDITIONAL C CSIDE = -1 TRUE C = 0 BRANCH TO JUMP C = 1 FALSE CALL BLDOP (OPTS, WFTS, 0, TLI, WF9) TFSIDE = CSIDE 'IF' (ILB .NE. 0 .AND. TFSIDE .EQ. 0) C CHANGE BRANCH TO JMP FALSE TO BRANCH FALSE TFSIDE = 1 'ENDIF' C START DEBUG CODE C CALL EST ('GENJMP', LBUF, 1, 6) C CALL ESP (TFSIDE , LBUF, 6, 12) C CALL ESP (TRUEF , LBUF, 12, 18) C CALL ESP (ILB , LBUF, 18, 24) C CALL SGLPRT C END DEBUG CODE 'IF' (CSIDE .EQ. 0) C INTERMEDIATE BRANCH INTBR = TLI 'ELSE' 'IF' (CLX .GE. 30) CALL FAULTP (7) 'ELSE' C SAVE LOCATION OF FIRST BRANCH IF (CNLEND (NESTX) .EQ. 0 .AND. WFTS .EQ. WF5) ^ CNLEND (NESTX) = LC CPLOC (CLX) = TLI*TRUEF*TFSIDE CALL REGLEV (4) CLX = CLX + 1 'ENDIF' 'ENDIF' TLI = TLI + 1 RETURN END