Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] View of /sml/trunk/src/compiler/CodeGen/hppa/hppaMillicode.sml
ViewVC logotype

View of /sml/trunk/src/compiler/CodeGen/hppa/hppaMillicode.sml

Parent Directory Parent Directory | Revision Log Revision Log

Revision 744 - (download) (annotate)
Fri Dec 8 04:11:42 2000 UTC (19 years, 8 months ago) by leunga
File size: 1725 byte(s)

   A CVS update record!

   Changed type cell from int to datatype, and numerous other changes.
   Affect every client of MLRISC.  Lal says this can be bootstrapped on all
   machines.  See smlnj/HISTORY for details.

   Tag:  leunga-20001207-cell-monster-hack
functor HppaMillicode
  (structure MLTree : MLTREE
   structure Instr : HPPAINSTR
     sharing MLTree.Constant = Instr.Constant) : HPPA_MILLICODE =
  structure T = MLTree
  structure C = Instr.C
  structure I = Instr
  structure Region = I.Region

  val arg1 = C.GPReg 26
  val arg2 = C.GPReg 25
  val ra = C.GPReg 31				(* milli return address *)
  val rv = C.GPReg 29				(* milli return value *)
  val sp = C.stackptrR
  val stack = Region.stack

  val udivOffset = ~16
  val divOffset = ~20
  val mulOffset = ~24
  val muluOffset = ~112
  val cvti2dOffset = ~4
  fun copyTmp() = SOME(I.Direct(C.newReg()))

  fun doMilliCall offset {rs, rt, rd} = let
    fun addList([], cs) = cs
      | addList(r::rs, cs) = addList(rs, C.addReg(r,cs))
    val tmpR = C.newReg()
    val defs = addList([rv,ra], C.empty)
    val uses = C.addReg(arg1, C.addReg(arg2, C.empty))
    [I.COPY{dst=[arg1, arg2], src=[rs, rt], impl=ref NONE, tmp=copyTmp()},
     I.LOADI{li=I.LDW, r=C.stackptrR, i=I.IMMED offset, t=tmpR, mem=stack},
     I.BLE{t=C.GPReg 31, 
           b=tmpR, sr=5, d=I.IMMED 0, defs=defs, uses=uses, mem=stack},
     I.COPY{dst=[rd], src=[rv], impl=ref NONE, tmp=copyTmp()}]

  val divu = doMilliCall udivOffset
  val divo = doMilliCall divOffset
  val mulo = doMilliCall mulOffset
  val mulu = doMilliCall muluOffset

  fun cvti2real fcnv {rs,fd} =
  let val tmpF = C.newFreg()
  in  [I.STORE{st=I.STW, b=C.stackptrR, d=I.IMMED cvti2dOffset,r=rs, mem=stack},
       I.FLOAD{fl=I.FLDWS, b=C.stackptrR, d=cvti2dOffset, t=tmpF, mem=stack},
       I.FCNV{fcnv=fcnv, f=tmpF, t=fd}

  val cvti2s = cvti2real I.FCNVXF_S
  val cvti2d = cvti2real I.FCNVXF_D
  val cvti2q = cvti2real I.FCNVXF_Q


ViewVC Help
Powered by ViewVC 1.0.0