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

Annotation of /sml/trunk/src/compiler/CodeGen/cpscompile/pseudoOpsLittle.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 419 - (view) (download)

1 : monnier 247 (* PseudoOpsLittle.sml -- pseudo ops for the little endian machines
2 :     *
3 :     * COPYRIGHT (c) 1996 AT&T Bell Laboratories.
4 :     *
5 :     *)
6 :    
7 :     functor PseudoOpsLittle
8 :     (structure M: MACH_SPEC
9 :     val nop : Word8.word option) =
10 :     struct
11 :     structure T = M.ObjDesc
12 :     structure W = Word
13 :    
14 :     datatype pseudo_op =
15 :     ALIGN4
16 :     | JUMPTABLE of {base:Label.label,targets:Label.label list}
17 :    
18 :     val >> = Word.>>
19 :     val ~>> = Word.~>>
20 :     val & = Word.andb
21 :     infix >> ~>> &
22 :     val itow = Word.fromInt
23 :    
24 :     (* since we never compile assembly code, we don't really care
25 :     * about this, but it is good enough for debugging purposes.
26 :     *)
27 :     fun toString (JUMPTABLE{base, targets}) =
28 :     Label.nameOf base ^ ":\t.jumptable " ^
29 :     List.foldr (op ^) "" (map (fn l => Label.nameOf l ^ " ") targets) ^
30 :     "\n"
31 :     | toString ALIGN4 = "\t .align\n"
32 :    
33 :     fun emitValue{pOp, loc, emit} = let
34 :     val itow = W.fromInt
35 :     fun emitByte n = emit(Word8.fromLargeWord(W.toLargeWord n))
36 :     fun emitWord n = (emitByte(n & 0w255); emitByte((n >> 0w8) & 0w255))
37 :     fun emitLong n = let
38 :     val w = itow n
39 :     in emitWord(w & 0w65535); emitWord(w >> 0w16)
40 :     end
41 :     fun emitLongX n = let
42 :     val w = itow n
43 :     in emitWord(w & 0w65535); emitWord(w ~>> 0w16)
44 :     end
45 :     fun align(loc) =
46 :     (case W.andb(itow(loc), 0w3)
47 :     of 0w0 => ()
48 :     | w => let
49 :     val noOp = valOf nop
50 :     val pad = (0w4 - w)
51 :     in
52 :     case pad
53 :     of 0w3 => (emit noOp; emit noOp; emit noOp)
54 :     | 0w2 => (emit noOp; emit noOp)
55 :     | 0w1 => (emit noOp)
56 :     (*esac*)
57 :     end
58 :     (*esac*))
59 :     in
60 :     case pOp
61 :     of ALIGN4 => align loc
62 :     | JUMPTABLE{base, targets} => let
63 :     val baseOff = Label.addrOf base
64 :     fun emitOffset lab = emitLongX(Label.addrOf lab - baseOff)
65 :     in align loc; app emitOffset targets
66 :     end
67 :     end (* emitValue *)
68 :    
69 :     local
70 :     (* align on word 4-byte boundary *)
71 :     fun align n = W.toIntX(W.andb(W.fromInt n + 0w3, W.notb 0w3))
72 :    
73 :     fun padding(loc) = align(loc) - loc
74 :     in
75 :     fun sizeOf(JUMPTABLE {targets, ...}, loc) = 4*length targets + padding(loc)
76 :     | sizeOf(ALIGN4, loc) = padding(loc)
77 :    
78 :     fun adjustLabels(pOp, loc) = let
79 :     fun setAddr(lab, new) =
80 :     if Label.addrOf(lab)=new then false else (Label.setAddr(lab, new); true)
81 :     in
82 :     case pOp
83 :     of JUMPTABLE{base, ...} => setAddr(base, align(loc))
84 :     | ALIGN4 => false
85 :     end
86 :     end
87 :     end
88 :    
89 :    
90 :    
91 :    
92 :    

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