1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
(* hppaSpillInstr.sml
*
* COPYRIGHT (c) 2002 Bell Labs, Lucent Technologies
*
* Hppa instructions to emit when spilling an instruction.
*)
functor HppaSpillInstr(Instr : HPPAINSTR) : ARCH_SPILL_INSTR = struct
structure I = Instr
structure C = I.C
structure Rewrite = HppaRewrite(I)
structure CB=CellsBasis
fun error msg = MLRiscErrorMsg.error ("HppaSpillInstr", msg)
val tmpR = I.C.asmTmpR
fun storeToEA CB.GP (reg, I.Displace{base, disp, mem}) =
[I.store{st=I.STW, b=base, d=I.LabExp(disp, I.F), r=reg, mem=mem}]
| storeToEA CB.FP (reg, I.Displace{base, disp, mem}) =
[I.ldil{i=I.HILabExp(disp, I.F), t=tmpR},
I.ldo{i=I.LOLabExp(disp, I.F), b=tmpR, t=tmpR},
I.fstorex{fstx=I.FSTDX, b=base, x=tmpR, r=reg, mem=mem}]
| storeToEA _ _ = error "storeToEA"
fun loadFromEA CB.GP (reg, I.Displace{base, disp, mem}) =
[I.loadi{li=I.LDW, r=base, i=I.LabExp(disp,I.F), t=reg, mem=mem}]
| loadFromEA CB.FP (reg, I.Displace{base, disp, mem}) =
[I.ldil{i=I.HILabExp(disp, I.F), t=tmpR},
I.ldo{i=I.LOLabExp(disp, I.F), b=tmpR, t=tmpR},
I.floadx{flx=I.FLDDX, b=base, x=tmpR, t=reg, mem=mem}]
| loadFromEA _ _ = error "loadFromEA"
fun spillToEA ck reg_ea =
{code=storeToEA ck reg_ea, proh=[], newReg=NONE}
fun reloadFromEA ck reg_ea =
{code=loadFromEA ck reg_ea, proh=[], newReg=NONE}
(* spill a register to spillLoc *)
fun spillR (instr, reg, ea) = let
val newR = C.newReg()
val instr' = Rewrite.rewriteDef(instr, reg, newR)
in
{code=instr' :: storeToEA CB.GP (newR, ea),
proh=[newR],
newReg=SOME newR}
end
fun spillF (instr, reg, ea) = let
val newR = C.newFreg()
val instr' = Rewrite.frewriteDef(instr, reg, newR)
in
{code=instr' :: storeToEA CB.FP (newR, ea),
proh=[newR],
newReg=SOME newR}
end
(* reload a register from spillLoc *)
fun reloadR(instr, reg, ea) = let
val newR = C.newReg()
val instr' = Rewrite.rewriteUse(instr, reg, newR)
in
{code= loadFromEA CB.GP (newR, ea) @ [instr'],
proh=[newR],
newReg=SOME newR}
end
fun reloadF(instr, reg, ea) = let
val newR = C.newFreg()
val instr' = Rewrite.frewriteUse(instr, reg, newR)
in
{code=loadFromEA CB.FP (newR, ea) @ [instr'],
proh=[newR],
newReg=SOME newR}
end
fun spill CellsBasis.GP = spillR
| spill CellsBasis.FP = spillF
| spill _ = error "spill"
fun reload CellsBasis.GP = reloadR
| reload CellsBasis.FP = reloadF
| reload _ = error "reload"
end
|