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/compiler/CodeGen/x86/x86StackSpills.sml
ViewVC logotype

Annotation of /sml/trunk/src/compiler/CodeGen/x86/x86StackSpills.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 247 - (view) (download)
Original Path: sml/branches/SMLNJ/src/compiler/CodeGen/x86/x86StackSpills.sml

1 : monnier 247 signature X86STACKSPILLS = sig
2 :     structure I : X86INSTR
3 :     val init : unit -> unit
4 :     val getRegLoc : int -> I.operand
5 :     val getFregLoc : int -> I.operand
6 :     end
7 :    
8 :     structure X86StackSpills : X86STACKSPILLS =
9 :     struct
10 :     exception RegSpills
11 :     structure I = X86Instr
12 :    
13 :     fun error msg = ErrorMsg.impossible ("X86CG." ^ msg)
14 :    
15 :     val initialSpillOffset = X86Runtime.spillStart
16 :     val spillOffset = ref initialSpillOffset
17 :     val spillAreaSz = X86Runtime.spillAreaSz
18 :     fun newOffset n =
19 :     if (n > spillAreaSz) then error "newOffset - spill area is too small"
20 :     else spillOffset := n
21 :    
22 :     val spillTbl : Int32.int Intmap.intmap ref = ref(Intmap.new(0, RegSpills))
23 :    
24 :     fun init () =
25 :     (spillOffset:=initialSpillOffset;
26 :     spillTbl:=Intmap.new(16, RegSpills))
27 :    
28 :     val toInt32 = Int32.fromInt
29 :    
30 :     fun getRegLoc (reg:int) = let
31 :     val tbl = !spillTbl
32 :     in
33 :     I.Immed
34 :     (Intmap.map tbl reg
35 :     handle RegSpills => let
36 :     val offset = !spillOffset
37 :     val i32 = toInt32 offset
38 :     in
39 :     newOffset(offset+4);
40 :     Intmap.add tbl (reg,i32);
41 :     i32
42 :     end)
43 :     end
44 :    
45 :     fun getFregLoc freg = let
46 :     val tbl = !spillTbl
47 :     in
48 :     I.Immed
49 :     (Intmap.map tbl freg
50 :     handle RegSpills => let
51 :     val offset = !spillOffset
52 :     val fromInt = Word.fromInt
53 :     val aligned = Word.toIntX(Word.andb(fromInt offset+0w7, fromInt ~8))
54 :     val i32 = toInt32 aligned
55 :     in
56 :     newOffset(aligned+8);
57 :     Intmap.add tbl (freg, i32);
58 :     i32
59 :     end)
60 :     end
61 :     end

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