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/ra/x86SpillInstr.sml
ViewVC logotype

Diff of /sml/trunk/src/MLRISC/x86/ra/x86SpillInstr.sml

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

revision 1155, Wed Mar 20 20:52:51 2002 UTC revision 1156, Thu Mar 21 22:01:11 2002 UTC
# Line 131  Line 131 
131                 }                 }
132              end              end
133          end          end
134          | I.SHIFT{shiftOp, count, src, dst} => error "go and implement SHIFT"
135          | I.CMOV{cond, src, dst} =>
136               (* note: dst must be a register *)
137             (case spillLoc of
138               I.Direct r =>
139                  {proh=[],
140                   newReg=NONE,
141                   code=[mark(I.CMOV{cond=cond,src=src,dst=r},an)]
142                  }
143             | _ =>
144              let val tmpR = newReg()
145                  val tmp  = I.Direct tmpR
146              in  {proh=[tmpR],
147                   newReg=SOME tmpR,
148                   code=[I.move{mvOp=I.MOVL, src=spillLoc, dst=tmp},
149                         mark(I.CMOV{cond=cond,src=src,dst=tmpR},an),
150                         I.move{mvOp=I.MOVL, src=tmp, dst=spillLoc}]
151                  }
152              end
153             )
154    
155        | I.CMPXCHG{lock,sz,src,dst} =>        | I.CMPXCHG{lock,sz,src,dst} =>
156             if immedOrReg src then             if immedOrReg src then
157                 {proh=[],                 {proh=[],
# Line 196  Line 217 
217    
218        fun done(instr, an) = {code=[mark(instr, an)], proh=[], newReg=NONE}        fun done(instr, an) = {code=[mark(instr, an)], proh=[], newReg=NONE}
219    
220          fun isReloading (I.Direct r) = CB.sameColor(r,reg)
221            | isReloading _ = false
222    
223        (* This version assumes that the value of tmpR is killed *)        (* This version assumes that the value of tmpR is killed *)
224        fun withTmp(f, an) =        fun withTmp(f, an) =
225            case spillLoc of            case spillLoc of
# Line 335  Line 359 
359         | I.BINARY{binOp, src, dst} =>         | I.BINARY{binOp, src, dst} =>
360            withTmp(fn tmpR => I.BINARY{binOp=binOp, src=operand(tmpR, src),            withTmp(fn tmpR => I.BINARY{binOp=binOp, src=operand(tmpR, src),
361                                                     dst=operand(tmpR, dst)}, an)                                                     dst=operand(tmpR, dst)}, an)
362           | I.CMOV{cond, src, dst} =>
363             if CB.sameColor(dst,reg) then
364                error "CMOV"
365             else
366                done(I.CMOV{cond=cond, src=spillLoc, dst=dst}, an)
367           | I.SHIFT{shiftOp, count, src, dst} => error "go and implement SHIFT"
368         | I.CMPXCHG{lock,sz,src,dst} =>         | I.CMPXCHG{lock,sz,src,dst} =>
369            withTmp(fn tmpR => I.CMPXCHG{lock=lock, sz=sz,            withTmp(fn tmpR => I.CMPXCHG{lock=lock, sz=sz,
370                                         src=operand(tmpR, src),                                         src=operand(tmpR, src),
# Line 370  Line 400 
400         | I.FSTS opnd => reloadReal(I.FSTS, opnd, an)         | I.FSTS opnd => reloadReal(I.FSTS, opnd, an)
401         | I.FUCOM opnd => reloadReal(I.FUCOM, opnd, an)         | I.FUCOM opnd => reloadReal(I.FUCOM, opnd, an)
402         | I.FUCOMP opnd => reloadReal(I.FUCOMP, opnd, an)         | I.FUCOMP opnd => reloadReal(I.FUCOMP, opnd, an)
403           | I.FCOMI opnd => reloadReal(I.FCOMI, opnd, an)
404           | I.FCOMIP opnd => reloadReal(I.FCOMIP, opnd, an)
405           | I.FUCOMI opnd => reloadReal(I.FUCOMI, opnd, an)
406           | I.FUCOMIP opnd => reloadReal(I.FUCOMIP, opnd, an)
407         | I.FENV{fenvOp, opnd} => reloadReal(fn opnd =>         | I.FENV{fenvOp, opnd} => reloadReal(fn opnd =>
408                                     I.FENV{fenvOp=fenvOp,opnd=opnd}, opnd, an)                                     I.FENV{fenvOp=fenvOp,opnd=opnd}, opnd, an)
409         | I.FBINARY{binOp, src, dst} =>         | I.FBINARY{binOp, src, dst} =>
# Line 400  Line 434 
434            withTmpAvail(fn tmpR =>            withTmpAvail(fn tmpR =>
435               I.FUNOP{fsize=fsize, unOp=unOp, src=operand(tmpR, src),               I.FUNOP{fsize=fsize, unOp=unOp, src=operand(tmpR, src),
436                       dst=operand(tmpR, dst)}, an)                       dst=operand(tmpR, dst)}, an)
437         | I.FCMP{fsize,lsrc,rsrc} =>         | I.FCMP{i,fsize,lsrc,rsrc} =>
438            withTmpAvail(fn tmpR =>            withTmpAvail(fn tmpR =>
439               I.FCMP{fsize=fsize,               I.FCMP{i=i,fsize=fsize,
440                      lsrc=operand(tmpR, lsrc), rsrc=operand(tmpR, rsrc)                      lsrc=operand(tmpR, lsrc), rsrc=operand(tmpR, rsrc)
441                     }, an)                     }, an)
442    
# Line 521  Line 555 
555           | I.FLDS opnd => {code=[mark(I.FLDS spillLoc, an)], proh=[], newReg=NONE}           | I.FLDS opnd => {code=[mark(I.FLDS spillLoc, an)], proh=[], newReg=NONE}
556           | I.FUCOM opnd => {code=[mark(I.FUCOM spillLoc, an)],proh=[],newReg=NONE}           | I.FUCOM opnd => {code=[mark(I.FUCOM spillLoc, an)],proh=[],newReg=NONE}
557           | I.FUCOMP opnd => {code=[mark(I.FUCOMP spillLoc, an)],proh=[],newReg=NONE}           | I.FUCOMP opnd => {code=[mark(I.FUCOMP spillLoc, an)],proh=[],newReg=NONE}
558             | I.FCOMI opnd => {code=[mark(I.FCOMI spillLoc, an)],proh=[],newReg=NONE}
559             | I.FCOMIP opnd => {code=[mark(I.FCOMIP spillLoc, an)],proh=[],newReg=NONE}
560             | I.FUCOMI opnd => {code=[mark(I.FUCOMI spillLoc, an)],proh=[],newReg=NONE}
561             | I.FUCOMIP opnd => {code=[mark(I.FUCOMIP spillLoc, an)],proh=[],newReg=NONE}
562           | I.FBINARY{binOp, src=I.FDirect f, dst} =>           | I.FBINARY{binOp, src=I.FDirect f, dst} =>
563               if CB.sameColor(f,reg) then               if CB.sameColor(f,reg) then
564                 {code=[mark(I.FBINARY{binOp=binOp, src=spillLoc, dst=dst}, an)],                 {code=[mark(I.FBINARY{binOp=binOp, src=spillLoc, dst=dst}, an)],
# Line 549  Line 587 
587              {code=[mark(I.FUNOP{fsize=fsize,unOp=unOp,              {code=[mark(I.FUNOP{fsize=fsize,unOp=unOp,
588                                  src=rename src, dst=dst},an)],                                  src=rename src, dst=dst},an)],
589                     proh=[], newReg=NONE}                     proh=[], newReg=NONE}
590           | I.FCMP{fsize,lsrc,rsrc} =>           | I.FCMP{i,fsize,lsrc,rsrc} =>
591              (* Make sure that both the lsrc and rsrc cannot be in memory *)              (* Make sure that both the lsrc and rsrc cannot be in memory *)
592              (case (lsrc, rsrc) of              (case (lsrc, rsrc) of
593                (I.FPR fs1, I.FPR fs2) =>                (I.FPR fs1, I.FPR fs2) =>
594                  (case (CB.sameColor(fs1,reg), CB.sameColor(fs2,reg)) of                  (case (CB.sameColor(fs1,reg), CB.sameColor(fs2,reg)) of
595                     (true, true) =>                     (true, true) =>
596                     withTmp(fsize,                     withTmp(fsize,
597                        fn tmp => I.FCMP{fsize=fsize,lsrc=tmp, rsrc=tmp}, an)                        fn tmp => I.FCMP{i=i,fsize=fsize,lsrc=tmp, rsrc=tmp}, an)
598                   | (true, false) =>                   | (true, false) =>
599                     {code=[mark(I.FCMP{fsize=fsize,lsrc=spillLoc,rsrc=rsrc},an)],                     {code=[mark(I.FCMP{i=i,fsize=fsize,lsrc=spillLoc,rsrc=rsrc},an)],
600                      proh=[], newReg=NONE}                      proh=[], newReg=NONE}
601                   | (false, true) =>                   | (false, true) =>
602                     {code=[mark(I.FCMP{fsize=fsize,lsrc=lsrc,rsrc=spillLoc},an)],                     {code=[mark(I.FCMP{i=i,fsize=fsize,lsrc=lsrc,rsrc=spillLoc},an)],
603                      proh=[], newReg=NONE}                      proh=[], newReg=NONE}
604                   | _ => error "fcmp.1"                   | _ => error "fcmp.1"
605                  )                  )
606               | (I.FPR _, _) =>               | (I.FPR _, _) =>
607                  withTmp(fsize,                  withTmp(fsize,
608                     fn tmp => I.FCMP{fsize=fsize,lsrc=tmp, rsrc=rsrc}, an)                     fn tmp => I.FCMP{i=i,fsize=fsize,lsrc=tmp, rsrc=rsrc}, an)
609               | (_, I.FPR _) =>               | (_, I.FPR _) =>
610                  withTmp(fsize,                  withTmp(fsize,
611                     fn tmp => I.FCMP{fsize=fsize,lsrc=rsrc, rsrc=tmp}, an)                     fn tmp => I.FCMP{i=i,fsize=fsize,lsrc=rsrc, rsrc=tmp}, an)
612               | _ => error "fcmp.2"               | _ => error "fcmp.2"
613              )              )
614           | I.CALL{opnd, defs, uses, return, cutsTo, mem, pops} =>           | I.CALL{opnd, defs, uses, return, cutsTo, mem, pops} =>

Legend:
Removed from v.1155  
changed lines
  Added in v.1156

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