.TITLE CC204 .IDENT /X01/ .NLIST BEX .ENABL LC ; ; C COMPILER ; SETHI ULLMAN (NON EIS) ; ; VERSION X01 ; ; DAVID G. CONROY 09-FEB-78 ; .GLOBL SETHI .GLOBL NPAIR .GLOBL FLIP .GLOBL OPDOPE ; ; TABLE USED TO REVERSE CONDITIONALS. ; FLIP: .WORD OP.EQ ;EQ .WORD OP.NE ;NE .WORD OP.GT ;LT .WORD OP.GE ;LE .WORD OP.LE ;GE .WORD OP.LT ;GT .WORD OP.GTU ;LTU .WORD OP.GEU ;LEU .WORD OP.LEU ;GEU .WORD OP.LTU ;GTU .PAGE ;+ ; ** SETHI - SETHI ULLMAN ALGORITHM ; ; THIS ROUTINE WALKS THROUGH A TREE, EVALUATING THE COST OF COMPUTING ; THE NODE (IN REGISTERS) AND SAVING THE RESULT IN THE HGPR FIELD OF ; THE NODE. FLOATING POINT COSTS ARE NOT SET UP BECAUSE ALL FLOATING ; POINT TREES HAVE A KIND OF ANY IN THE NON EIS COMPILER. ; ; THE ALGORITHM IS A CLASSICAL SETHI-ULLMAN WITH A FEW SPECIAL TESTS ; FOR ',', ':', AND OTHER 'NO EVALUATE' OPS. ; ; THIS ROUTINE ALSO SWOPS COMMUTATIVE OPERATORS WHEN IT IS DESIREABLE ; TO DO SO. ; ; INPUTS: ; R5=TREE ; ; OUTPUTS: ; R5=TREE (WITH COSTS ALL SET UP) ; ; USES: ; R0 ;- SETHI: MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) ; MOV R3,-(SP) ; MOV R4,-(SP) ; MOV R5,-(SP) ; MOV (R5),R4 ;OP MOV R4,R3 ;OPDOPE ASL R3 ; MOV OPDOPE(R3),R3 ; CLR E.HFPR(R5) ;ALL NODES USE AC0 CLR E.HGPR(R5) ;AND R0-R1 BIT #LEAF,R3 ;ALL DONE IF PROCESSING LEAF NODE BNE 28$ ; MOV E.LOP(R5),R1 ;DO THE LEFT SUBTREE MOV R1,R5 ; CALL SETHI ; MOV (SP),R5 ; ; ; UNARY OPERATIONS. ; TST E.ROP(R5) ;IS THERE A RIGHT OPERAND BNE 30$ ;BR IF YES, BINARY MOV E.HGPR(R1),E.HGPR(R5) ;SET GP REGS CMPB E.TYPE(R5),#TY.LNG ;IN CASE OF CONVERSIONS BNE 130$ ; CMPB E.TYPE(R1),#TY.LNG ; BEQ 130$ ; INC E.HGPR(R5) ;FIX GP COST 28$: BR 130$ ;CHAIN ; ; BINARY OPERATIONS. ; 30$: MOV E.ROP(R5),R2 ;DO RIGHT SUBTREE MOV R2,R5 ; CALL SETHI ; MOV (SP),R5 ; CMP E.HGPR(R1),E.HGPR(R2) ;SETHI-ULLMAN ON GENERAL REGS. BLO 80$ ; BHI 90$ ; MOV E.HGPR(R1),E.HGPR(R5) ;SAME USE N+1 CMP (R5),#OP.CMA ;NO +1 FOR ',', ':' AND SEQ BEQ 100$ ; CMP (R5),#OP.SEQ ; BEQ 100$ ; CMP (R5),#OP.CLN ; BEQ 100$ ; CMPB E.TYPE(R5),#TY.LNG ;OR IF A FLOATING POINT NODE BHI 120$ ;(A CONVERSION) INC E.HGPR(R5) ; BR 100$ ; 80$: MOV E.HGPR(R2),E.HGPR(R5) BR 100$ 90$: MOV E.HGPR(R1),E.HGPR(R5) ; ; FIX COSTS OF REGISTER PAIR NODES. ; 100$: CALL NPAIR ;IF 2 REGISTERS ARE NEEDED BCS 120$ ;NO INC E.HGPR(R5) ;FIX COST ; ; IF THE OPERATOR IS COMMUTATIVE SWAP IT TO INCREASE THE CHANCES ; OF HAVING A REGISTER TEMP. AVAILABLE. ; 120$: BIT #COMMUT,R3 ;IS THE OPERATIOM COMMUTATIVE? BEQ 130$ ;NO, DONE MOV R2,R5 ;CLASSIFY ROP MOV R1,R0 ;CLASSIFY ROP CALL CLASFY ; MOV R0,-(SP) ; MOV R1,R5 ;CLASSIFY LOP MOV R2,R0 ;CLASSIFY LOP CALL CLASFY ; CMP R0,(SP)+ ;LEFT :: RIGHT BHIS 130$ ;BR IF THE WAY IT SHOULD BE MOV (SP),R5 ;SWOP MOV R1,E.ROP(R5) ; MOV R2,E.LOP(R5) ; BIT #RELOP,R3 ;MAY ALSO HAVE TO ADJUST RELATION BEQ 130$ ; SUB #OP.EQ,R4 ; ASL R4 ; MOV FLIP(R4),(R5) ; 130$: MOV (SP)+,R5 ;RETURN MOV (SP)+,R4 ; MOV (SP)+,R3 ; MOV (SP)+,R2 ; MOV (SP)+,R1 ; RETURN ; ;+ ; ** NPAIR - REGISTER PAIR TEST ; ; THIS ROUTINE LOOKS FOR TREES THAT REQUIRE A PAIR OF REGISTERS. THIS ; DOES NOT IMPLY EVEN/ODD IN THE NON EIS COMPILER. ; ; ALL LONGS REQUIRE A PAIR. ; THE EXCLUSIVE OR OPERATION ON INTEGERS DOES. ; ; INPUTS: ; R5=TREE ; ; OUTPUTS: ; C=0 IF PAIR REQUIRED ;- NPAIR: MOV R0,-(SP) ;SAVE REGISTERS MOVB E.TYPE(R5),R0 ;GET TYPE CMP R0,#TY.LNG ;ALL LONGS NEED A PAIR BEQ 10$ ; BHI 20$ ;FLOATS NEVER DO MOV (R5),R0 ;TEST OPDOPE FOR 'NEED A PAIR' ASL R0 ; BIT #PAIR,OPDOPE(R0); BEQ 20$ ;PAIR NOT REQUIRED 10$: CLC ;NEED A PAIR BR 30$ ; 20$: SEC ;DON'T NEED A PAIR 30$: MOV (SP)+,R0 ; RETURN ; ;+ ; PASS 2 OPDOPE TABLE ; ; 000001 LEAF ; 000002 BINARY OP (RELIC, UNUSED) ; 000004 COMMUTATIVE OPERATOR ; 000010 RELATIONAL OPERATOR ; 000020 INT OPS REQUIRE REGISTER PAIR ; 000040 ODD REGISTER (NOT USED IN NON EIS COMPILER) ; 000100 MODIFY DELETES CONSTANT ZEROS ON LEFT ; 000200 MODIFY DELETES CONSTANT ZEROS ON RIGHT ; 000400 INT OP SETS CVNZ OK ; 001000 INT OP SETS NZ OK ;- LEAF == 000001 ;THE BITS BINOP == 000002 COMMUT == 000004 RELOP == 000010 PAIR == 000020 ODD == 000040 DZOL == 000100 DZOR == 000200 OKCC == 000400 OKNZ == 001000 OPDOPE: .WORD 000000 ;OP.EOF .WORD 000001 ;OP.CON .WORD 000001 ;OP.ID .WORD 000001 ;OP.LID .WORD 000001 ;OP.LCN (NOT SEEN) .WORD 000001 ;OP.DCN (NOT SEEN) .WORD 000001 ;OP.REG .WORD 000001 ;OP.INX .WORD 000001 ;OP.AUI .WORD 000001 ;OP.AUD .WORD 001706 ;OP.ADD .WORD 001602 ;OP.SUB .WORD 001446 ;OP.MUL .WORD 001002 ;OP.DIV .WORD 000002 ;OP.MOD .WORD 001202 ;OP.ASL .WORD 001202 ;OP.ASR .WORD 000006 ;OP.AND .WORD 001306 ;OP.OR .WORD 001326 ;OP.XOR .WORD 001602 ;OP.ADA .WORD 001602 ;OP.SBA .WORD 001442 ;OP.MUA .WORD 001002 ;OP.DVA .WORD 000002 ;OP.MOA .WORD 001202 ;OP.ALA .WORD 001202 ;OP.ARA .WORD 000002 ;OP.ANA .WORD 001202 ;OP.ORA .WORD 001202 ;OP.XRA .WORD 001416 ;OP.EQ .WORD 001416 ;OP.NE .WORD 001416 ;OP.LT .WORD 001416 ;OP.LE .WORD 001416 ;OP.GE .WORD 001416 ;OP.GT .WORD 001416 ;OP.LTU .WORD 001416 ;OP.LEU .WORD 001416 ;OP.GEU .WORD 001416 ;OP.GTU .WORD 000002 ;OP.AA .WORD 000002 ;OP.OO .WORD 001000 ;OP.INB .WORD 000000 ;OP.INA .WORD 001000 ;OP.DEB .WORD 000000 ;OP.DEA .WORD 001002 ;OP.ASG .WORD 001000 ;OP.ADR .WORD 001000 ;OP.IND .WORD 001400 ;OP.NEG .WORD 001000 ;OP.COM .WORD 000000 ;OP.NOT .WORD 000002 ;OP.QRY .WORD 000002 ;OP.CLN .WORD 000002 ;OP.CMA .WORD 000002 ;OP.SEQ .WORD 001302 ;OP.BIC .WORD 001202 ;OP.BCA .WORD 001006 ;OP.BIT .WORD 000002 ;OP.JSR .WORD 000002 ;OP.CVR .WORD 000002 ;OP.CVM .WORD 000002 ;OP.FSR .WORD 000002 ;OP.FSM .WORD 001000 ;OP.LOD .WORD 000001 ;OP.CST .WORD 000000 ;OP.NAC .WORD 000000 ;OP.SEM .WORD 000000 ;OP.DOT .WORD 000000 ;OP.ARO .WORD 000000 ;OP.LPA .WORD 000000 ;OP.RPA .WORD 000000 ;OP.LSQ .WORD 000000 ;OP.RSQ .WORD 000000 ;OP.LBR .WORD 000000 ;OP.RBR .WORD 000000 ;OP.114 .WORD 000000 ;OP.115 .WORD 000000 ;OP.INT .WORD 000000 ;OP.CHR .WORD 000000 ;OP.FLT .WORD 000000 ;OP.DBL .WORD 000000 ;OP.UNS .WORD 000000 ;OP.LNG .WORD 000000 ;OP.STR .WORD 000000 ;OP.AUT .WORD 000000 ;OP.STA .WORD 000000 ;OP.EXT .WORD 000000 ;OP.GOT .WORD 000000 ;OP.RET .WORD 000000 ;OP.IF .WORD 000000 ;OP.WHI .WORD 000000 ;OP.ELS .WORD 000000 ;OP.SWI .WORD 000000 ;OP.CAS .WORD 000000 ;OP.BRK .WORD 000000 ;OP.CTN .WORD 000000 ;OP.DO .WORD 000000 ;OP.DEF .WORD 000000 ;OP.FOR .WORD 000000 ;OP.TYP .END