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/sparc/mltree/sparc.sml
ViewVC logotype

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

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

revision 744, Fri Dec 8 04:11:42 2000 UTC revision 761, Sat Dec 23 05:37:37 2000 UTC
# Line 54  Line 54 
54    type instrStream = (I.instruction,C.cellset) T.stream    type instrStream = (I.instruction,C.cellset) T.stream
55    type mltreeStream = (T.stm,T.mlrisc list) T.stream    type mltreeStream = (T.stm,T.mlrisc list) T.stream
56    
57      val int_0 = T.I.int_0
58      fun toInt n = T.I.toInt(32, n)
59      fun LI i = T.LI(T.I.fromInt(32, i))
60      fun LT (n,m) = T.I.LT(32, n, m)
61      fun LE (n,m) = T.I.LE(32, n, m)
62    
63    val intTy = if V9 then 64 else 32    val intTy = if V9 then 64 else 32
64    structure Gen = MLTreeGen(structure T = T    structure Gen = MLTreeGen(structure T = T
65                              val intTy = intTy                              val intTy = intTy
# Line 169  Line 175 
175        val zeroR   = C.r0        val zeroR   = C.r0
176        val newReg  = C.newReg        val newReg  = C.newReg
177        val newFreg = C.newFreg        val newFreg = C.newFreg
178        fun immed13 n = ~4096 <= n andalso n < 4096        val int_m4096 = T.I.fromInt(32, ~4096)
179          val int_4096 =  T.I.fromInt(32, 4096)
180          fun immed13 n = LE(int_m4096, n) andalso LT(n, int_4096)
181        fun immed13w w = let val x = W.~>>(w,0w12)        fun immed13w w = let val x = W.~>>(w,0w12)
182                         in  x = 0w0 orelse (W.notb x) = 0w0 end                         in  x = 0w0 orelse (W.notb x) = 0w0 end
183        fun splitw w = {hi=W.toInt(W.>>(w,0w10)),lo=W.toInt(W.andb(w,0wx3ff))}        fun splitw w = {hi=W.toInt(W.>>(w,0w10)),lo=W.toInt(W.andb(w,0wx3ff))}
184        fun split n  = splitw(W.fromInt n)        fun split n  = splitw(T.I.toWord32(32, n))
185    
186    
187        val zeroOpn = I.REG zeroR (* zero value operand *)        val zeroOpn = I.REG zeroR (* zero value operand *)
# Line 251  Line 259 
259        fun fmoves(s,d,an) = fmoved(s,d,an) (* error "fmoves" for now!!! XXX *)        fun fmoves(s,d,an) = fmoved(s,d,an) (* error "fmoves" for now!!! XXX *)
260        fun fmoveq(s,d,an) = error "fmoveq"        fun fmoveq(s,d,an) = error "fmoveq"
261    
       (* load word constant *)  
       fun loadImmedw(w,d,cc,an) =  
       let val or = if cc <> REG then I.ORCC else I.OR  
       in  if immed13w w then  
              mark(I.ARITH{a=or,r=zeroR,i=I.IMMED(W.toIntX w),d=d},an)  
           else let val {hi,lo} = splitw w  
                in  if lo = 0 then  
                       (mark(I.SETHI{i=hi,d=d},an); genCmp0(cc,d))  
                    else let val t = newReg()  
                         in  emit(I.SETHI{i=hi,d=t});  
                             mark(I.ARITH{a=or,r=t,i=I.IMMED lo,d=d},an)  
                         end  
                end  
       end  
   
262        (* load immediate *)        (* load immediate *)
263        and loadImmed(n,d,cc,an) =        and loadImmed(n,d,cc,an) =
264        let val or = if cc <> REG then I.ORCC else I.OR        let val or = if cc <> REG then I.ORCC else I.OR
265        in  if immed13 n then mark(I.ARITH{a=or,r=zeroR,i=I.IMMED n,d=d},an)        in  if immed13 n then mark(I.ARITH{a=or,r=zeroR,i=I.IMMED(toInt n),d=d},an)
266            else let val {hi,lo} = split n            else let val {hi,lo} = split n
267                 in  if lo = 0 then                 in  if lo = 0 then
268                        (mark(I.SETHI{i=hi,d=d},an); genCmp0(cc,d))                        (mark(I.SETHI{i=hi,d=d},an); genCmp0(cc,d))
# Line 314  Line 307 
307                    | (r,i,_) => gen({r=reduceOpn r,i=i,d=d},reduceOpn)                    | (r,i,_) => gen({r=reduceOpn r,i=i,d=d},reduceOpn)
308                fun const(e,i) =                fun const(e,i) =
309                    let val r = expr e                    let val r = expr e
310                    in  genConst{r=r,i=i,d=d}                    in  genConst{r=r,i=toInt i,d=d}
311                        handle _ => gen({r=r,i=opn(T.LI i),d=d},reduceOpn)                        handle _ => gen({r=r,i=opn(T.LI i),d=d},reduceOpn)
312                   end                   end
               fun constw(e,i) = const(e,Word32.toInt i)  
                                 handle _ => nonconst(e,T.LI32 i)  
313                val instrs =                val instrs =
314                   case (comm,e1,e2) of                   case (comm,e1,e2) of
315                     (_,e1,T.LI i) => const(e1,i)                     (_,e1,T.LI i) => const(e1,i)
                  | (_,e1,T.LI32 i) => constw(e1,i)  
316                   | (COMMUTE,T.LI i,e2) => const(e2,i)                   | (COMMUTE,T.LI i,e2) => const(e2,i)
                  | (COMMUTE,T.LI32 i,e2) => constw(e2,i)  
317                   |  _ => nonconst(e1,e2)                   |  _ => nonconst(e1,e2)
318            in  app emit instrs;            in  app emit instrs;
319                genCmp0(cc,d)                genCmp0(cc,d)
# Line 341  Line 330 
330                   ]                   ]
331                fun const(e,i) =                fun const(e,i) =
332                    let val r = expr e                    let val r = expr e
333                    in  genConst{r=r,i=i,d=d}                    in  genConst{r=r,i=toInt i,d=d}
334                        handle _ => [mark'(I.ARITH{a=a,r=r,i=opn(T.LI i),d=d},an)]                        handle _ => [mark'(I.ARITH{a=a,r=r,i=opn(T.LI i),d=d},an)]
335                    end                    end
               fun constw(e,i) = const(e,Word32.toInt i)  
                                 handle _ => nonconst(e,T.LI32 i)  
