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/ppc/flowgraph/ppcDarwinPseudoOps.sml
ViewVC logotype

Annotation of /sml/trunk/src/MLRISC/ppc/flowgraph/ppcDarwinPseudoOps.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1027 - (view) (download)

1 : jhr 1026 (* ppcDarwinPseudoOps.sml
2 :     *
3 :     * COPYRIGHT (c) 2002 Bell labs, Lucent Technologies.
4 :     *
5 :     * PPC/Darwin (aka MacOS X) pseudo operations.
6 :     *)
7 :    
8 :     functor PPCDarwinPseudoOps (
9 :     structure T : MLTREE
10 :     structure MLTreeEval : MLTREE_EVAL where T = T
11 :     ) : PSEUDO_OPS_BASIS = struct
12 :    
13 :     structure T = T
14 :     structure PB = PseudoOpsBasisTyp
15 :     structure Fmt = Format
16 :    
17 :     structure Endian = PseudoOpsBig (
18 :     structure T = T
19 :     structure MLTreeEval=MLTreeEval
20 :     val icache_alignment = 16
21 :     val max_alignment = SOME 7
22 :     val nop = {sz=4, en=0wx60000000: Word32.word}) (* FIX:: ori 0, 0, 0 *)
23 :    
24 :     (* EXPAND
25 :     structure GasPseudoOps =
26 :     GasPseudoOps(structure T = T
27 :     val labFmt = {gPrefix="", aPrefix="L"})
28 :     *)
29 :    
30 :     type 'a pseudo_op = (T.labexp, 'a) PB.pseudo_op
31 :    
32 :     fun error msg = MLRiscErrorMsg.error ("PPCDarwinPseudoOps.", msg)
33 :    
34 :     val sizeOf = Endian.sizeOf
35 :     val emitValue = Endian.emitValue
36 :    
37 : jhr 1027 val labelToString = Label.fmt {gPrefix="", aPrefix="L"}
38 :    
39 : jhr 1026 fun prIntInf i =
40 :     if IntInf.sign i < 0 then "-"^IntInf.toString(IntInf.~ i)
41 :     else IntInf.toString i
42 :    
43 :     fun prInt i = if i < 0 then "-"^Int.toString(~i) else Int.toString i
44 :    
45 :     (* operator precedences:
46 :     Note: these differ from C's precedences
47 :     2 MULT, DIV, LSHIFT, RSHIFT
48 :     1 AND, OR
49 :     0 PLUS, MINUS
50 :     *)
51 :    
52 :     fun parens (str, prec, op_prec) =
53 :     if prec > op_prec then "(" ^ str ^ ")" else str
54 :    
55 :     fun lexpToString le = toStr(le, 0)
56 :    
57 : jhr 1027 and toStr(T.LABEL lab, _) = labelToString lab
58 : jhr 1026 | toStr(T.LABEXP le, p) = toStr(le, p)
59 :     | toStr(T.CONST c, _) =
60 :     (prInt(T.Constant.valueOf c) handle _ => T.Constant.toString c)
61 :     | toStr(T.LI i, _) = prIntInf i
62 :     | toStr(T.MULS(_,lexp1, lexp2), _) = toStr(lexp1, 2) ^ "*" ^ toStr(lexp2,2)
63 :     | toStr(T.DIVS(_,lexp1, lexp2), _) = toStr(lexp1, 2) ^ "/" ^ toStr(lexp2,2)
64 :     | toStr(T.SLL(_,lexp, cnt), prec) = toStr(lexp,2) ^ "<<" ^ toStr(cnt,2)
65 :     | toStr(T.SRL(_,lexp, cnt), prec) = toStr(lexp,2) ^ ">>" ^ toStr(cnt,2)
66 :     | toStr(T.ANDB(_,lexp, mask), prec) =
67 :     parens(toStr(lexp,1) ^ "&" ^ toStr(mask, 1), prec, 1)
68 :     | toStr(T.ORB(_,lexp, mask), prec) =
69 :     parens(toStr(lexp, 1) ^ "|" ^ toStr(mask, 1), prec, 1)
70 :     | toStr(T.ADD(_,lexp1, lexp2), prec) =
71 :     parens(toStr(lexp1, 0) ^ "+" ^ toStr(lexp2, 0), prec, 0)
72 :     | toStr(T.SUB(_,lexp1, lexp2), prec) =
73 :     parens(toStr(lexp1, 0) ^ "-" ^ toStr(lexp2, 0), prec, 0)
74 :     | toStr _ = error "toStr"
75 :    
76 :     fun decls (fmt, labs) =
77 :     String.concat
78 :     (map (fn lab => (Fmt.format fmt [Fmt.STR (lexpToString(T.LABEL lab))])) labs)
79 :    
80 :     fun toString(PB.ALIGN_SZ n) = Fmt.format "\t.align\t%d" [Fmt.INT n]
81 :     | toString(PB.ALIGN_ENTRY) = "\t.align\t4" (* 16 byte boundary *)
82 :     | toString(PB.ALIGN_LABEL) = "\t.align\t2"
83 :    
84 : jhr 1027 | toString(PB.DATA_LABEL lab) = labelToString lab ^ ":"
85 : jhr 1026 | toString(PB.DATA_READ_ONLY) = "\t.const_data"
86 :     | toString(PB.DATA) = "\t.data"
87 :     | toString(PB.BSS) = "\t.section\t__DATA,__BSS"
88 :     | toString(PB.TEXT) = "\t.text"
89 :     | toString(PB.SECTION at) = "\t.section\t" ^ Atom.toString at
90 :     | toString(PB.REORDER) = ""
91 :     | toString(PB.NOREORDER) = ""
92 :     | toString(PB.INT{sz, i}) = let
93 :     fun join [] = []
94 :     | join [lexp] = [lexpToString lexp]
95 :     | join (lexp::r) = lexpToString lexp :: "," :: join r
96 :     val pop = (case sz
97 :     of 8 => "\t.byte\t"
98 :     | 16 => "\t.short\t"
99 :     | 32 => "\t.long\t"
100 :     | 64 => error "INT64"
101 :     (* end case *))
102 :     in
103 :     String.concat (pop :: join i)
104 :     end
105 :     | toString(PB.ASCII s) =
106 :     Fmt.format "\t.ascii\t\"%s\"" [Fmt.STR(String.toCString s)]
107 :     | toString(PB.ASCIIZ s) =
108 :     Fmt.format "\t.asciz \"%s\"" [Fmt.STR(String.toCString s)]
109 :     | toString(PB.SPACE sz) = Fmt.format "\t.space\t%d" [Fmt.INT sz]
110 :     | toString(PB.FLOAT{sz, f}) = let
111 :     fun join [] = []
112 :     | join [f] = [f]
113 :     | join (f::r) = f :: "," :: join r
114 :     val pop = (case sz
115 :     of 32 => "\t.single "
116 :     | 64 => "\t.double "
117 :     (* end case *))
118 :     in
119 :     String.concat (pop :: join f)
120 :     end
121 :     | toString(PB.IMPORT labs) = decls("\t.extern\t%s", labs)
122 :     | toString(PB.EXPORT labs) = decls("\t.globl\t%s", labs)
123 :     | toString(PB.COMMENT txt) = Fmt.format "; %s" [Fmt.STR txt]
124 :     | toString(PB.EXT _) = error "EXT"
125 :    
126 : jhr 1027 fun defineLabel lab = labelToString lab ^ ":"
127 : jhr 1026
128 :     end

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