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

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

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

revision 730, Fri Nov 10 14:04:49 2000 UTC revision 731, Fri Nov 10 22:57:45 2000 UTC
# Line 346  Line 346 
346       | I.FSTPS opnd => reloadReal(I.FSTPS, opnd, an)       | I.FSTPS opnd => reloadReal(I.FSTPS, opnd, an)
347       | I.FSTL opnd => reloadReal(I.FSTL, opnd, an)       | I.FSTL opnd => reloadReal(I.FSTL, opnd, an)
348       | I.FSTS opnd => reloadReal(I.FSTS, opnd, an)       | I.FSTS opnd => reloadReal(I.FSTS, opnd, an)
349         | I.FUCOM opnd => reloadReal(I.FUCOM, opnd, an)
350         | I.FUCOMP opnd => reloadReal(I.FUCOMP, opnd, an)
351       | I.FENV{fenvOp, opnd} => reloadReal(fn opnd =>       | I.FENV{fenvOp, opnd} => reloadReal(fn opnd =>
352                                   I.FENV{fenvOp=fenvOp,opnd=opnd}, opnd, an)                                   I.FENV{fenvOp=fenvOp,opnd=opnd}, opnd, an)
353       | I.FBINARY{binOp, src, dst} =>       | I.FBINARY{binOp, src, dst} =>
# Line 354  Line 356 
356       | I.FIBINARY{binOp, src} =>       | I.FIBINARY{binOp, src} =>
357          withTmpAvail          withTmpAvail
358            (fn tmpR => I.FIBINARY{binOp=binOp, src=operand(tmpR, src)}, an)            (fn tmpR => I.FIBINARY{binOp=binOp, src=operand(tmpR, src)}, an)
359    
360           (* Pseudo fp instrctions *)
361         | I.FMOVE{fsize,src,dst} =>
362            withTmpAvail
363              (fn tmpR => I.FMOVE{fsize=fsize, src=operand(tmpR, src),
364                                  dst=operand(tmpR, dst)}, an)
365         | I.FILOAD{isize,ea,dst} =>
366            withTmpAvail
367              (fn tmpR => I.FILOAD{isize=isize, ea=operand(tmpR, ea),
368                                   dst=operand(tmpR, dst)}, an)
369         | I.FBINOP{fsize,binOp,lsrc,rsrc,dst} =>
370            withTmpAvail(fn tmpR =>
371               I.FBINOP{fsize=fsize, binOp=binOp, lsrc=operand(tmpR, lsrc),
372                        rsrc=operand(tmpR, rsrc), dst=operand(tmpR, dst)}, an)
373         | I.FIBINOP{isize,binOp,lsrc,rsrc,dst} =>
374            withTmpAvail(fn tmpR =>
375               I.FIBINOP{isize=isize, binOp=binOp, lsrc=operand(tmpR, lsrc),
376                         rsrc=operand(tmpR, rsrc), dst=operand(tmpR, dst)}, an)
377         | I.FUNOP{fsize,unOp,src,dst} =>
378            withTmpAvail(fn tmpR =>
379               I.FUNOP{fsize=fsize, unOp=unOp, src=operand(tmpR, src),
380                       dst=operand(tmpR, dst)}, an)
381         | I.FCMP{fsize,lsrc,rsrc} =>
382            withTmpAvail(fn tmpR =>
383               I.FCMP{fsize=fsize,
384                      lsrc=operand(tmpR, lsrc), rsrc=operand(tmpR, rsrc)
385                     }, an)
386    
387       | I.ANNOTATION{i,a} => reloadIt(i, a::an)       | I.ANNOTATION{i,a} => reloadIt(i, a::an)
388       | _ => error "reload"       | _ => error "reload"
389    in reloadIt(instr, [])    in reloadIt(instr, [])
390    end (*reload*)    end (*reload*)
391    
392    fun fspill(instr, regmap, reg, spillLoc) =    fun fspill(instr, regmap, reg, spillLoc) =
393    let fun spillIt(instr, an) =    let fun withTmp(f, fsize, an) =
394          let val tmpR = C.newFreg()
395              val tmp  = I.FPR tmpR
396          in  {proh=[tmpR],
397               code=[mark(f tmp, an),
398                     I.FMOVE{fsize=fsize, src=tmp, dst=spillLoc}],
399               newReg=SOME tmpR (* XXX Should we propagate the definition? *)
400              }
401          end
402          fun spillIt(instr, an) =
403        (case instr of        (case instr of
404           I.FSTPL _ => {proh=[], code=[mark(I.FSTPL spillLoc, an)], newReg=NONE}           I.FSTPL _ => {proh=[], code=[mark(I.FSTPL spillLoc, an)], newReg=NONE}
405         | I.FSTPS _ => {proh=[], code=[mark(I.FSTPS spillLoc, an)], newReg=NONE}         | I.FSTPS _ => {proh=[], code=[mark(I.FSTPS spillLoc, an)], newReg=NONE}
# Line 371  Line 410 
410           {proh=[],           {proh=[],
411            code=[mark(I.CALL(opnd, C.rmvFreg(reg,defs), uses, mem), an)],            code=[mark(I.CALL(opnd, C.rmvFreg(reg,defs), uses, mem), an)],
412            newReg=NONE}            newReg=NONE}
413    
414           (* Pseudo fp instrctions *)
415           | I.FMOVE{fsize as I.FP64,src,dst} =>
416              if Props.eqOpn(src,spillLoc) then
417                {proh=[], code=[], newReg=NONE}
418              else
419                {proh=[],code=[mark(I.FMOVE{fsize=fsize,src=src,dst=spillLoc},an)],
420                 newReg=NONE} (* XXX bad for single precision *)
421           | I.FMOVE _ => error "non-double precision not yet supported"
422           | I.FILOAD{isize,ea,dst} =>
423                {proh=[],code=[mark(I.FILOAD{isize=isize,ea=ea,dst=spillLoc},an)],
424                 newReg=NONE} (* XXX bad for single precision *)
425           | I.FBINOP{fsize as I.FP64,binOp,lsrc,rsrc,dst} =>
426                {proh=[],code=[mark(I.FBINOP{fsize=fsize,binOp=binOp,
427                                             lsrc=lsrc, rsrc=rsrc,
428                                             dst=spillLoc},an)],
429                 newReg=NONE}
430           | I.FBINOP{fsize,binOp,lsrc,rsrc,dst} =>
431              withTmp(fn tmpR =>
432                      I.FBINOP{fsize=fsize, binOp=binOp,
433                               lsrc=lsrc, rsrc=rsrc, dst=tmpR},
434                      fsize, an)
435           | I.FIBINOP{isize,binOp,lsrc,rsrc,dst} =>
436              withTmp(fn tmpR =>
437                      I.FIBINOP{isize=isize, binOp=binOp,
438                                lsrc=lsrc, rsrc=rsrc, dst=tmpR},
439                      I.FP64, an) (* XXX *)
440           | I.FUNOP{fsize,unOp,src,dst} =>
441              {proh=[],code=[mark(I.FUNOP{fsize=fsize,unOp=unOp,
442                                          src=src,dst=spillLoc},an)],
443                            newReg=NONE}
444         | I.ANNOTATION{i,a} => spillIt(i, a::an)         | I.ANNOTATION{i,a} => spillIt(i, a::an)
445         | _ => error "fspill"         | _ => error "fspill"
446        (*esac*))        (*esac*))
# Line 378  Line 448 
448    end (* fspill *)    end (* fspill *)
449    
450    fun freload(instr, regmap, reg, spillLoc) =    fun freload(instr, regmap, reg, spillLoc) =
451    let fun reloadIt(instr, an) =    let fun rename(src as I.FDirect f) =
452              if regmap f = reg then spillLoc else src
453            | rename(src as I.FPR f) =
454              if regmap f = reg then spillLoc else src
455            | rename src = src
456    
457          fun withTmp(fsize, f, an) =
458              case spillLoc of
459                I.FDirect _ => {newReg=NONE, proh=[], code=[mark(f spillLoc, an)]}
460              | I.FPR _ => {newReg=NONE, proh=[], code=[mark(f spillLoc, an)]}
461              |  _ =>
462                let val ftmpR = C.newFreg()
463                    val ftmp  = I.FPR(ftmpR)
464                in  {newReg=NONE,
465                     proh=[ftmpR],
466                     code=[I.FMOVE{fsize=fsize, src=spillLoc, dst=ftmp},
467                           mark(f ftmp, an)
468                          ]
469                    }
470                end
471    
472          fun reloadIt(instr, an) =
473        (case instr of        (case instr of
474           I.FLDT opnd => {code=[mark(I.FLDT spillLoc, an)], proh=[], newReg=NONE}           I.FLDT opnd => {code=[mark(I.FLDT spillLoc, an)], proh=[], newReg=NONE}
475         | I.FLDL opnd => {code=[mark(I.FLDL spillLoc, an)], proh=[], newReg=NONE}         | I.FLDL opnd => {code=[mark(I.FLDL spillLoc, an)], proh=[], newReg=NONE}
476         | I.FLDS opnd => {code=[mark(I.FLDS spillLoc, an)], proh=[], newReg=NONE}         | I.FLDS opnd => {code=[mark(I.FLDS spillLoc, an)], proh=[], newReg=NONE}
477           | I.FUCOM opnd => {code=[mark(I.FUCOM spillLoc, an)],proh=[],newReg=NONE}
478           | I.FUCOMP opnd => {code=[mark(I.FUCOMP spillLoc, an)],proh=[],newReg=NONE}
479         | I.FBINARY{binOp, src=I.FDirect f, dst} =>         | I.FBINARY{binOp, src=I.FDirect f, dst} =>
480             if regmap f = reg then             if regmap f = reg then
481               {code=[mark(I.FBINARY{binOp=binOp, src=spillLoc, dst=dst}, an)],               {code=[mark(I.FBINARY{binOp=binOp, src=spillLoc, dst=dst}, an)],
482                proh=[],                proh=[],
483                newReg=NONE}                newReg=NONE}
484             else error "freload:FBINARY"             else error "freload:FBINARY"
485    
486           (* Pseudo fp instructions.
487            *)
488           | I.FMOVE{fsize as I.FP64,src,dst} =>
489              if Props.eqOpn(dst,spillLoc) then
490                {code=[], proh=[], newReg=NONE}
491              else
492                {code=[mark(I.FMOVE{fsize=fsize,src=spillLoc,dst=dst},an)],
493                       proh=[], newReg=NONE}
494           | I.FMOVE _ => error "non-double precision not yet supported"
495           | I.FBINOP{fsize,binOp,lsrc,rsrc,dst} =>
496              {code=[mark(I.FBINOP{fsize=fsize,binOp=binOp,
497                                   lsrc=rename lsrc, rsrc=rename rsrc,dst=dst},an)],
498                     proh=[], newReg=NONE}
499           | I.FIBINOP{isize,binOp,lsrc,rsrc,dst} =>
500              {code=[mark(I.FIBINOP{isize=isize,binOp=binOp,
501                                    lsrc=rename lsrc,rsrc=rename rsrc,dst=dst},an)],
502                     proh=[], newReg=NONE}
503           | I.FUNOP{fsize,unOp,src,dst} =>
504              {code=[mark(I.FUNOP{fsize=fsize,unOp=unOp,
505                                  src=rename src, dst=dst},an)],
506                     proh=[], newReg=NONE}
507           | I.FCMP{fsize,lsrc,rsrc} =>
508              (* Make sure that both the lsrc and rsrc cannot be in memory *)
509              (case (lsrc, rsrc) of
510                (I.FPR fs1, I.FPR fs2) =>
511                  (case (regmap fs1 = reg, regmap fs2 = reg) of
512                     (true, true) =>
513                     withTmp(fsize,
514                        fn tmp => I.FCMP{fsize=fsize,lsrc=tmp, rsrc=tmp}, an)
515                   | (true, false) =>
516                     {code=[mark(I.FCMP{fsize=fsize,lsrc=spillLoc,rsrc=rsrc},an)],
517                      proh=[], newReg=NONE}
518                   | (false, true) =>
519                     {code=[mark(I.FCMP{fsize=fsize,lsrc=lsrc,rsrc=spillLoc},an)],
520                      proh=[], newReg=NONE}
521                   | _ => error "fcmp.1"
522                  )
523               | (I.FPR _, _) =>
524                  withTmp(fsize,
525                     fn tmp => I.FCMP{fsize=fsize,lsrc=tmp, rsrc=rsrc}, an)
526               | (_, I.FPR _) =>
527                  withTmp(fsize,
528                     fn tmp => I.FCMP{fsize=fsize,lsrc=rsrc, rsrc=tmp}, an)
529               | _ => error "fcmp.2"
530              )
531         | I.CALL(opnd, defs, uses, mem) =>         | I.CALL(opnd, defs, uses, mem) =>
532           {proh=[],           {proh=[],
533            code=[mark(I.CALL(opnd, C.rmvFreg(reg,defs), uses, mem), an)],            code=[mark(I.CALL(opnd, C.rmvFreg(reg,defs), uses, mem), an)],

Legend:
Removed from v.730  
changed lines
  Added in v.731

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