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/amd64CG.sml
ViewVC logotype

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2931 - (view) (download)

1 : mblume 2066 (*
2 :     * AMD64 specific backend. This one uses the new RA8 scheme.
3 :     *)
4 :     local
5 :     val fast_floating_point =
6 :     MLRiscControl.mkFlag ("amd64-fast-fp",
7 :     "whether to use the fast-fp backend (amd64)")
8 :     in
9 :     functor AMD64CG (structure CCallParams: sig val frameAlign : int
10 :     val returnSmallStructsInRegs : bool
11 :     end
12 :     val abi_variant: string option) =
13 :     MachineGen
14 :     ( structure I = AMD64Instr
15 :     structure C = I.C
16 :     structure F = AMD64CFG
17 :     structure R = AMD64CpsRegs
18 :     structure CG = Control.CG
19 :    
20 :     structure MachSpec = AMD64Spec
21 :     val abi_variant = abi_variant
22 :     structure ClientPseudoOps = AMD64ClientPseudoOps
23 :     structure PseudoOps = AMD64PseudoOps
24 :     structure Ext = AMD64_SMLNJMLTreeExt(* amd64-specific *)
25 :     structure CpsRegs = AMD64CpsRegs
26 :     structure InsnProps = AMD64Props
27 :     structure Asm = AMD64AsmEmitter
28 :     structure Shuffle = AMD64Shuffle
29 :    
30 :     val fast_floating_point = fast_floating_point
31 :    
32 :     structure CCalls = UnimplementedCCallsFn
33 :     (structure T = AMD64MLTree
34 :     val impossible = ErrorMsg.impossible)
35 :    
36 :     (*
37 :     structure CCalls = IA32SVID_CCalls (
38 :     structure T = AMD64MLTree
39 :     fun ix x = x
40 :     val fast_floating_point = fast_floating_point
41 :     (* NOTE: the following need to be changed for MacOS X on Intel *)
42 :     val frameAlign = CCallParams.frameAlign
43 :     val returnSmallStructsInRegs = CCallParams.returnSmallStructsInRegs)
44 :     *)
45 :    
46 :     (* for the time being... *)
47 :     structure OmitFramePtr = struct
48 :     structure CFG=AMD64CFG
49 :     structure I=AMD64Instr
50 :     val vfp = CpsRegs.vfp
51 :     (* no rewriting necessary, backend uses %fp instead of %sp *)
52 :     fun omitframeptr _ = ()
53 :     end
54 :     (*
55 :     structure OmitFramePtr =
56 :     AMD64OmitFramePointer(structure I=AMD64Instr
57 :     structure MemRegs=AMD64MemRegs
58 :     structure CFG=AMD64CFG
59 :     val memRegBase = SOME(AMD64CpsRegs.vfp))
60 :     *)
61 :    
62 :     val spill = CPSRegions.spill
63 :     val stack = CPSRegions.stack
64 :    
65 :     fun error msg = MLRiscErrorMsg.error("AMD64CG",msg)
66 :    
67 :     fun base() = (* XXXX *)
68 :     if !ClusterAnnotation.useVfp then AMD64CpsRegs.vfp else I.C.rsp
69 :    
70 : gkuan 2931 val floats16ByteAligned = false
71 : mblume 2066
72 :     structure MLTreeComp=
73 : dbm 2636 AMD64Gen(
74 :     structure I=AMD64Instr
75 : mblume 2066 structure MLTreeUtils = MLTreeUtils
76 :     (structure T = AMD64MLTree
77 :     fun hashSext _ _ = 0w0
78 :     fun hashRext _ _ = 0w0
79 :     fun hashFext _ _ = 0w0
80 :     fun hashCCext _ _ = 0w0
81 :    
82 :     (* Equality extensions *)
83 :     fun eqSext _ _ = false
84 :     fun eqRext _ _ = false
85 :     fun eqFext _ _ = false
86 :     fun eqCCext _ _ = false
87 :    
88 :     (* Pretty printing extensions *)
89 :     fun showSext _ _ = ""
90 :     fun showRext _ _ = ""
91 :     fun showFext _ _ = ""
92 :     fun showCCext _ _ = ""
93 :     )
94 :     structure ExtensionComp = AMD64MLTreeExtComp
95 :     (structure I = AMD64Instr
96 :     structure T = AMD64MLTree
97 :     structure CFG = AMD64CFG
98 :     structure TS = AMD64MLTreeStream
99 :     val fast_fp = fast_floating_point
100 :     )
101 :     structure MLTreeStream = AMD64MLTreeStream
102 : gkuan 2883
103 :     fun signBit ty = raise Fail "todo"
104 :     fun negateSignBit ty = raise Fail "todo"
105 : gkuan 2931 val floats16ByteAligned = floats16ByteAligned
106 : mblume 2066 )
107 :    
108 :     structure Jumps =
109 :     AMD64Jumps(structure Instr=AMD64Instr
110 :     structure AsmEmitter=AMD64AsmEmitter
111 :     structure Eval=AMD64MLTreeEval
112 :     structure Shuffle=AMD64Shuffle
113 :     structure MCEmitter=AMD64MCEmitter)
114 :    
115 :     structure BackPatch =
116 :     BackPatch(structure Jumps=Jumps
117 :     structure Emitter=AMD64MCEmitter
118 :     structure Props=InsnProps
119 :     structure CFG = AMD64CFG
120 :     structure Asm=AMD64AsmEmitter
121 :     structure CodeString=CodeString)
122 :    
123 :     structure RA =
124 : dbm 2636 AMD64RegAlloc
125 : mblume 2066 (structure I = AMD64Instr
126 :     structure CB = CellsBasis
127 : dbm 2636 structure Props = InsnProps
128 : mblume 2066 structure Asm = AMD64AsmEmitter
129 :     structure CFG = AMD64CFG
130 :     structure SpillHeur = ChowHennessySpillHeur
131 :     structure Spill = RASpill
132 :     (structure Asm = AMD64AsmEmitter
133 :     structure InsnProps = InsnProps
134 :     )
135 :    
136 :     type spill_info = unit
137 :    
138 :     fun beforeRA _ = AMD64StackSpills.init()
139 :    
140 :     val toInt32 = Int32.fromInt
141 :     fun cacheOffset r = I.Immed(toInt32(AMD64Runtime.vregStart +
142 :     Word.toIntX(Word.<<(Word.fromInt(r-8),0w2))))
143 :     fun cacheFPOffset f = I.Immed(toInt32(AMD64Runtime.vFpStart +
144 :     Word.toIntX(Word.<<(Word.fromInt(f-40),0w3))))
145 :    
146 : dbm 2636 datatype ra_phase = SPILL_PROPAGATION | SPILL_COLORING
147 :     datatype spill_operand_kind = SPILL_LOC | CONST_VAL
148 : mblume 2066
149 :     structure Int =
150 :     struct
151 :     val avail = R.availR
152 :     val dedicated = R.dedicatedR
153 :     val phases = [SPILL_PROPAGATION,SPILL_COLORING]
154 :    
155 :     (* We try to make unused memregs available for spilling
156 :     * This is necessary because of the stupid SML code generator
157 :     * doesn't keep track of which are being used.
158 :     *)
159 :     fun spillInit(RAGraph.GRAPH{nodes, ...}) =
160 :     let val lookup = IntHashTable.lookup nodes
161 :     fun find(r, free) =
162 :     if r >= 10 then (* note, %8 and %9 are reserved! *)
163 :     let val free =
164 :     case lookup r of
165 :     RAGraph.NODE{uses=ref [], defs=ref [], ...} =>
166 :     cacheOffset r::free
167 :     | _ => free
168 :     in find(r-1, free) end
169 :     else
170 :     free
171 :     val free = find(31 (* AMD64Runtime.numVregs+8-1 *), [])
172 :     in (*AMD64StackSpills.setAvailableOffsets free*) ()
173 :     end
174 :    
175 :     val getRegLoc' = AMD64StackSpills.getRegLoc
176 :    
177 :     fun spillLoc{info, an, cell, id} =
178 :     {opnd=I.Displace{base=base(), disp=getRegLoc' id, mem=spill},
179 :     kind=SPILL_LOC
180 :     }
181 :    
182 :     end
183 :    
184 :     structure Float =
185 :     struct
186 :     val avail = R.availF
187 :     val dedicated = R.dedicatedF
188 :     val phases = [SPILL_PROPAGATION]
189 :    
190 :     fun spillInit(RAGraph.GRAPH{nodes, ...}) =
191 :     let val lookup = IntHashTable.lookup nodes
192 :     fun find(r, free) =
193 :     if r >= 32+8 then
194 :     let val free =
195 :     case lookup r of
196 :     RAGraph.NODE{uses=ref [], defs=ref [],...} =>
197 :     cacheFPOffset r::free
198 :     | _ => free
199 :     in find(r-1, free) end
200 :     else
201 :     free
202 :     val free = find(63, [])
203 :     in AMD64StackSpills.setAvailableFPOffsets free
204 :     end
205 :    
206 :     fun spillLoc(S, an, loc) =
207 :     I.Displace{base=base(), disp=AMD64StackSpills.getFregLoc loc, mem=spill}
208 :    
209 :     end
210 : gkuan 2931
211 :     val floats16ByteAligned = floats16ByteAligned
212 : mblume 2066 ) (* AMD64RA *)
213 :     ) (* AMD64CG *)
214 :     end

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