Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/trunk/src/MLRISC/ppc/mltree/ppc.sml
ViewVC logotype

Diff of /sml/trunk/src/MLRISC/ppc/mltree/ppc.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 499, Tue Dec 7 15:44:50 1999 UTC revision 545, Thu Feb 24 13:56:44 2000 UTC
# Line 10  Line 10 
10     structure PPCMLTree : MLTREE     structure PPCMLTree : MLTREE
11     structure PseudoInstrs : PPC_PSEUDO_INSTR     structure PseudoInstrs : PPC_PSEUDO_INSTR
12        sharing PPCMLTree.Region = PPCInstr.Region        sharing PPCMLTree.Region = PPCInstr.Region
13        sharing PPCMLTree.Constant = PPCInstr.Constant        sharing PPCMLTree.LabelExp = PPCInstr.LabelExp
14        sharing PseudoInstrs.I = PPCInstr        sharing PseudoInstrs.I = PPCInstr
15    
16     (*     (*
# Line 29  Line 29 
29    structure T   = PPCMLTree    structure T   = PPCMLTree
30    structure S   = T.Stream    structure S   = T.Stream
31    structure C   = PPCInstr.C    structure C   = PPCInstr.C
32    structure LE  = LabelExp    structure LE  = I.LabelExp
33    structure W32 = Word32    structure W32 = Word32
34    
35    fun error msg = MLRiscErrorMsg.error("PPC",msg)    fun error msg = MLRiscErrorMsg.error("PPC",msg)
36    
37      type instrStream = (I.instruction,C.regmap,C.cellset) T.stream
38      type ('s,'r,'f,'c) mltreeStream =
39         (('s,'r,'f,'c) T.stm,C.regmap,('s,'r,'f,'c) T.mlrisc list) T.stream
40      type ('s,'r,'f,'c) reducer =
41         (I.instruction,C.regmap,C.cellset,I.operand,I.addressing_mode,'s,'r,'f,'c)
42           T.reducer
43      type ('s,'r,'f,'c) extender =
44         (I.instruction,C.regmap,C.cellset,I.operand,I.addressing_mode,'s,'r,'f,'c)
45           T.extender
46    
47    structure Gen = MLTreeGen    structure Gen = MLTreeGen
48      (structure T = T      (structure T = T
49       val (intTy,naturalWidths) = if bit64mode then (64,[32,64]) else (32,[32])       val (intTy,naturalWidths) = if bit64mode then (64,[32,64]) else (32,[32])
# Line 95  Line 105 
105      (val signed = true)      (val signed = true)
106    
107    fun selectInstructions    fun selectInstructions
108          (T.EXTENDER{compileStm, compileRexp, compileFexp, compileCCexp, ...})
109        (S.STREAM{emit,comment,        (S.STREAM{emit,comment,
110                  defineLabel,entryLabel,pseudoOp,annotation,                  defineLabel,entryLabel,pseudoOp,annotation,
111                  beginCluster,endCluster,exitBlock,phi,alias,...}) =                  beginCluster,endCluster,exitBlock,phi,alias,...}) =
# Line 186  Line 197 
197            mark(I.ARITHI{oper=I.ADDI, rt=rt, ra=0, im=I.LabelOp lexp}, an)            mark(I.ARITHI{oper=I.ADDI, rt=rt, ra=0, im=I.LabelOp lexp}, an)
198    
199        fun loadConst(c, rt, an) =        fun loadConst(c, rt, an) =
200            mark(I.ARITHI{oper=I.ADDI, rt=rt, ra=0, im=I.ConstOp c}, an)            mark(I.ARITHI{oper=I.ADDI, rt=rt, ra=0, im=I.LabelOp(LE.CONST c)}, an)
201    
202        fun immedOpnd range (e1, e2 as T.LI i) =        fun immedOpnd range (e1, e2 as T.LI i) =
203             (expr e1, if range i then I.ImmedOp i else I.RegOp(expr e2))             (expr e1, if range i then I.ImmedOp i else I.RegOp(expr e2))
204          | immedOpnd _ (e1, T.CONST c) = (expr e1, I.ConstOp c)          | immedOpnd _ (e1, T.CONST c) = (expr e1, I.LabelOp(LE.CONST c))
205          | immedOpnd _ (e1, T.LABEL lexp) = (expr e1, I.LabelOp lexp)          | immedOpnd _ (e1, T.LABEL lexp) = (expr e1, I.LabelOp lexp)
206          | immedOpnd range (e1, e2 as T.LI32 w) =          | immedOpnd range (e1, e2 as T.LI32 w) =
207            let fun opnd2() = I.RegOp(expr e2)            let fun opnd2() = I.RegOp(expr e2)
# Line 236  Line 247 
247          | addr(size,T.ADD(_, e1, e2)) = (expr e1, I.RegOp (expr e2))          | addr(size,T.ADD(_, e1, e2)) = (expr e1, I.RegOp (expr e2))
248          | addr(size,e) = (expr e, I.ImmedOp 0)          | addr(size,e) = (expr e, I.ImmedOp 0)
249    
250           (* convert mlrisc to cellset: *)
251           and cellset mlrisc =
252               let val addCCReg = C.addCell C.CC
253                   fun g([],acc) = acc
254                     | g(T.GPR(T.REG(_,r))::regs,acc)  = g(regs,C.addReg(r,acc))
255                     | g(T.FPR(T.FREG(_,f))::regs,acc) = g(regs,C.addFreg(f,acc))
256                     | g(T.CCR(T.CC(_,cc))::regs,acc)  = g(regs,addCCReg(cc,acc))
257                     | g(T.CCR(T.FCC(_,cc))::regs,acc) = g(regs,addCCReg(cc,acc))
258                     | g(_::regs, acc) = g(regs, acc)
259               in  g(mlrisc, C.empty) end
260    
261        (*        (*
262         * Translate a statement, and annotate it         * Translate a statement, and annotate it
263         *)         *)
# Line 244  Line 266 
266          | stmt(T.CCMV(ccd, ccexp), an) = doCCexpr(ccexp, ccd, an)          | stmt(T.CCMV(ccd, ccexp), an) = doCCexpr(ccexp, ccd, an)
267          | stmt(T.COPY(_, dst, src), an) = copy(dst, src, an)          | stmt(T.COPY(_, dst, src), an) = copy(dst, src, an)
268          | stmt(T.FCOPY(_, dst, src), an) = fcopy(dst, src, an)          | stmt(T.FCOPY(_, dst, src), an) = fcopy(dst, src, an)
269          | stmt(T.JMP(T.LABEL lexp, labs),an) =          | stmt(T.JMP(ctrl, T.LABEL lexp, labs),an) =
270               mark(I.B{addr=I.LabelOp lexp, LK=false},an)               mark(I.B{addr=I.LabelOp lexp, LK=false},an)
271          | stmt(T.JMP(rexp, labs),an) =          | stmt(T.JMP(ctrl, rexp, labs),an) =
272            let val rs = expr(rexp)            let val rs = expr(rexp)
273            in  emit(MTLR(rs));            in  emit(MTLR(rs));
274                mark(I.BCLR{bo=I.ALWAYS,bf=CR0,bit=I.LT,LK=false,labels=labs},an)                mark(I.BCLR{bo=I.ALWAYS,bf=CR0,bit=I.LT,LK=false,labels=labs},an)
275            end            end
276          | stmt(T.CALL(rexp, defs, uses, mem), an) =          | stmt(T.CALL(rexp, flow, defs, uses, cdef, cuse, mem), an) =
277            let val addCCreg = C.addCell C.CC            let val defs=cellset(defs)
278                fun live([],acc) = acc                val uses=cellset(uses)
                 | live(T.GPR(T.REG(_,r))::regs,acc) = live(regs,C.addReg(r,acc))  
                 | live(T.CCR(T.CC cc)::regs,acc) = live(regs,addCCreg(cc,acc))  
                 | live(T.FPR(T.FREG(_,f))::regs,acc) = live(regs,C.addFreg(f,acc))  
                 | live(_::regs, acc) = live(regs, acc)  
               val defs=live(defs,C.empty)  
               val uses=live(uses,C.empty)  
279             in emit(MTLR(expr rexp));             in emit(MTLR(expr rexp));
280                mark(I.CALL{def=defs, use=uses, mem=mem}, an)                mark(I.CALL{def=defs, use=uses, mem=mem}, an)
281             end             end
282           | stmt(T.RET,an) = mark(RET,an)          | stmt(T.RET flow,an) = mark(RET,an)
283           | stmt(T.STORE(ty,ea,data,mem),an) = store(ty,ea,data,mem,an)           | stmt(T.STORE(ty,ea,data,mem),an) = store(ty,ea,data,mem,an)
284           | stmt(T.FSTORE(ty,ea,data,mem),an) = fstore(ty,ea,data,mem,an)           | stmt(T.FSTORE(ty,ea,data,mem),an) = fstore(ty,ea,data,mem,an)
285           | stmt(T.BCC(_, T.CMP(_, _, T.LI _, T.LI _), _),_) = error "BCC"          | stmt(T.BCC(ctrl, cc, lab),an) =
286           | stmt(T.BCC(cc, T.CMP(ty, _, T.ANDB(_, e1, e2), T.LI 0), lab),an) =                branch(cc,lab,an)
287            | stmt(T.DEFINE l, _) = defineLabel l
288            | stmt(T.ANNOTATION(s,a),an) = stmt(s,a::an)
289            | stmt(s, _) = doStmts(Gen.compileStm s)
290    
291          and branch(T.CMP(_, _, T.LI _, T.LI _), _, _) = error "branch"
292            | branch(T.CMP(ty, cc, T.ANDB(_, e1, e2), T.LI 0), lab, an) =
293             (case commImmedOpnd unsigned16 (e1, e2)             (case commImmedOpnd unsigned16 (e1, e2)
294               of (ra, I.RegOp rb) =>               of (ra, I.RegOp rb) =>
295                   emit(I.ARITH{oper=I.AND, ra=ra, rb=rb, rt=newReg(),                   emit(I.ARITH{oper=I.AND, ra=ra, rb=rb, rt=newReg(),
# Line 275  Line 297 
297                | (ra, opnd) =>                | (ra, opnd) =>
298                   emit(I.ARITHI{oper=I.ANDI_Rc, ra=ra, im=opnd, rt=newReg()})                   emit(I.ARITHI{oper=I.ANDI_Rc, ra=ra, im=opnd, rt=newReg()})
299              (*esac*);              (*esac*);
300               stmt(T.BCC(cc, T.CC CR0, lab),an))              branch(T.CC(cc, CR0), lab, an)
301           | stmt(T.BCC(cc, T.CMP(ty, _, e1 as T.LI _, e2), lab), an) =            )
302             let val cc' = T.Util.swapCond cc          | branch(T.CMP(ty, cc, e1 as T.LI _, e2), lab, an) =
303             in  stmt(T.BCC(cc', T.CMP(ty, cc', e2, e1), lab), an)            let val cc' = T.Basis.swapCond cc
304              in  branch(T.CMP(ty, cc', e2, e1), lab, an)
305             end             end
306           | stmt(T.BCC(_, cmp as T.CMP(ty, cond, _, _), lab), an) =          | branch(cmp as T.CMP(ty, cond, _, _), lab, an) =
307             let val ccreg = if true then CR0 else newCCreg() (* XXX *)             let val ccreg = if true then CR0 else newCCreg() (* XXX *)
308                 val (bo, cf) =                 val (bo, cf) =
309                   (case cond of                   (case cond of
# Line 299  Line 322 
322             in doCCexpr(cmp, ccreg, []);             in doCCexpr(cmp, ccreg, []);
323                emitBranch{bo=bo, bf=ccreg, bit=cf, addr=addr, LK=false}                emitBranch{bo=bo, bf=ccreg, bit=cf, addr=addr, LK=false}
324             end             end
325           | stmt(T.BCC(cc, T.CC cr, lab), an) =          | branch(T.CC(cc, cr), lab, an) =
326             let val addr=I.LabelOp(LE.LABEL lab)             let val addr=I.LabelOp(LE.LABEL lab)
327                 fun branch(bo, bit) =                 fun branch(bo, bit) =
328                    emitBranch{bo=bo, bf=cr, bit=bit, addr=addr, LK=false}                    emitBranch{bo=bo, bf=cr, bit=bit, addr=addr, LK=false}
# Line 311  Line 334 
334                 | (T.GE | T.GEU) => branch(I.FALSE, I.LT)                 | (T.GE | T.GEU) => branch(I.FALSE, I.LT)
335                 | (T.GT | T.GTU) => branch(I.TRUE, I.GT)                 | (T.GT | T.GTU) => branch(I.TRUE, I.GT)
336             end             end
337           | stmt(T.FBCC(_, cmp as T.FCMP(fty, cond, _, _), lab),an) =          | branch(cmp as T.FCMP(fty, cond, _, _), lab, an) =
338             let val ccreg = if true then CR0 else newCCreg() (* XXX *)             let val ccreg = if true then CR0 else newCCreg() (* XXX *)
339                 val labOp = I.LabelOp(LE.LABEL lab)                 val labOp = I.LabelOp(LE.LABEL lab)
340                 fun branch(bo, bf, bit) =                 fun branch(bo, bf, bit) =
# Line 341  Line 364 
364                 | T.?=  => test2bits(I.FU, I.FE)                 | T.?=  => test2bits(I.FU, I.FE)
365                (*esac*)                (*esac*)
366             end             end
367            | branch _ = error "branch"
368    
369           | stmt(T.ANNOTATION(s,a),an) = stmt(s,a::an)        and doStmt s = stmt(s,[])
          | stmt _ = error "stmt"  
370    
371        and doStmt(s) = stmt(s,[])        and doStmts ss = app doStmt ss
372    
373          (* Emit an integer store *)          (* Emit an integer store *)
374        and store(ty, ea, data, mem, an) =        and store(ty, ea, data, mem, an) =
# Line 445  Line 468 
468              )              )
469          | subtract(ty, T.LI i, e2, rt, an) = subfImmed(i, expr e2, rt, an)          | subtract(ty, T.LI i, e2, rt, an) = subfImmed(i, expr e2, rt, an)
470          | subtract(ty, T.CONST c, e2, rt, an) =          | subtract(ty, T.CONST c, e2, rt, an) =
471               mark(I.ARITHI{oper=I.SUBFIC,rt=rt,ra=expr e2,im=I.ConstOp c},an)               mark(I.ARITHI{oper=I.SUBFIC,rt=rt,ra=expr e2,
472                               im=I.LabelOp(LE.CONST c)},an)
473          | subtract(ty, T.LI32 w, e2, rt, an) =          | subtract(ty, T.LI32 w, e2, rt, an) =
474               subfImmed(Word32.toIntX w, expr e2, rt, an)               subfImmed(Word32.toIntX w, expr e2, rt, an)
475          | subtract(ty, e1, e2, rt, an) =          | subtract(ty, e1, e2, rt, an) =
# Line 478  Line 502 
502                   | _            => nonconst(e1,e2)                   | _            => nonconst(e1,e2)
503            in  app emit instrs end            in  app emit instrs end
504    
505        and divu32 x = Mulu32.divide{mode=T.TO_ZERO,roundToZero=roundToZero} x        and divu32 x = Mulu32.divide{mode=T.TO_ZERO,stm=doStmt} x
506    
507          and divt32 x = Mult32.divide{mode=T.TO_ZERO,stm=doStmt} x
508    
509        and divt32 x = Mult32.divide{mode=T.TO_ZERO,roundToZero=roundToZero} x        (*
510          and GOTO lab = T.JMP(T.LABEL(LE.LABEL lab), [], [])
511    
512        and roundToZero{ty,r,i,d} =        and roundToZero{ty,r,i,d} =
513        let val L = Label.newLabel ""        let val L = Label.newLabel ""
514            val dReg = T.REG(ty,d)            val dReg = T.REG(ty,d)
515        in  stmt(T.MV(ty,d,T.REG(ty,r)),[]);        in  doStmt(T.MV(ty,d,T.REG(ty,r)));
516            stmt(T.BCC(T.GE,T.CMP(ty,T.GE,dReg,T.LI 0),L),[]);            doStmt(T.IF(T.CMP(ty,T.GE,dReg,T.LI 0),GOTO L,T.SEQ []));
517            stmt(T.MV(ty,d,T.ADD(ty,dReg,T.LI i)),[]);            doStmt(T.MV(ty,d,T.ADD(ty,dReg,T.LI i)));
518            defineLabel L            defineLabel L
519        end        end
520           *)
521    
522            (* Generate optimized division code *)            (* Generate optimized division code *)
523        and divide(ty,oper,genDiv,e1,e2,rt,overflow,an) =        and divide(ty,oper,genDiv,e1,e2,rt,overflow,an) =
# Line 591  Line 619 
619    
620                (* Conditional expression *)                (* Conditional expression *)
621             | T.COND exp =>             | T.COND exp =>
622                Gen.compileCond{exp=exp,stm=stmt,defineLabel=defineLabel,                doStmts(Gen.compileCond{exp=exp,an=an,rd=rt})
                               annotations=an,rd=rt}  
623    
624                (* Misc *)                (* Misc *)
625             | T.SEQ(stm, e) => (stmt(stm,[]); doExpr(e, rt, an))             | T.LET(s,e) => (doStmt s; doExpr(e, rt, an))
626             | T.MARK(e, a) =>             | T.MARK(e, a) =>
627               (case #peek MLRiscAnnotations.MARK_REG a of               (case #peek MLRiscAnnotations.MARK_REG a of
628                 SOME f => (f rt; doExpr(e,rt,an))                 SOME f => (f rt; doExpr(e,rt,an))
629               | NONE => doExpr(e,rt,a::an)               | NONE => doExpr(e,rt,a::an)
630               )               )
631             | e => doExpr(Gen.compile e,rt,an)             | e => doExpr(Gen.compileRexp e,rt,an)
632    
633        (* Generate a floating point load *)        (* Generate a floating point load *)
634        and fload(ld32, ld64, ea, mem, ft, an) =        and fload(ld32, ld64, ea, mem, ft, an) =
# Line 676  Line 703 
703            | T.FSUB(64, e1, e2) => fbinary(I.FSUB, e1, e2, ft, an)            | T.FSUB(64, e1, e2) => fbinary(I.FSUB, e1, e2, ft, an)
704            | T.FMUL(64, e1, e2) => fbinary(I.FMUL, e1, e2, ft, an)            | T.FMUL(64, e1, e2) => fbinary(I.FMUL, e1, e2, ft, an)
705            | T.FDIV(64, e1, e2) => fbinary(I.FDIV, e1, e2, ft, an)            | T.FDIV(64, e1, e2) => fbinary(I.FDIV, e1, e2, ft, an)
706            | T.CVTI2F(64,_,_,e) =>            | T.CVTI2F(64,_,e) =>
707                 app emit (PseudoInstrs.cvti2d{reg=expr e,fd=ft})                 app emit (PseudoInstrs.cvti2d{reg=expr e,fd=ft})
708    
709              (* Single/double precision support *)              (* Single/double precision support *)
# Line 684  Line 711 
711            | T.FNEG((32|64), e) => funary(I.FNEG, e, ft, an)            | T.FNEG((32|64), e) => funary(I.FNEG, e, ft, an)
712    
713              (* Misc *)              (* Misc *)
           | T.FSEQ(stm, e) => (doStmt stm; doFexpr(e, ft, an))  
714            | T.FMARK(e, a) =>            | T.FMARK(e, a) =>
715              (case #peek MLRiscAnnotations.MARK_REG a of              (case #peek MLRiscAnnotations.MARK_REG a of
716                SOME f => (f ft; doFexpr(e,ft,an))                SOME f => (f ft; doFexpr(e,ft,an))
# Line 692  Line 718 
718              )              )
719            | _ => error "doFexpr"            | _ => error "doFexpr"
720    
721         and ccExpr(T.CC cc) = cc         and ccExpr(T.CC(_,cc)) = cc
722             | ccExpr(T.FCC(_,cc)) = cc
723           | ccExpr(ccexp) =           | ccExpr(ccexp) =
724             let val cc = newCCreg()             let val cc = newCCreg()
725             in  doCCexpr(ccexp,cc,[]); cc end             in  doCCexpr(ccexp,cc,[]); cc end
# Line 715  Line 742 
742                end                end
743            | T.FCMP(fty, fcc, e1, e2) =>            | T.FCMP(fty, fcc, e1, e2) =>
744               mark(I.FCOMPARE{cmp=I.FCMPU, bf=ccd, fa=fexpr e1, fb=fexpr e2},an)               mark(I.FCOMPARE{cmp=I.FCMPU, bf=ccd, fa=fexpr e1, fb=fexpr e2},an)
745            | T.CC cc => ccmove(cc,ccd,an)            | T.CC(_,cc) => ccmove(cc,ccd,an)
746            | T.CCMARK(cc,a) =>            | T.CCMARK(cc,a) =>
747              (case #peek MLRiscAnnotations.MARK_REG a of              (case #peek MLRiscAnnotations.MARK_REG a of
748                SOME f => (f ccd; doCCexpr(cc,ccd,an))                SOME f => (f ccd; doCCexpr(cc,ccd,an))
# Line 732  Line 759 
759                (defineLabel label; emitTrap(); trapLabel := NONE)                (defineLabel label; emitTrap(); trapLabel := NONE)
760              | NONE => ();              | NONE => ();
761             endCluster a)             endCluster a)
762    
763     in  S.STREAM     in  S.STREAM
764         { beginCluster = beginCluster,         { beginCluster = beginCluster,
765           endCluster   = endCluster,           endCluster   = endCluster,
# Line 741  Line 769 
769           entryLabel   = entryLabel,           entryLabel   = entryLabel,
770           comment      = comment,           comment      = comment,
771           annotation   = annotation,           annotation   = annotation,
772           exitBlock    = exitBlock,           exitBlock    = fn mlrisc => exitBlock(cellset mlrisc),
773           alias        = alias,           alias        = alias,
774           phi          = phi           phi          = phi
775         }         }

Legend:
Removed from v.499  
changed lines
  Added in v.545

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0