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 796, Tue Mar 6 00:04:33 2001 UTC revision 797, Fri Mar 16 00:00:17 2001 UTC
# Line 39  Line 39 
39    
40  functor X86  functor X86
41    (structure X86Instr : X86INSTR    (structure X86Instr : X86INSTR
42       structure MLTreeUtils : MLTREE_UTILS
43         where T = X86Instr.T
44     structure ExtensionComp : MLTREE_EXTENSION_COMP     structure ExtensionComp : MLTREE_EXTENSION_COMP
45       where I = X86Instr       where I = X86Instr
46      datatype arch = Pentium | PentiumPro | PentiumII | PentiumIII      datatype arch = Pentium | PentiumPro | PentiumII | PentiumIII
# Line 103  Line 105 
105    
106    val ST0 = C.ST 0    val ST0 = C.ST 0
107    val ST7 = C.ST 7    val ST7 = C.ST 7
108      val one = T.I.int_1
109    
110      val opcodes8 = {INC=I.INCB,DEC=I.DECB,ADD=I.ADDB,SUB=I.SUBB,
111                      NOT=I.NOTB,NEG=I.NEGB,
112                      SHL=I.SHLB,SHR=I.SHRB,SAR=I.SARB,
113                      OR=I.ORB,AND=I.ANDB,XOR=I.XORB}
114      val opcodes16 = {INC=I.INCW,DEC=I.DECW,ADD=I.ADDW,SUB=I.SUBW,
115                       NOT=I.NOTW,NEG=I.NEGW,
116                       SHL=I.SHLW,SHR=I.SHRW,SAR=I.SARW,
117                       OR=I.ORW,AND=I.ANDW,XOR=I.XORW}
118      val opcodes32 = {INC=I.INCL,DEC=I.DECL,ADD=I.ADDL,SUB=I.SUBL,
119                       NOT=I.NOTL,NEG=I.NEGL,
120                       SHL=I.SHLL,SHR=I.SHRL,SAR=I.SARL,
121                       OR=I.ORL,AND=I.ANDL,XOR=I.XORL}
122    
123    (*    (*
124     * The code generator     * The code generator
# Line 1555  Line 1571 
1571            then doFexpr''(fty, e, fd, an)            then doFexpr''(fty, e, fd, an)
1572            else doFexpr'(fty, e, fd, an)            else doFexpr'(fty, e, fd, an)
1573    
1574          (*================================================================
1575           * Optimizations for x := x op y
1576           * Special optimizations:
1577           * Generate a binary operator, result must in memory.
1578           * The source must not be in memory
1579           *================================================================*)
1580          and binaryMem(binOp, src, dst, mem, an) =
1581              mark(I.BINARY{binOp=binOp, src=immedOrReg(operand src),
1582                            dst=address(dst,mem)}, an)
1583          and unaryMem(unOp, opnd, mem, an) =
1584              mark(I.UNARY{unOp=unOp, opnd=address(opnd,mem)}, an)
1585    
1586          and isOne(T.LI n) = n = one
1587            | isOne _ = false
1588    
1589          (*
1590           * Perform optimizations based on recognizing
1591           *    x := x op y    or
1592           *    x := y op x
1593           * first.
1594           *)
1595          and store(ty, ea, d, mem, an,
1596                    {INC,DEC,ADD,SUB,NOT,NEG,SHL,SHR,SAR,OR,AND,XOR},
1597                    doStore
1598                   ) =
1599              let fun default() = doStore(ea, d, mem, an)
1600                  fun binary1(t, t', unary, binary, ea', x) =
1601                      if t = ty andalso t' = ty then
1602                         if MLTreeUtils.eqRexp(ea, ea') then
1603                            if isOne x then unaryMem(unary, ea, mem, an)
1604                            else binaryMem(binary, x, ea, mem, an)
1605                          else default()
1606                      else default()
1607                  fun unary(t,unOp, ea') =
1608                      if t = ty andalso MLTreeUtils.eqRexp(ea, ea') then
1609                         unaryMem(unOp, ea, mem, an)
1610                      else default()
1611                  fun binary(t,t',binOp,ea',x) =
1612                      if t = ty andalso t' = ty andalso
1613                         MLTreeUtils.eqRexp(ea, ea') then
1614                          binaryMem(binOp, x, ea, mem, an)
1615                      else default()
1616    
1617                  fun binaryCom1(t,unOp,binOp,x,y) =
1618                  if t = ty then
1619                  let fun again() =
1620                        case y of
1621                          T.LOAD(ty',ea',_) =>
1622                            if ty' = ty andalso MLTreeUtils.eqRexp(ea, ea') then
1623                               if isOne x then unaryMem(unOp, ea, mem, an)
1624                               else binaryMem(binOp,x,ea,mem,an)
1625                            else default()
1626                        | _ => default()
1627                  in  case x of
1628                        T.LOAD(ty',ea',_) =>
1629                          if ty' = ty andalso MLTreeUtils.eqRexp(ea, ea') then
1630                             if isOne y then unaryMem(unOp, ea, mem, an)
1631                             else binaryMem(binOp,y,ea,mem,an)
1632                          else again()
1633                      | _ => again()
1634                  end
1635                  else default()
1636    
1637                  fun binaryCom(t,binOp,x,y) =
1638                  if t = ty then
1639                  let fun again() =
1640                        case y of
1641                          T.LOAD(ty',ea',_) =>
1642                            if ty' = ty andalso MLTreeUtils.eqRexp(ea, ea') then
1643                               binaryMem(binOp,x,ea,mem,an)
1644                            else default()
1645                        | _ => default()
1646                  in  case x of
1647                        T.LOAD(ty',ea',_) =>
1648                          if ty' = ty andalso MLTreeUtils.eqRexp(ea, ea') then
1649                             binaryMem(binOp,y,ea,mem,an)
1650                          else again()
1651                      | _ => again()
1652                  end
1653                  else default()
1654    
1655              in  case d of
1656                    T.ADD(t,x,y) => binaryCom1(t,INC,ADD,x,y)
1657                  | T.SUB(t,T.LOAD(t',ea',_),x) => binary1(t,t',DEC,SUB,ea',x)
1658                  | T.ORB(t,x,y) => binaryCom(t,OR,x,y)
1659                  | T.ANDB(t,x,y) => binaryCom(t,AND,x,y)
1660                  | T.XORB(t,x,y) => binaryCom(t,XOR,x,y)
1661                  | T.SLL(t,T.LOAD(t',ea',_),x) => binary(t,t',SHL,ea',x)
1662                  | T.SRL(t,T.LOAD(t',ea',_),x) => binary(t,t',SHR,ea',x)
1663                  | T.SRA(t,T.LOAD(t',ea',_),x) => binary(t,t',SAR,ea',x)
1664                  | T.NEG(t,T.LOAD(t',ea',_)) => unary(t,NEG,ea')
1665                  | T.NOTB(t,T.LOAD(t',ea',_)) => unary(t,NOT,ea')
1666                  | _ => default()
1667              end (* store *)
1668    
1669            (* generate code for a statement *)            (* generate code for a statement *)
1670        and stmt(T.MV(_, rd, e), an) = doExpr(e, rd, an)        and stmt(T.MV(_, rd, e), an) = doExpr(e, rd, an)
1671          | stmt(T.FMV(fty, fd, e), an) = doFexpr(fty, e, fd, an)          | stmt(T.FMV(fty, fd, e), an) = doFexpr(fty, e, fd, an)
# Line 1568  Line 1679 
1679                           cutTo), an) =                           cutTo), an) =
1680               call(funct,targets,defs,uses,region,cutTo,an)               call(funct,targets,defs,uses,region,cutTo,an)
1681          | stmt(T.RET _, an) = mark(I.RET NONE, an)          | stmt(T.RET _, an) = mark(I.RET NONE, an)
1682          | stmt(T.STORE(8, ea, d, mem), an) = store8(ea, d, mem, an)          | stmt(T.STORE(8, ea, d, mem), an)  =
1683          | stmt(T.STORE(16, ea, d, mem), an) = store16(ea, d, mem, an)               store(8, ea, d, mem, an, opcodes8, store8)
1684          | stmt(T.STORE(32, ea, d, mem), an) = store32(ea, d, mem, an)          | stmt(T.STORE(16, ea, d, mem), an) =
1685                 store(16, ea, d, mem, an, opcodes16, store16)
1686            | stmt(T.STORE(32, ea, d, mem), an) =
1687                 store(32, ea, d, mem, an, opcodes32, store32)
1688    
1689          | stmt(T.FSTORE(fty, ea, d, mem), an) = fstore(fty, ea, d, mem, an)          | stmt(T.FSTORE(fty, ea, d, mem), an) = fstore(fty, ea, d, mem, an)
1690          | stmt(T.BCC(cc, lab), an) = branch(cc, lab, an)          | stmt(T.BCC(cc, lab), an) = branch(cc, lab, an)
1691          | stmt(T.DEFINE l, _) = defineLabel l          | stmt(T.DEFINE l, _) = defineLabel l

Legend:
Removed from v.796  
changed lines
  Added in v.797

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