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

SCM Repository

[smlnj] Annotation of /sml/branches/primop-branch/src/compiler/CodeGen/x86/x86CpsRegs.sml
ViewVC logotype

Annotation of /sml/branches/primop-branch/src/compiler/CodeGen/x86/x86CpsRegs.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1372 - (view) (download)

1 : monnier 247 (* X86CpsRegs.sml --- CPS registers used on the Intel X86
2 :     *
3 :     * COPYRIGHT (c) 1997 Bell Laboratories.
4 :     *
5 :     *)
6 :     signature X86CPSREGS = sig
7 :     include CPSREGS
8 :     end
9 :    
10 :     structure X86CpsRegs : CPSREGS = struct
11 :     structure T = X86MLTree
12 : monnier 411 structure C = X86Cells
13 : monnier 247
14 :     fun upto(from, to) = if from>to then [] else from::(upto (from+1,to))
15 :     infix upto
16 :    
17 : monnier 411 val GP = C.GPReg
18 :     val FP = C.FPReg
19 : monnier 247
20 : monnier 411 val eax = T.REG(32, C.eax) val esp = T.REG(32, C.esp)
21 :     val ecx = T.REG(32, C.ecx) val ebp = T.REG(32, C.ebp)
22 :     val edx = T.REG(32, C.edx) val esi = T.REG(32, C.esi)
23 :     val ebx = T.REG(32, C.ebx) val edi = T.REG(32, C.edi)
24 : monnier 247
25 : george 889 val vfp = C.newDedicatedCell CellsBasis.GP ()
26 : george 823 val vfptr = T.REG(32, vfp)
27 : blume 840
28 :     fun frameptr which = if which then vfptr else esp
29 :    
30 : george 823 fun regInMem(which, i) = let
31 : blume 840 val fp = frameptr which
32 : george 823 in T.LOAD(32, T.ADD(32, fp, T.LI(T.I.fromInt(32, i))), CPSRegions.memory)
33 :     end
34 : monnier 411
35 : george 823 val allocptr = edi
36 :     val stackptr = esp
37 :     fun stdarg _ = ebp
38 :     fun stdcont _ = esi
39 : monnier 247
40 :    
41 : george 823 fun limitptr vfp = regInMem(vfp, 12)
42 :     fun baseptr vfp = regInMem(vfp, 4)
43 :     fun exnptr vfp = regInMem(vfp, 8)
44 :     fun gcLink vfp = regInMem(vfp, 16)
45 :     fun storeptr vfp = regInMem(vfp, 24)
46 :     fun varptr vfp = regInMem(vfp, 28)
47 : monnier 247
48 : george 823 fun stdlink _ = T.REG(32, GP 8) (* vreg 0 *)
49 :     fun stdclos _ = T.REG(32, GP 9) (* vreg 1 *)
50 :    
51 : monnier 247 fun mkVregList(n, 0) = []
52 : monnier 411 | mkVregList(n, cnt) = T.REG(32, GP n)::mkVregList(n+1, cnt-1)
53 : monnier 247
54 :     (* miscregs = {ebx,ecx,edx,r10,r11,...r31} *)
55 : george 555 val miscregs =
56 : george 546 ebx::ecx::edx::mkVregList(10, X86Runtime.numVregs - 2)
57 : monnier 247
58 : george 823 val calleesave = Array.fromList miscregs
59 :     val exhausted = NONE
60 : monnier 247
61 : george 823 val floatregs = map (fn f => T.FREG(64,FP f)) (8 upto 31)
62 : monnier 247 val savedfpregs = []
63 :    
64 : blume 840 local
65 :     fun unREG (T.REG (_, r)) = r
66 :     | unREG _ = raise Fail "x86CpsRegs:unREG"
67 :     in
68 :    
69 :     val availR = map unREG [ebp, esi, ebx, ecx, edx, eax]
70 :     val dedicatedR = map unREG [edi, esp, vfptr]
71 : leunga 744 val availF = map FP (8 upto 31)
72 : leunga 731 val dedicatedF = [] (* map FP [0,1,2,3,4,5,6,7] *)
73 : monnier 411 val signedGCTest = false
74 : monnier 429 val addressWidth = 32
75 : blume 840
76 :     val ccallCallerSaveR = [unREG edi]
77 :     val ccallCallerSaveF = []
78 :     end (*local*)
79 : monnier 247 end

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