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

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

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

revision 601, Thu Apr 6 04:38:14 2000 UTC revision 606, Sun Apr 9 23:10:59 2000 UTC
# Line 455  Line 455 
455                fun divrem(signed, overflow, e1, e2, resultReg) =                fun divrem(signed, overflow, e1, e2, resultReg) =
456                let val (opnd1, opnd2) = (operand e1, operand e2)                let val (opnd1, opnd2) = (operand e1, operand e2)
457                    val _ = move(opnd1, eax)                    val _ = move(opnd1, eax)
458                    val oper = if signed then (emit(I.CDQ); I.IDIV)                    val oper = if signed then (emit(I.CDQ); I.IDIVL)
459                               else (zero edx; I.UDIV)                               else (zero edx; I.DIVL)
460                in  mark(I.MULTDIV{multDivOp=oper, src=regOrMem opnd2},an);                in  mark(I.MULTDIV{multDivOp=oper, src=regOrMem opnd2},an);
461                    move(resultReg, rdOpnd);                    move(resultReg, rdOpnd);
462                    if overflow then trap() else ()                    if overflow then trap() else ()
# Line 509  Line 509 
509                fun uMultiply(e1, e2) =                fun uMultiply(e1, e2) =
510                    (* note e2 can never be (I.Direct edx) *)                    (* note e2 can never be (I.Direct edx) *)
511                    (move(operand e1, eax);                    (move(operand e1, eax);
512                     mark(I.MULTDIV{multDivOp=I.UMUL,                     mark(I.MULTDIV{multDivOp=I.MULL,
513                                    src=regOrMem(operand e2)},an);                                    src=regOrMem(operand e2)},an);
514                     move(eax, rdOpnd)                     move(eax, rdOpnd)
515                    )                    )
# Line 673  Line 673 
673    
674                fun unknownExp exp = doExpr(Gen.compileRexp exp, rd, an)                fun unknownExp exp = doExpr(Gen.compileRexp exp, rd, an)
675    
676                      (* Add n to rd *)
677                  fun addN n =
678                  let val n = operand n
679                      val src = if isMemReg rd then immedOrReg n else n
680                  in  mark(I.BINARY{binOp=I.ADDL, src=src, dst=rdOpnd}, an) end
681    
682                    (* Generate addition *)                    (* Generate addition *)
683                fun addition(e1, e2) =                fun addition(e1, e2) =
684                      case e1 of
685                        T.REG(_,rs) => if rs = rd then addN e2 else addition1(e1,e2)
686                      | _ => addition1(e1,e2)
687                  and addition1(e1, e2) =
688                      case e2 of
689                        T.REG(_,rs) => if rs = rd then addN e1 else addition2(e1,e2)
690                      | _ => addition2(e1,e2)
691                  and addition2(e1,e2) =
692                  (dstMustBeReg(fn (dstR, _) =>                  (dstMustBeReg(fn (dstR, _) =>
693                      mark(I.LEA{r32=dstR, addr=address(exp, readonly)}, an))                      mark(I.LEA{r32=dstR, addr=address(exp, readonly)}, an))
694                  handle EA => binaryComm(I.ADDL, e1, e2))                  handle EA => binaryComm(I.ADDL, e1, e2))
695    
                   (* Add n to rd *)  
               fun addN n =  
               let val n = operand n  
                   val src = if isMemReg rd then immedOrReg n else n  
               in  mark(I.BINARY{binOp=I.ADDL, src=src, dst=rdOpnd}, an) end  
696    
697            in  case exp of            in  case exp of
698                 T.REG(_,rs) =>                 T.REG(_,rs) =>
# Line 709  Line 718 
718               | T.ADD(32, (T.LI 1|T.LI32 0w1), e) => unary(I.INCL, e)               | T.ADD(32, (T.LI 1|T.LI32 0w1), e) => unary(I.INCL, e)
719               | T.ADD(32, e, T.LI ~1) => unary(I.DECL, e)               | T.ADD(32, e, T.LI ~1) => unary(I.DECL, e)
720               | T.ADD(32, T.LI ~1, e) => unary(I.DECL, e)               | T.ADD(32, T.LI ~1, e) => unary(I.DECL, e)
              | T.ADD(32, e1 as T.REG(_, rs), e2) =>  
                   if rs = rd then addN e2 else addition(e1, e2)  
              | T.ADD(32, e1, e2 as T.REG(_,rs)) =>  
                   if rs = rd then addN e1 else addition(e1, e2)  
721               | T.ADD(32, e1, e2) => addition(e1, e2)               | T.ADD(32, e1, e2) => addition(e1, e2)
722    
723                 (* 32-bit subtraction *)                 (* 32-bit subtraction *)

Legend:
Removed from v.601  
changed lines
  Added in v.606

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