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 /MLRISC/trunk/amd64/ra/amd64SpillInstr.sml
ViewVC logotype

Diff of /MLRISC/trunk/amd64/ra/amd64SpillInstr.sml

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

revision 2928, Fri Jan 18 00:50:49 2008 UTC revision 2929, Fri Jan 18 20:40:28 2008 UTC
# Line 8  Line 8 
8        structure I : AMD64INSTR        structure I : AMD64INSTR
9        structure Props : AMD64INSN_PROPERTIES        structure Props : AMD64INSN_PROPERTIES
10            where I = I            where I = I
11    
12       (* guaranteeing that floats are stored at 16-byte aligned addresses reduces the number of instructions *)
13        val floats16ByteAligned : bool
14      ) : ARCH_SPILL_INSTR =      ) : ARCH_SPILL_INSTR =
15    struct    struct
16    
# Line 583  Line 586 
586                              mark (I.FMOVE {fmvOp=fmvOp, src=tmp, dst=dst}, an)],                              mark (I.FMOVE {fmvOp=fmvOp, src=tmp, dst=dst}, an)],
587                        proh=[tmpR], newReg=SOME tmpR}                        proh=[tmpR], newReg=SOME tmpR}
588                     end                     end
589                    (* treat bitwise operators differently, as they require that their source operand is 16-byte aligned *)
590                   | I.FBINOP {binOp=binOp as (I.XORPS | I.XORPD | I.ANDPS | I.ANDPD | I.ORPS | I.ORPD), src, dst} => if CB.sameColor (r, dst)                   | I.FBINOP {binOp=binOp as (I.XORPS | I.XORPD | I.ANDPS | I.ANDPD | I.ORPS | I.ORPD), src, dst} => if CB.sameColor (r, dst)
591                     then {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=I.FDirect dst},                     then {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=I.FDirect dst},
592                                 mark (I.FBINOP {binOp=binOp, src=src, dst=dst}, an)],                                 mark (I.FBINOP {binOp=binOp, src=src, dst=dst}, an)],
593                           proh=[], newReg=NONE}                           proh=[], newReg=NONE}
594                     else let                     else if floats16ByteAligned
595                        (* TODO: allow the source operand to be a memory location*)                          then let
596                        val tmpR = newFreg ()                        val tmpR = newFreg ()
597                        val tmp = I.FDirect tmpR                        val tmp = I.FDirect tmpR
598                        in                        in
# Line 597  Line 600 
600                                    mark (I.FBINOP {binOp=binOp, src=tmp, dst=dst}, an)],                                    mark (I.FBINOP {binOp=binOp, src=tmp, dst=dst}, an)],
601                              proh=[tmpR], newReg=SOME tmpR}                              proh=[tmpR], newReg=SOME tmpR}
602                        end                        end
603                       else {code=[mark (I.FBINOP {binOp=binOp, src=replace src, dst=dst}, an)], proh=[], newReg=NONE}
604                   | I.FBINOP {binOp, src, dst} => if CB.sameColor (r, dst)                   | I.FBINOP {binOp, src, dst} => if CB.sameColor (r, dst)
605                     then {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=I.FDirect dst},                     then {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=I.FDirect dst},
606                                 mark (I.FBINOP {binOp=binOp, src=src, dst=dst}, an)],                                 mark (I.FBINOP {binOp=binOp, src=src, dst=dst}, an)],
607                           proh=[], newReg=NONE}                           proh=[], newReg=NONE}
608                     else {code=[mark (I.FBINOP {binOp=binOp, src=replace src, dst=dst}, an)], proh=[], newReg=NONE}                     else {code=[mark (I.FBINOP {binOp=binOp, src=replace src, dst=dst}, an)], proh=[], newReg=NONE}
   
609                   | I.FCOM {comOp, src, dst} => let                   | I.FCOM {comOp, src, dst} => let
610                     val tmpR = newFreg ()                     val tmpR = newFreg ()
611                     val tmp = I.FDirect tmpR                     val tmp = I.FDirect tmpR
# Line 615  Line 617 
617                               mark (I.FCOM {comOp=comOp, src=src, dst=dst}, an)],                               mark (I.FCOM {comOp=comOp, src=src, dst=dst}, an)],
618                          proh=[tmpR], newReg=SOME tmpR}                          proh=[tmpR], newReg=SOME tmpR}
619                     end                     end
620                   | I.FSQRTS {dst, src} => let                   | I.FSQRTS {dst, src} => if floats16ByteAligned
621                       then let
622                     val tmpR = newFreg ()                     val tmpR = newFreg ()
623                     val tmp = I.FDirect tmpR                     val tmp = I.FDirect tmpR
624                     in                     in
# Line 623  Line 626 
626                               mark (I.FSQRTS {src=tmp, dst=dst}, an)],                               mark (I.FSQRTS {src=tmp, dst=dst}, an)],
627                        proh=[tmpR], newReg=SOME tmpR}                        proh=[tmpR], newReg=SOME tmpR}
628                     end                     end
629                   | I.FSQRTD {dst, src} => let                     else {code=[mark (I.FSQRTS {src=spillLoc, dst=dst}, an)], proh=[], newReg=NONE}
630                     | I.FSQRTD {dst, src} => if floats16ByteAligned
631                       then let
632                     val tmpR = newFreg ()                     val tmpR = newFreg ()
633                     val tmp = I.FDirect tmpR                     val tmp = I.FDirect tmpR
634                     in                     in
# Line 631  Line 636 
636                               mark (I.FSQRTD {src=tmp, dst=dst}, an)],                               mark (I.FSQRTD {src=tmp, dst=dst}, an)],
637                        proh=[tmpR], newReg=SOME tmpR}                        proh=[tmpR], newReg=SOME tmpR}
638                     end                     end
639                       else {code=[mark (I.FSQRTD {src=spillLoc, dst=dst}, an)], proh=[], newReg=NONE}
640                   | I.CALL {opnd, defs, uses, return, cutsTo, mem, pops} =>                   | I.CALL {opnd, defs, uses, return, cutsTo, mem, pops} =>
641                     {code=[mark (I.CALL {opnd=opnd, defs=C.rmvReg (r, defs),                     {code=[mark (I.CALL {opnd=opnd, defs=C.rmvReg (r, defs),
642                                          uses=uses, return=return, cutsTo=cutsTo,                                          uses=uses, return=return, cutsTo=cutsTo,

Legend:
Removed from v.2928  
changed lines
  Added in v.2929

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