336                val instrs =                val instrs =
337                   case (comm,e1,e2) of                   case (comm,e1,e2) of
338                     (_,e1,T.LI i) => const(e1,i)                     (_,e1,T.LI i) => const(e1,i)
                  | (_,e1,T.LI32 i) => constw(e1,i)  
339                   | (COMMUTE,T.LI i,e2) => const(e2,i)                   | (COMMUTE,T.LI i,e2) => const(e2,i)
                  | (COMMUTE,T.LI32 i,e2) => constw(e2,i)  
340                   |  _ => nonconst(e1,e2)                   |  _ => nonconst(e1,e2)
341            in  app emit instrs;            in  app emit instrs;
342                genCmp0(cc,d)                genCmp0(cc,d)
# Line 365  Line 350 
350        and divs64 x = Muls64.divide{mode=T.TO_ZERO,stm=doStmt} x        and divs64 x = Muls64.divide{mode=T.TO_ZERO,stm=doStmt} x
351        and divt64 x = Mult64.divide{mode=T.TO_ZERO,stm=doStmt} x        and divt64 x = Mult64.divide{mode=T.TO_ZERO,stm=doStmt} x
352    
       (*  
       and GOTO lab = T.JMP(T.LABEL(LE.LABEL lab),[],[])  
   
       and roundToZero{ty,r,i,d} =  
           let val L = Label.newLabel ""  
           in  doStmt(T.MV(ty,d,T.REG(ty,r)));  
               doStmt(T.IF(T.CMP(ty,T.GE,T.REG(ty,d),T.LI 0),GOTO L,T.SEQ []));  
               doStmt(T.MV(ty,d,T.ADD(ty,T.REG(ty,d),T.LI i)));  
               defineLabel L  
           end  
        *)  
   
