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/trunk/src/MLRISC/sparc/sparcCells.sml
ViewVC logotype

Annotation of /sml/trunk/src/MLRISC/sparc/sparcCells.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 168 - (view) (download)

1 : monnier 129 (* sparcCells.sml
2 :     *
3 :     * COPYRIGHT (c) 1996 Bell Laboratories.
4 :     *
5 :     *)
6 :     structure SparcCells : SPARCCELLS = struct
7 :     structure SL = SortedList
8 :    
9 : monnier 167 type register = int
10 :     type regmap = register Intmap.intmap
11 : monnier 129 datatype cellclass = GP | FP | CC | Y | PSR | FSR | MEM | CTRL
12 :    
13 :     exception Cells
14 :    
15 :     val stackptrR = 14
16 :     val asmTmpR = 10 (* %o2 *)
17 :     val fasmTmp = 30
18 :     val y = 64
19 :     val psr = 65
20 :     val fsr = 66
21 :     val linkReg = 15
22 :    
23 :     val firstPseudo = 256
24 :    
25 :     val counter = ref firstPseudo
26 :     val regCnt = ref 0
27 :     val fregCnt = ref 0
28 :     fun bump (r as ref c) = (r := c+1; c)
29 :     fun downto0 0 = [0]
30 :     | downto0 n = n::downto0(n-1)
31 :     val physicalRegs = downto0 31
32 :    
33 :     fun newReg () = (bump regCnt; bump counter)
34 :     fun newFreg() = (bump fregCnt; bump counter)
35 :     fun newCCreg () = (bump regCnt; bump counter)
36 :    
37 :     fun resetRegs() = let
38 :     val regmap = Intmap.new(64, Cells)
39 :     val enter = Intmap.add regmap
40 :     in
41 :     counter:=firstPseudo;
42 :     regCnt :=0;
43 :     fregCnt:=0;
44 :     app (fn r => enter(r,r)) physicalRegs;
45 :     regmap
46 :     end
47 :    
48 :     fun newCell GP = newReg
49 :     | newCell FP = newFreg
50 :     | newCell CC = newReg
51 :     | newCell _ = (fn () => bump counter)
52 :    
53 :     fun maxCell () = !counter
54 :    
55 :     fun numCell GP = (fn () => !regCnt)
56 :     | numCell FP = (fn () => !fregCnt)
57 :     | numCell _ = raise Cells
58 :    
59 :     fun cellToString(r,GP) =
60 :     if r < 8 then "%g"^Int.toString r
61 :     else if r = 14 then "%sp"
62 :     else if r < 16 then "%o"^Int.toString(r-8)
63 :     else if r < 24 then "%l"^Int.toString(r-16)
64 :     else if r = 30 then "%fp"
65 :     else if r < 32 then "%i"^Int.toString(r-24)
66 :     else "%r"^Int.toString r
67 :     | cellToString(r,class) = prefix class^Int.toString r
68 : monnier 167 and prefix GP = "%r"
69 :     | prefix FP = "%f"
70 : monnier 129 | prefix CC = "cc"
71 :     | prefix Y = "%y"
72 :     | prefix PSR = "%psr"
73 :     | prefix FSR = "%fsr"
74 :     | prefix MEM = "m"
75 :     | prefix CTRL = "ctrl"
76 :    
77 :     fun zero GP = SOME 0
78 :     | zero _ = NONE
79 :    
80 :     type cellset = (int list * int list)
81 :    
82 :     val empty = ([], [])
83 :     fun cellset2string(regs, fregs) = let
84 :     val gp = "gp=" :: map (fn r => (" %r" ^ Int.toString r)) regs
85 :     val fp = " fp=" :: map (fn f => (" %f" ^ Int.toString f)) fregs
86 :     in String.concat(gp @ fp)
87 :     end
88 :     fun addReg(r, (rc,fc)) = (SL.enter(r,rc), fc)
89 :     fun addFreg(f, (rc,fc)) = (rc, SL.enter(f, fc))
90 :     fun addCell GP = addReg
91 :     | addCell FP = addFreg
92 :     | addCell CC = addReg
93 :     | addCell _ = raise Cells
94 :    
95 :     fun cellsetToRegs(regmap, (regs,fregs)) = let
96 :     val lookup = Intmap.map regmap
97 :     fun trans [] = []
98 :     | trans(r::rs) = let
99 :     val r = lookup r handle _ => r
100 :     in if r = 0 then trans rs else r::trans rs
101 :     end
102 :     fun ftrans r = let
103 :     val r = lookup r handle _ => r
104 :     in if r < 32 then r + 32 else r
105 :     end
106 :     in (map ftrans fregs @ trans regs)
107 :     end
108 :     end

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