File:
[gforth] /
gforth /
vmgen-ex2 /
README
Revision
1.1:
download - view:
text,
annotated -
select for diffs
Sun Jun 2 15:46:17 2002 UTC (21 years, 10 months ago) by
anton
Branches:
MAIN
CVS tags:
HEAD
vmgen-related changes:
in prims2x:
Conversion macros for single items now take 2 arguments
Converting from two items to a type has changed order
argument printing for disassembler disabled (for now)
disassembler now also uses VM_IS_INST
in Gforth and vmgen-ex: adapted to work with changed prims2x
new: vmgen-ex2: uses union for Cell instead of casting (lots of
changes compared to vmgen-ex)
1: This directory contains a working example for using vmgen. It's a
2: small Modula-2-like programming language.
3:
4: You can build the example by first installing Gforth and then saying,
5: in this directory:
6:
7: make
8:
9: Ignore the warnings. You can check that it works with
10:
11: make check
12:
13: You can run mini programs like this:
14:
15: ./mini fib.mini
16:
17: To learn about the options, type
18:
19: ./mini -h
20:
21: The files in this directory are:
22:
23: Makefile
24: README
25: disasm.c wrapper file
26: engine.c wrapper file
27: peephole.c wrapper file
28: profile.c wrapper file
29: mini-inst.vmg simple VM instructions
30: mini-super.vmg superinstructions (empty at first)
31: mini.h common declarations
32: mini.l scanner
33: mini.y front end (parser, VM code generator)
34: support.c main() and other support functions
35: fib.mini example mini program
36: simple.mini example mini program
37: test.mini example mini program (tests everything)
38: test.out test.mini output
39: stat.awk script for aggregating profile information
40: peephole-blacklist list of instructions not allowed in superinstructions
41: seq2rule.awk script for creating superinstructions
42:
43: For your own interpreter, you would typically copy the following files
44: and change little, if anything:
45:
46: disasm.c wrapper file
47: engine.c wrapper file
48: peephole.c wrapper file
49: profile.c wrapper file
50: stat.awk script for aggregating profile information
51: seq2rule.awk script for creating superinstructions
52:
53: You would typically change much in or replace the following files:
54:
55: Makefile
56: mini-inst.vmg simple VM instructions
57: mini.h common declarations
58: mini.l scanner
59: mini.y front end (parser, VM code generator)
60: support.c main() and other support functions
61: peephole-blacklist list of instructions not allowed in superinstructions
62:
63:
64: Using profiling to create superinstructions:
65:
66: I have not added rules for this in the Makefile (there are many
67: options for selecting superinstructions, and I did not want to
68: hardcode one into the Makefile), but there are some supporting
69: scripts, and here's an example:
70:
71: Suppose you want to use fib.mini and test.mini as training programs,
72: you get the profiles like this:
73:
74: make fib.prof test.prof #takes a few seconds
75:
76: You can aggregate these profiles with stat.awk:
77:
78: awk -f stat.awk fib.prof test.prof
79:
80: The result contains lines like:
81:
82: 2 16 36910041 loadlocal lit
83:
84: This means that the sequence "loadlocal lit" statically occurs a total
85: of 16 times in 2 profiles, with a dynamic execution count of 36910041.
86:
87: The numbers can be used in various ways to select superinstructions.
88: E.g., if you just want to select all sequences with a dynamic
89: execution count exceeding 10000, you would use the following pipeline:
90:
91: awk -f stat.awk fib.prof test.prof|
92: awk '$3>=10000'| #select sequences
93: fgrep -v -f peephole-blacklist| #eliminate wrong instructions
94: awk -f seq2rule.awk| #transform sequences into superinstruction rules
95: sort -k 3 >mini-super.vmg #sort sequences
96:
97: The peephole-blacklist contains all instructions where stack caching
98: might lead to problems (for mini: call, return); the sort step is
99: necessary because currently the superinstructions containing all
100: sequence prefixes must precede a superinstruction of length >2.
101:
102: Now you can create a version of mini with superinstructions by just saying
103:
104: make
105:
106: Before you generate new profiles for creating superinstructions, you
107: have to again create a version of mini without superinstructions:
108:
109: echo >mini-super.vmg
110: make
111:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>