353        (* emit an unary floating point op *)        (* emit an unary floating point op *)
354        and funary(a,e,d,an) = mark(I.FPop1{a=a,r=fexpr e,d=d},an)        and funary(a,e,d,an) = mark(I.FPop1{a=a,r=fexpr e,d=d},an)
355    
# Line 386  Line 359 
359    
360        (* convert an expression into an addressing mode *)        (* convert an expression into an addressing mode *)
361        and addr(T.ADD(_,e,T.LI n)) =        and addr(T.ADD(_,e,T.LI n)) =
362            if immed13 n then (expr e,I.IMMED n)            if immed13 n then (expr e,I.IMMED(toInt n))
363            else let val d = newReg()            else let val d = newReg()
364                 in  loadImmed(n,d,REG,[]); (d,opn e) end                 in  loadImmed(n,d,REG,[]); (d,opn e) end
365          | addr(T.ADD(_,e,T.CONST c)) = (expr e,I.LAB(LE.CONST c))          | addr(T.ADD(_,e,T.CONST c)) = (expr e,I.LAB(LE.CONST c))
# Line 395  Line 368 
368          | addr(T.ADD(_,T.CONST c,e)) = (expr e,I.LAB(LE.CONST c))          | addr(T.ADD(_,T.CONST c,e)) = (expr e,I.LAB(LE.CONST c))
369          | addr(T.ADD(_,T.LABEL l,e)) = (expr e,I.LAB l)          | addr(T.ADD(_,T.LABEL l,e)) = (expr e,I.LAB l)
370          | addr(T.ADD(_,e1,e2))       = (expr e1,I.REG(expr e2))          | addr(T.ADD(_,e1,e2))       = (expr e1,I.REG(expr e2))
371          | addr(T.SUB(ty,e,T.LI n))   = addr(T.ADD(ty,e,T.LI(~n)))          | addr(T.SUB(ty,e,T.LI n))   = addr(T.ADD(ty,e,T.LI(T.I.NEG(32,n))))
372          | addr(T.LABEL l)            = (zeroR,I.LAB l)          | addr(T.LABEL l)            = (zeroR,I.LAB l)
373          | addr a                     = (expr a,zeroOpn)          | addr a                     = (expr a,zeroOpn)
374    
# Line 452  Line 425 
425        and branch(T.CMP(ty,cond,a,b),lab,an) =        and branch(T.CMP(ty,cond,a,b),lab,an) =
426            let val (cond,a,b) =            let val (cond,a,b) =
427                    case a of                    case a of
428                      (T.LI _ | T.LI32 _ | T.CONST _ | T.LABEL _) =>                      (T.LI _ | T.CONST _ | T.LABEL _) =>
429                        (T.Basis.swapCond cond,b,a)                        (T.Basis.swapCond cond,b,a)
430                    | _ => (cond,a,b)                    | _ => (cond,a,b)
431            in  if V9 then            in  if V9 then
# Line 527  Line 500 
500        and doStmts ss = app doStmt ss        and doStmts ss = app doStmt ss
501    
502            (* convert an expression into a register *)            (* convert an expression into a register *)
503        and expr(T.REG(_,r)) = r        and expr e = let
504          | expr(T.LI 0)     = zeroR          fun comp() = let
505          | expr(T.LI32 0w0) = zeroR            val d = newReg()
506          | expr e           = let val d = newReg()          in doExpr(e, d, REG, []); d
507                               in  doExpr(e,d,REG,[]); d end          end
508          in case e
509             of T.REG(_,r) => r
510              | T.LI z => if T.I.isZero z then zeroR else comp()
511              | _ => comp()
512          end
513    
514            (* compute an integer expression and put the result in register d            (* compute an integer expression and put the result in register d
515             * If cc is set then set the condition code with the result.             * If cc is set then set the condition code with the result.
# Line 540  Line 518 
518            case e of            case e of
519              T.REG(_,r) => (move(r,d,an); genCmp0(cc,r))              T.REG(_,r) => (move(r,d,an); genCmp0(cc,r))
520            | T.LI n     => loadImmed(n,d,cc,an)            | T.LI n     => loadImmed(n,d,cc,an)
           | T.LI32 w   => loadImmedw(w,d,cc,an)  
521            | T.LABEL l  => loadLabel(l,d,cc,an)            | T.LABEL l  => loadLabel(l,d,cc,an)
522            | T.CONST c  => loadLabel(LE.CONST c,d,cc,an)            | T.CONST c  => loadLabel(LE.CONST c,d,cc,an)
523    
524                  (* generic 32/64 bit support *)                  (* generic 32/64 bit support *)
525            | T.ADD(_,a,b) => arith(I.ADD,I.ADDCC,a,b,d,cc,COMMUTE,[],an)            | T.ADD(_,a,b) => arith(I.ADD,I.ADDCC,a,b,d,cc,COMMUTE,[],an)
526            | T.SUB(_,a,T.LI 0) => doExpr(a,d,cc,an)            | T.SUB(_,a,b) => let
527            | T.SUB(_,a,T.LI32 0w0) => doExpr(a,d,cc,an)                fun default() = arith(I.SUB,I.SUBCC,a,b,d,cc,NOCOMMUTE,[],an)
528            | T.SUB(_,a,b) => arith(I.SUB,I.SUBCC,a,b,d,cc,NOCOMMUTE,[],an)              in
529                  case b
530                  of T.LI z =>
531                      if T.I.isZero(z) then doExpr(a,d,cc,an) else default()
532                   | _ => default()
533                  (*esac*)
534                end
535    
536            | T.ANDB(_,a,T.NOTB(_,b)) =>            | T.ANDB(_,a,T.NOTB(_,b)) =>
537                 arith(I.ANDN,I.ANDNCC,a,b,d,cc,NOCOMMUTE,[],an)                 arith(I.ANDN,I.ANDNCC,a,b,d,cc,NOCOMMUTE,[],an)
# Line 568  Line 551 
551            | T.ANDB(_,a,b) => arith(I.AND,I.ANDCC,a,b,d,cc,COMMUTE,[],an)            | T.ANDB(_,a,b) => arith(I.AND,I.ANDCC,a,b,d,cc,COMMUTE,[],an)
552            | T.ORB(_,a,b) => arith(I.OR,I.ORCC,a,b,d,cc,COMMUTE,[],an)            | T.ORB(_,a,b) => arith(I.OR,I.ORCC,a,b,d,cc,COMMUTE,[],an)
553            | T.XORB(_,a,b) => arith(I.XOR,I.XORCC,a,b,d,cc,COMMUTE,[],an)            | T.XORB(_,a,b) => arith(I.XOR,I.XORCC,a,b,d,cc,COMMUTE,[],an)
554            | T.NOTB(_,a) => arith(I.XNOR,I.XNORCC,a,T.LI 0,d,cc,COMMUTE,[],an)            | T.NOTB(_,a) => arith(I.XNOR,I.XNORCC,a,LI 0,d,cc,COMMUTE,[],an)
555    
556                 (* 32 bit support *)                 (* 32 bit support *)
557            | T.SRA(32,a,b) => shift(I.SRA,a,b,d,cc,an)            | T.SRA(32,a,b) => shift(I.SRA,a,b,d,cc,an)
# Line 712  Line 695 
695        and ccExpr e = let val d = newReg() in doCCexpr(e,d,[]); d end        and ccExpr e = let val d = newReg() in doCCexpr(e,d,[]); d end
696    
697            (* convert an expression into an operand *)            (* convert an expression into an operand *)
698        and opn(T.LI 0)        = zeroOpn        and opn(T.CONST c)     = I.LAB(LE.CONST c)
         | opn(T.LI32 0w0)    = zeroOpn  
         | opn(T.CONST c)     = I.LAB(LE.CONST c)  
699          | opn(T.LABEL l)     = I.LAB l          | opn(T.LABEL l)     = I.LAB l
700          | opn(e as T.LI n)   = if immed13 n then I.IMMED n else I.REG(expr e)          | opn(e as T.LI n)   =
701          | opn(e as T.LI32 n) =              if T.I.isZero(n) then zeroOpn
702               if immed13w n then I.IMMED(W.toIntX n) else I.REG(expr e)              else if immed13 n then I.IMMED(toInt n)
703                     else I.REG(expr e)
704          | opn e              = I.REG(expr e)          | opn e              = I.REG(expr e)
705    
706        and reducer() =        and reducer() =

Legend:
Removed from v.744  
changed lines
  Added in v.761

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