1 (* Copyright (C) 2009 Matthew Fluet.
2 * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
4 * Copyright (C) 1997-2000 NEC Research Institute.
6 * MLton is released under a BSD-style license.
7 * See the file MLton-LICENSE for details.
10 functor amd64MLtonBasic (S: AMD64_MLTON_BASIC_STRUCTS): AMD64_MLTON_BASIC =
19 structure CType = CType
20 structure Runtime = Runtime
24 * amd64.Size.t equivalents
26 val wordBytes = Bytes.toInt Bytes.inWord64
27 val wordSize = Size.fromBytes wordBytes
28 val wordScale = Scale.fromBytes wordBytes
29 val pointerBytes = Bytes.toInt Bytes.inWord64
30 val pointerSize = Size.fromBytes pointerBytes
38 fun new s = MemLoc.Class.new {name = s}
41 val Stack = new "Stack"
42 val Locals = new "Locals"
43 val Globals = new "Globals"
45 val Temp = MemLoc.Class.Temp
46 val StaticTemp = MemLoc.Class.StaticTemp
47 val CArg = MemLoc.Class.CArg
48 val CStack = MemLoc.Class.CStack
49 val Code = MemLoc.Class.Code
51 val CStatic = new "CStatic"
52 val StaticNonTemp = new "StaticNonTemp"
54 val GCState = new "GCState"
55 val GCStateHold = new "GCStateHold"
56 val GCStateVolatile = new "GCStateVolatile"
59 val allClasses = ref amd64.ClassSet.empty
60 val livenessClasses = ref amd64.ClassSet.empty
61 val holdClasses = ref amd64.ClassSet.empty
62 val volatileClasses = ref amd64.ClassSet.empty
63 val runtimeClasses = ref amd64.ClassSet.empty
64 val heapClasses = ref amd64.ClassSet.empty
65 val cargClasses = ref amd64.ClassSet.empty
66 val cstaticClasses = ref amd64.ClassSet.empty
71 amd64.ClassSet.fromList
89 val _ = livenessClasses :=
90 (if !Control.Native.liveStack
91 then amd64.ClassSet.fromList
98 else amd64.ClassSet.fromList
105 val _ = holdClasses :=
106 amd64.ClassSet.fromList
114 val _ = volatileClasses :=
115 amd64.ClassSet.fromList
120 val _ = runtimeClasses :=
121 amd64.ClassSet.fromList
131 val _ = heapClasses :=
132 amd64.ClassSet.fromList
137 val _ = cstaticClasses :=
138 amd64.ClassSet.fromList
142 val _ = cargClasses :=
143 amd64.ClassSet.fromList
152 val makeContents = amd64.MemLoc.makeContents
153 val c_stackP = Label.fromString "c_stackP"
155 = makeContents {base = Immediate.label c_stackP,
157 class = Classes.StaticNonTemp}
158 val c_stackPContentsOperand
159 = Operand.memloc c_stackPContents
160 val c_stackPDerefWord
161 = MemLoc.simple {base = c_stackPContents,
162 index = Immediate.zero,
165 class = Classes.CStack}
166 val c_stackPDerefWordOperand
167 = Operand.memloc c_stackPDerefWord
168 val c_stackPDerefDouble
169 = MemLoc.simple {base = c_stackPContents,
170 index = Immediate.zero,
173 class = Classes.CStack}
174 val c_stackPDerefDoubleOperand
175 = Operand.memloc c_stackPDerefDouble
176 val c_stackPDerefFloat
177 = MemLoc.simple {base = c_stackPContents,
178 index = Immediate.zero,
181 class = Classes.CStack}
182 val c_stackPDerefFloatOperand
183 = Operand.memloc c_stackPDerefFloat
185 val applyFFTempFun = Label.fromString "applyFFTempFun"
186 val applyFFTempFunContents
187 = makeContents {base = Immediate.label applyFFTempFun,
189 class = Classes.CStatic}
190 val applyFFTempFunContentsOperand
191 = Operand.memloc applyFFTempFunContents
192 val applyFFTempRegArg = Label.fromString "applyFFTempRegArg"
193 fun applyFFTempRegArgContents i
194 = MemLoc.imm {base = Immediate.label applyFFTempRegArg,
195 index = Immediate.int i,
198 class = Classes.CArg}
200 val applyFFTempXmmRegArgS = Label.fromString "applyFFTempXmmRegArgS"
201 fun applyFFTempXmmRegArgSContents i
202 = MemLoc.imm {base = Immediate.label applyFFTempXmmRegArgS,
203 index = Immediate.int i,
206 class = Classes.CArg}
207 val applyFFTempXmmRegArgD = Label.fromString "applyFFTempXmmRegArgD"
208 fun applyFFTempXmmRegArgDContents i
209 = MemLoc.imm {base = Immediate.label applyFFTempXmmRegArgD,
210 index = Immediate.int i,
213 class = Classes.CArg}
214 fun applyFFTempXmmRegArgContents (floatSize, i)
216 Size.DBLE => applyFFTempXmmRegArgDContents i
217 | Size.SNGL => applyFFTempXmmRegArgSContents i
218 | _ => Error.bug "amd64MLtonBasic.applyFFTempXmmRegArgContents"
220 val fpcvtTemp = Label.fromString "fpcvtTemp"
221 val fpcvtTempContents
222 = makeContents {base = Immediate.label fpcvtTemp,
224 class = Classes.StaticTemp}
225 val fpcvtTempContentsOperand
226 = Operand.memloc fpcvtTempContents
227 val fpeqTemp = Label.fromString "fpeqTemp"
228 fun fpeqTempContents size
229 = makeContents {base = Immediate.label fpeqTemp,
231 class = Classes.StaticTemp}
232 fun fpeqTempContentsOperand size
233 = Operand.memloc (fpeqTempContents size)
238 fun make name size = Label.fromString (concat [prefix, name, size])
241 datatype z = datatype CType.t
246 CPointer => Label.fromString (concat [prefix, "CPointer"])
251 | Objptr => Label.fromString (concat [prefix, "Objptr"])
260 val local_base = make "local"
261 val global_base = make "global"
264 val globalObjptrNonRoot_base = Label.fromString "globalObjptrNonRoot"
266 val gcState_label = Label.fromString "gcState"
268 structure Field = Runtime.GCField
269 fun make' (offset: int, size, class) =
272 Immediate.labelPlusInt
273 (gcState_label, offset)
275 makeContents {base = imm (),
278 fun operand () = Operand.memloc (contents ())
280 (imm, contents, operand)
282 fun make (f: Field.t, size, class) =
285 Immediate.labelPlusInt
286 (gcState_label, Bytes.toInt (Field.offset f))
288 makeContents {base = imm (),
291 fun operand () = Operand.memloc (contents ())
293 (imm, contents, operand)
296 val (_, gcState_exnStackContents,
297 gcState_exnStackContentsOperand) =
298 make (Field.ExnStack, wordSize, Classes.GCState)
300 val (_, gcState_frontierContents,
301 gcState_frontierContentsOperand) =
302 make (Field.Frontier, pointerSize, Classes.GCStateHold)
304 val (_, gcState_stackBottomContents,
305 gcState_stackBottomContentsOperand) =
306 make (Field.StackBottom, pointerSize, Classes.GCState)
308 val (_, gcState_stackTopContents,
309 gcState_stackTopContentsOperand) =
310 make (Field.StackTop, pointerSize, Classes.GCStateHold)
314 Immediate.label (Label.fromString "stackTopTemp")
315 val stackTopTempContents =
316 makeContents {base = stackTopTemp,
318 class = Classes.StaticTemp}
319 val stackTopTempContentsOperand =
320 Operand.memloc (stackTopTempContents)
322 val stackTopTempContents = fn () => stackTopTempContents
323 val stackTopTempContentsOperand = fn () => stackTopTempContentsOperand
326 fun gcState_stackTopMinusWordDeref () =
327 MemLoc.simple {base = gcState_stackTopContents (),
328 index = Immediate.int ~1,
331 class = Classes.Stack}
332 fun gcState_stackTopMinusWordDerefOperand () =
333 Operand.memloc (gcState_stackTopMinusWordDeref ())
335 fun stackTopTempMinusWordDeref () =
336 MemLoc.simple {base = stackTopTempContents (),
337 index = Immediate.int ~1,
340 class = Classes.Stack}
341 fun stackTopTempMinusWordDerefOperand () =
342 Operand.memloc (stackTopTempMinusWordDeref ())
344 fun gcState_offset {offset, ty} =
347 make' (offset, Vector.sub(amd64.Size.fromCType ty, 0), Classes.GCState)
354 val _ = Classes.initClasses ()