|
|
1.1 root 1: @ For the Mips, all comments are no-ops, so to get diagnostics in
2: assembly mode we have to slip in and define a new comment function.
3: Our life is further complicated by the fact that the stream on which
4: comments are to be written is bound late, so we have to save up comments
5: and then write them when asked to [[generate]].
6: <<*>>=
7: structure MipsAC : ASSEMBLER = struct
8: val diag_out = ref std_out
9: structure MCN = struct
10: open MipsCoder
11: structure M = struct
12: open M
13: fun comment s = output (!diag_out) s
14: end
15: end
16:
17: structure CM = MipsCM(MCN)
18:
19: structure Gen = CPScomp(CM)
20: fun generate (lexp, stream) = (
21: diag_out := stream;
22: Gen.compile lexp;
23: MipsCoder.codestats stream;
24: Emitters.address := 0;
25: MipsCoder.codegen (Emitters.MipsAsm stream);
26: ())
27: end
28:
29: <<*>>=
30: structure MipsCodeStats : ASSEMBLER = struct
31: val diag_out = ref std_out
32: structure MCN = MipsCoder
33:
34: structure CM = MipsCM(MCN)
35:
36: structure Gen = CPScomp(CM)
37: fun generate (lexp, stream) = (
38: Gen.compile lexp;
39: MipsCoder.codestats stream;
40: ())
41: end
42:
43: @ Mips machines come in two byte-orders, so we need two of
44: every machinelike thing.
45: <<*>>=
46: structure MipsMCBig : CODEGENERATOR = struct
47: structure CM = MipsCM(MipsCoder)
48: structure Gen = CPScomp(CM)
49:
50: fun generate lexp = (
51: Gen.compile lexp;
52: MipsCoder.codegen (Emitters.BigEndian);
53: Emitters.emitted_string ()
54: )
55: end
56:
57: structure MipsMCLittle : CODEGENERATOR = struct
58: structure CM = MipsCM(MipsCoder)
59: structure Gen = CPScomp(CM)
60: fun diag (s : string) f x =
61: f x handle e =>
62: (print "?exception "; print (System.exn_name e);
63: print " in mipsglue."; print s; print "\n";
64: raise e)
65:
66: fun generate lexp = (
67: diag "Gen.compile" Gen.compile lexp;
68: diag "MipsCoder.codegen" MipsCoder.codegen (Emitters.LittleEndian);
69: diag "Emitters.emitted_string" Emitters.emitted_string ()
70: )
71: end
72:
73:
74: structure CompMipsLittle = Batch(structure M=MipsMCLittle and A=MipsAC)
75: structure IntMipsLittle = IntShare(MipsMCLittle)
76:
77: structure CompMipsBig = Batch(structure M=MipsMCBig and A=MipsAC)
78: structure IntMipsBig = IntShare(MipsMCBig)
79:
80: structure CompMipsStats = Batch(structure M=MipsMCLittle and A=MipsCodeStats)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.