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

Annotation of /sml/trunk/src/MLRISC/flowgraph/gasPseudoOps.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 984 - (view) (download)

1 : george 984 signature GAS_PSEUDO_OPS = sig
2 :     structure T : MLTREE
3 :     val lexpToString : T.labexp -> string
4 :     val toString : (T.labexp, 'a) PseudoOpsBasisTyp.pseudo_op -> string
5 :     val defineLabel : Label.label -> string
6 :     end
7 :    
8 :     functor GasPseudoOps
9 :     ( structure T : MLTREE
10 :     val labFmt : {gPrefix: string, aPrefix: string}
11 :     ) : GAS_PSEUDO_OPS =
12 :     struct
13 :     structure T = T
14 :     structure PB = PseudoOpsBasisTyp
15 :     structure Fmt = Format
16 :    
17 :     fun error msg = MLRiscErrorMsg.error ("GasPseudoOps.", msg)
18 :    
19 :     fun prIntInf i = if IntInf.sign i < 0 then "-"^IntInf.toString(IntInf.~ i)
20 :     else IntInf.toString i
21 :    
22 :     fun prInt i = if i < 0 then "-"^Int.toString(~i) else Int.toString i
23 :    
24 :     (* operator precedences:
25 :     Note: these differ from C's precedences
26 :     2 MULT, DIV, LSHIFT, RSHIFT
27 :     1 AND, OR
28 :     0 PLUS, MINUS
29 :     *)
30 :    
31 :     fun parens (str, prec, op_prec) =
32 :     if prec > op_prec then "(" ^ str ^ ")" else str
33 :    
34 :     fun lexpToString le = toStr(le, 0)
35 :    
36 :     and toStr(T.LABEL lab, _) = Label.fmt labFmt lab
37 :     | toStr(T.LABEXP le, p) = toStr(le, p)
38 :     | toStr(T.CONST c, _) =
39 :     (prInt(T.Constant.valueOf c) handle _ => T.Constant.toString c)
40 :     | toStr(T.LI i, _) = prIntInf i
41 :     | toStr(T.MULS(_,lexp1, lexp2), _) = toStr(lexp1, 2) ^ "*" ^ toStr(lexp2,2)
42 :     | toStr(T.DIVS(_,lexp1, lexp2), _) = toStr(lexp1, 2) ^ "/" ^ toStr(lexp2,2)
43 :     | toStr(T.SLL(_,lexp, cnt), prec) = toStr(lexp,2) ^ "<<" ^ toStr(cnt,2)
44 :     | toStr(T.SRL(_,lexp, cnt), prec) = toStr(lexp,2) ^ ">>" ^ toStr(cnt,2)
45 :     | toStr(T.ANDB(_,lexp, mask), prec) =
46 :     parens(toStr(lexp,1) ^ "&" ^ toStr(mask, 1), prec, 1)
47 :     | toStr(T.ORB(_,lexp, mask), prec) =
48 :     parens(toStr(lexp, 1) ^ "|" ^ toStr(mask, 1), prec, 1)
49 :     | toStr(T.ADD(_,lexp1, lexp2), prec) =
50 :     parens(toStr(lexp1, 0) ^ "+" ^ toStr(lexp2, 0), prec, 0)
51 :     | toStr(T.SUB(_,lexp1, lexp2), prec) =
52 :     parens(toStr(lexp1, 0) ^ "-" ^ toStr(lexp2, 0), prec, 0)
53 :     | toStr _ = error "toStr"
54 :    
55 :     fun defineLabel lab = lexpToString (T.LABEL lab) ^ ":"
56 :    
57 :     fun decls (fmt, labs) =
58 :     String.concat
59 :     (map (fn lab => (Fmt.format fmt [Fmt.STR (lexpToString(T.LABEL lab))])) labs)
60 :    
61 :     fun toString(PB.ALIGN_SZ n) = Fmt.format ".align %d" [Fmt.INT n]
62 :     | toString(PB.ALIGN_ENTRY) = ".align 4" (* 16 byte boundary *)
63 :     | toString(PB.ALIGN_LABEL) = ".p2align 4,,7"
64 :    
65 :     | toString(PB.DATA_LABEL lab) = Label.fmt labFmt lab ^ ":"
66 :     | toString(PB.DATA_READ_ONLY) = ".section .rodata"
67 :     | toString(PB.DATA) = ".data"
68 :     | toString(PB.TEXT) = ".text"
69 :     | toString(PB.SECTION at) = ".section " ^ Atom.toString at
70 :    
71 :     | toString(PB.REORDER) = ""
72 :     | toString(PB.NOREORDER) = ""
73 :    
74 :     | toString(PB.INT{sz, i}) =
75 :     String.concat
76 :     ((case sz
77 :     of 8 => ".byte "
78 :     | 16 => ".short "
79 :     | 32 => ".int "
80 :     | 64 => error "INT64"
81 :     (*esac*)) :: map (fn lexp => lexpToString lexp ^ " ") i)
82 :    
83 :     | toString(PB.ASCII s) = Fmt.format ".ascii \"%s\"" [Fmt.STR s]
84 :     | toString(PB.ASCIIZ s) = Fmt.format ".asciiz \"%s\"" [Fmt.STR s]
85 :    
86 :     | toString(PB.FLOAT{sz, f}) =
87 :     String.concat
88 :     ((case sz
89 :     of 32 => ".single "
90 :     | 64 => ".double "
91 :     | 128 => ".extended "
92 :     (*easc*)) :: f)
93 :    
94 :     | toString(PB.IMPORT labs) = decls(".global %s\n", labs)
95 :     | toString(PB.EXPORT labs) = decls(".extern %s\n", labs)
96 :    
97 :     | toString(PB.EXT _) = error "EXT"
98 :    
99 :     end

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