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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
(*
* PPC specific backend
*)
structure PPCCG =
MachineGen
( structure MachSpec = PPCSpec
val abi_variant = NONE
structure T = PPCMLTree
structure CB = CellsBasis
structure ClientPseudoOps = PPCClientPseudoOps
structure PseudoOps = PPCPseudoOps
structure Ext = SMLNJMLTreeExt(* generic extension *)
structure CpsRegs = PPCCpsRegs
structure InsnProps = PPCProps
structure Asm = PPCAsmEmitter
structure Shuffle = PPCShuffle
structure CCalls =
PPCMacOSX_CCalls (structure T = PPCMLTree)
structure OmitFramePtr = struct
structure CFG=PPCCFG
structure I=PPCInstr
val vfp = PPCCpsRegs.vfp
(* no rewriting necessary, backend does not change sp *)
fun omitframeptr _ = ()
end
structure MLTreeComp=
PPC(structure PPCInstr = PPCInstr
structure PPCMLTree = PPCMLTree
structure PseudoInstrs=
PPCPseudoInstr(structure Instr=PPCInstr)
structure ExtensionComp = SMLNJMLTreeExtComp
(structure I = PPCInstr
structure T = PPCMLTree
structure CFG = PPCCFG
structure TS = PPCMLTreeStream
)
val bit64mode=false
val multCost=ref 6 (* an estimate *)
)
structure Jumps =
PPCJumps(structure Instr=PPCInstr
structure MLTreeEval=PPCMLTreeEval
structure Shuffle=PPCShuffle)
structure BackPatch =
BBSched2(structure CFG = PPCCFG
structure Jumps = Jumps
structure Props = PPCProps
structure Emitter = PPCMCEmitter)
structure RA =
RISC_RA
(structure I = PPCInstr
structure CFG = PPCCFG
structure CpsRegs = PPCCpsRegs
structure InsnProps = InsnProps
structure Rewrite = PPCRewrite(PPCInstr)
structure SpillInstr= PPCSpillInstr(PPCInstr)
structure Asm = PPCAsmEmitter
structure SpillHeur = ChaitinSpillHeur
structure Spill = RASpill(structure InsnProps = InsnProps
structure Asm = PPCAsmEmitter)
structure SpillTable = SpillTable(PPCSpec)
val architecture = PPCSpec.architecture
datatype spillOperandKind = SPILL_LOC | CONST_VAL
type spill_info = unit
fun beforeRA _ = SpillTable.spillInit()
val sp = I.C.stackptrR
val spill = CPSRegions.spill
fun pure _ = false
structure Int =
struct
val avail = PPCCpsRegs.availR
val dedicated = PPCCpsRegs.dedicatedR
fun mkDisp loc = T.LI(T.I.fromInt(32, SpillTable.getRegLoc loc))
fun spillLoc{info, an, cell, id} =
{opnd=I.Displace{base=sp, disp=mkDisp(RAGraph.FRAME id), mem=spill},
kind=SPILL_LOC}
val mode = RACore.NO_OPTIMIZATION
end
structure Float =
struct
val avail = PPCCpsRegs.availF
val dedicated = PPCCpsRegs.dedicatedF
fun mkDisp loc = T.LI(T.I.fromInt(32, SpillTable.getFregLoc loc))
fun spillLoc(S, an, loc) =
I.Displace{base=sp, disp=mkDisp(RAGraph.FRAME loc), mem=spill}
val mode = RACore.NO_OPTIMIZATION
end
)
)
|