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-3/compiler/CodeGen/amd64/amd64CpsRegs.sml
ViewVC logotype

Annotation of /sml/branches/primop-branch-3/compiler/CodeGen/amd64/amd64CpsRegs.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2066 - (view) (download)
Original Path: sml/trunk/src/compiler/CodeGen/amd64/amd64CpsRegs.sml

1 : mblume 2066 (* AMD64CpsRegs.sml --- CPS registers used on the Intel AMD64
2 :     *
3 :     * COPYRIGHT (c) 1997 Bell Laboratories.
4 :     *
5 :     *)
6 :     signature AMD64CPSREGS = sig
7 :     include CPSREGS
8 :     end
9 :    
10 :     structure AMD64CpsRegs : CPSREGS = struct
11 :     structure T = AMD64MLTree
12 :     structure C = AMD64Cells
13 :    
14 :     fun upto(from, to) = if from>to then [] else from::(upto (from+1,to))
15 :     infix upto
16 :    
17 :     val GP = C.GPReg
18 :     val FP = C.FPReg
19 :    
20 :     val rax = T.REG(32, C.rax) val rsp = T.REG(32, C.rsp)
21 :     val rcx = T.REG(32, C.rcx) val rbp = T.REG(32, C.rbp)
22 :     val rdx = T.REG(32, C.rdx) val rsi = T.REG(32, C.rsi)
23 :     val rbx = T.REG(32, C.rbx) val rdi = T.REG(32, C.rdi)
24 :    
25 :     val vfp = C.newDedicatedCell CellsBasis.GP ()
26 :     val vfptr = T.REG(64, vfp)
27 :    
28 :     fun frameptr which = if which then vfptr else rsp
29 :    
30 :     fun regInMem(which, i) = let
31 :     val fp = frameptr which
32 :     in T.LOAD(64, T.ADD(64, fp, T.LI(T.I.fromInt(32, i))), CPSRegions.memory)
33 :     end
34 :    
35 :     val allocptr = rdi
36 :     val stackptr = rsp
37 :     fun stdarg _ = rbp
38 :     fun stdcont _ = rsi
39 :    
40 :    
41 :     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 :    
48 :     fun stdlink _ = T.REG(64, GP 8)
49 :     fun stdclos _ = T.REG(64, GP 9)
50 :    
51 :     fun mkRegList(n, 0) = []
52 :     | mkRegList(n, cnt) = T.REG(64, GP n)::mkRegList(n+1, cnt-1)
53 :    
54 :     (* miscregs = {rbx,rcx,rdx,r10,r11,...r15} *)
55 :     val miscregs =
56 :     rbx::rcx::rdx::mkRegList(10, 16)
57 :    
58 :     val calleesave = Array.fromList miscregs
59 :     val exhausted = NONE
60 :    
61 :     val floatregs = map (fn f => T.FREG(64,FP f)) (8 upto 31)
62 :     val savedfpregs = []
63 :    
64 :     local
65 :     fun unREG (T.REG (_, r)) = r
66 :     | unREG _ = raise Fail "amd64CpsRegs:unREG"
67 :     in
68 :    
69 :     val availR = map GP (10 upto 15) @ (map unREG [rbp, rsi, rbx, rcx, rdx, rax])
70 :     val dedicatedR = GP 8 :: GP 9 :: (map unREG [rdi, rsp, vfptr])
71 :     val availF = map FP (8 upto 31)
72 :     val dedicatedF = [] (* map FP [0,1,2,3,4,5,6,7] *)
73 :     val signedGCTest = false
74 :     val addressWidth = 64
75 :    
76 :     val ccallCallerSaveR = [unREG rdi]
77 :     val ccallCallerSaveF = []
78 :     end (*local*)
79 :     end

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