source: trunk/third/gcc/bytecode.def @ 8834

Revision 8834, 11.1 KB checked in by ghudson, 28 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r8833, which included commits to RCS files with non-trunk default branches.
Line 
1# -*- C -*-
2# bytecode.def - definitions of bytecodes for the stack machine.
3
4# The production of the bytecode interpreter and compiler is
5# heavily automated by using this file creatively.
6
7# Various elementary data types are understood by the bytecode interpreter.
8# Q[IU] - quarter word (byte) signed and unsigned integers (char).
9# H[IU] - half word signed and unsigned integers (short int, maybe int).
10# S[IU] - single word signed and unsigned integers (maybe int, long int).
11# D[IU] - double word signed and unsigned integers (long long int).
12# SF - single precision floating point (float).
13# DF - double precision floating point (double).
14# XF - extended precision floating point (long double).
15# P - pointer type for address arithmetic and other purposes.
16
17# The bytecode specification consists of a series of define_operator
18# forms, that are parsed by preprocessors to automatically build
19# various switch statements.
20#       define_operator(name,
21#                       <C prototype code for implementing the operator>,
22#                       <list of variations>)
23# The <C prototype> is self explanatory.
24# The <list of variations> consists of a (parenthesized list) of
25# variation items, each of which is in itself a list.  A variation
26# item consists of a name suffix, the types of the input arguments
27# expected on the stack (shallowest item first) and (optionally) the
28# types of the output arguments (similarly ordered).  Finally, the
29# types of the literal arguments (if any) may appear.
30
31# Substitution in the C prototype code is as follows:
32# Substitution happens only after a dollar sign.  To get a literal
33# dollar sign (why would you ever want one anyway?) use $$.
34# $R1 means "result 1" $TR1 means "type name of result one"
35# $S1 means "source 1" and similarly with $TS1.
36# $L1 means "literal (inline) argument 1" and $TL1 means type thereof.
37#
38
39# Notice that the number following $R doesn't affect the push order;
40# it's used only for clarity and orthogonality, although it's checked
41# to make sure it doesn't exceed the number of outputs. A $R reference
42# results in a push, and represents the result lvalue. E.g.
43
44#       $R1 = 2\, $R2 = 17
45# will expand to:
46#       INTERP_PUSH($TR1) = 2, INTERP_PUSH($TR2) = 17
47#
48
49# Opcode 0 should never happen.
50define_operator(neverneverland, abort\(\), (()))
51
52# Stack manipulations.
53define_operator(drop, 0, ((, (SI))))
54define_operator(duplicate, 0, ((, (SI), (SI, SI))))
55define_operator(over, 0, ((, (SI), (SI, SI))))
56
57# Adjust stack pointer
58
59define_operator(setstack, 0, ((SI,,,(SI))))
60define_operator(adjstack, 0, ((SI,,,(SI))))
61
62# Constants, loads, and stores.
63define_operator(const,
64                $R1 = $L1,
65                ((QI,, (QI), (QI)), (HI,, (HI), (HI)),
66                 (SI,, (SI), (SI)), (DI,, (DI), (DI)),
67                 (SF,, (SF), (SF)), (DF,, (DF), (DF)),
68                 (XF,, (XF), (XF)), (P,, (P), (P))))
69define_operator(load,
70                $R1 = *\($TR1 *\) $S1,
71                ((QI, (P), (QI)), (HI, (P), (HI)),
72                 (SI, (P), (SI)), (DI, (P), (DI)),
73                 (SF, (P), (SF)), (DF, (P), (DF)),
74                 (XF, (P), (XF)), (P, (P), (P))))
75define_operator(store,
76                *\($TS2 *\) $S1 = $S2,
77                ((QI, (P, QI)), (HI, (P, HI)),
78                 (SI, (P, SI)), (DI, (P, DI)),
79                 (SF, (P, SF)), (DF, (P, DF)),
80                 (XF, (P, XF)), (P, (P, P)),
81                 (BLK, (SI, BLK, BLK))))
82
83# Clear memory block
84
85define_operator(clear, $S1 + $S2, ((BLK, (SI, BLK))))
86
87
88# Advance pointer by SI constant
89
90define_operator(addconst, $R1 = $S1, ((PSI, (P), (P), (SI))))
91
92
93# newlocalSI is used for creating variable-sized storage during function
94# initialization.
95
96# Create local space, return pointer to block
97
98define_operator(newlocal, $R1 = $S1, ((SI, (SI), (P))))
99
100
101# Push the address of a local variable.
102define_operator(local, $R1 = locals + $L1, ((P,, (P), (SI))))
103
104# Push the address of an argument variable.
105define_operator(arg, $R1 = args + $L1, ((P,, (P), (SI))))
106
107# Arithmetic conversions.
108define_operator(convert,
109                $R1 = \($TR1\) $S1,
110                (# Signed integral promotions (sign extensions).
111                 (QIHI, (QI), (HI)), (HISI, (HI), (SI)), (SIDI, (SI), (DI)),
112                 (QISI, (QI), (SI)),
113                 # Unsigned integral promotions (zero extensions).
114                 (QUHU, (QU), (HU)), (HUSU, (HU), (SU)), (SUDU, (SU), (DU)),
115                 (QUSU, (QU), (SU)),
116                 # Floating promotions.
117                 (SFDF, (SF), (DF)), (DFXF, (DF), (XF)),
118                 # Integral truncation.
119                 (HIQI, (HI), (QI)), (SIHI, (SI), (HI)), (DISI, (DI), (SI)),
120                 (SIQI, (SI), (QI)),
121                 # Unsigned truncation.
122                 (SUQU, (SU), (QU)),
123                 # Floating truncation.
124                 (DFSF, (DF), (SF)), (XFDF, (XF), (DF)),
125                 # Integral conversions to floating types.
126                 (SISF, (SI), (SF)), (SIDF, (SI), (DF)), (SIXF, (SI), (XF)),
127                 (SUSF, (SU), (SF)), (SUDF, (SU), (DF)), (SUXF, (SU), (XF)),
128                 (DISF, (DI), (SF)), (DIDF, (DI), (DF)), (DIXF, (DI), (XF)),
129                 (DUSF, (DU), (SF)), (DUDF, (DU), (DF)), (DUXF, (DU), (XF)),
130                 # Floating conversions to integral types.
131                 (SFSI, (SF), (SI)), (DFSI, (DF), (SI)), (XFSI, (XF), (SI)),
132                 (SFSU, (SF), (SU)), (DFSU, (DF), (SU)), (XFSU, (XF), (SU)),
133                 (SFDI, (SF), (DI)), (DFDI, (DF), (DI)), (XFDI, (XF), (DI)),
134                 (SFDU, (SF), (DU)), (DFDU, (DF), (DU)), (XFDU, (XF), (DU)),
135                 # Pointer/integer conversions.
136                 (PSI, (P), (SI)), (SIP, (SI), (P))))
137
138# Truth value conversion.  These are necessary because conversions of, e.g.,
139# floating types to integers may not function correctly for large values.
140define_operator(convert,
141                $R1 = !!$S1,
142                ((SIT, (SI), (T)), (DIT, (DI), (T)),
143                 (SFT, (SF), (T)), (DFT, (DF), (T)),
144                 (XFT, (XF), (T)), (PT, (P), (T))))
145
146# Bit field load/store.
147
148# Load and zero-extend bitfield
149
150define_operator(zxload, $R1 = $S1, ((BI, (SU, SU, P), (SU))))
151
152# Load and sign-extend bitfield
153
154define_operator(sxload, $R1 = $S1, ((BI, (SU, SU, P), (SI))))
155
156# Store integer in bitfield
157
158define_operator(sstore, $R1 = $S1, ((BI, (SU, SU, P, SI))))
159
160
161# Binary operations.
162define_operator(add,
163                $R1 = $S1 + $S2,
164                ((SI, (SI, SI), (SI)), (DI, (DI, DI), (DI)),
165                 (SF, (SF, SF), (SF)), (DF, (DF, DF), (DF)),
166                 (XF, (XF, XF), (XF)),
167                 (PSI, (P, SI), (P))))
168define_operator(sub,
169                $R1 = $S1 - $S2,
170                ((SI, (SI, SI), (SI)), (DI, (DI, DI), (DI)),
171                 (SF, (SF, SF), (SF)), (DF, (DF, DF), (DF)),
172                 (XF, (XF, XF), (XF)),
173                 (PP, (P, P), (SI))))
174define_operator(mul,
175                $R1 = $S1 * $S2,
176                ((SI, (SI, SI), (SI)), (DI, (DI, DI), (DI)),
177                 (SU, (SU, SU), (SU)), (DU, (DU, DU), (DU)),
178                 (SF, (SF, SF), (SF)), (DF, (DF, DF), (DF)),
179                 (XF, (XF, XF), (XF))))
180define_operator(div,
181                $R1 = $S1 / $S2,
182                ((SI, (SI, SI), (SI)), (DI, (DI, DI), (DI)),
183                 (SU, (SU, SU), (SU)), (DU, (DU, DU), (DU)),
184                 (SF, (SF, SF), (SF)), (DF, (DF, DF), (DF)),
185                 (XF, (XF, XF), (XF))))
186define_operator(mod,
187                $R1 = $S1 % $S2,
188                ((SI, (SI, SI), (SI)), (DI, (DI, DI), (DI)),
189                 (SU, (SU, SU), (SU)), (DU, (DU, DU), (DU))))
190define_operator(and,
191                $R1 = $S1 & $S2,
192                ((SI, (SI, SI), (SI)), (DI, (DI, DI), (DI))))
193define_operator(ior,
194                $R1 = $S1 | $S2,
195                ((SI, (SI, SI), (SI)), (DI, (DI, DI), (DI))))
196define_operator(xor,
197                $R1 = $S1 ^ $S2,
198                ((SI, (SI, SI), (SI)), (DI, (DI, DI), (DI))))
199define_operator(lshift,
200                $R1 = $S1 << $S2,
201                ((SI, (SI, SI), (SI)), (SU, (SU, SI), (SU)),
202                 (DI, (DI, SI), (DI)), (DU, (DU, SI), (DU))))
203define_operator(rshift,
204                $R1 = $S1 >> $S2,
205                ((SI, (SI, SI), (SI)), (SU, (SU, SI), (SU)),
206                 (DI, (DI, SI), (DI)), (DU, (DU, SI), (DU))))
207define_operator(lt,
208                $R1 = $S1 < $S2,
209                ((SI, (SI, SI), (T)), (SU, (SU, SU), (T)),
210                 (DI, (DI, DI), (T)), (DU, (DU, DU), (T)),
211                 (SF, (SF, SF), (T)), (DF, (DF, DF), (T)),
212                 (XF, (XF, XF), (T)), (P, (P, P), (T))))
213define_operator(le,
214                $R1 = $S1 <= $S2,
215                ((SI, (SI, SI), (T)), (SU, (SU, SU), (T)),
216                 (DI, (DI, DI), (T)), (DU, (DU, DU), (T)),
217                 (SF, (SF, SF), (T)), (DF, (DF, DF), (T)),
218                 (XF, (XF, XF), (T)), (P, (P, P), (T))))
219define_operator(ge,
220                $R1 = $S1 >= $S2,
221                ((SI, (SI, SI), (T)), (SU, (SU, SU), (T)),
222                 (DI, (DI, DI), (T)), (DU, (DU, DU), (T)),
223                 (SF, (SF, SF), (T)), (DF, (DF, DF), (T)),
224                 (XF, (XF, XF), (T)), (P, (P, P), (T))))
225define_operator(gt,
226                $R1 = $S1 > $S2,
227                ((SI, (SI, SI), (T)), (SU, (SU, SU), (T)),
228                 (DI, (DI, DI), (T)), (DU, (DU, DU), (T)),
229                 (SF, (SF, SF), (T)), (DF, (DF, DF), (T)),
230                 (XF, (XF, XF), (T)), (P, (P, P), (T))))
231define_operator(eq,
232                $R1 = $S1 == $S2,
233                ((SI, (SI, SI), (T)), (DI, (DI, DI), (T)),
234                 (SF, (SF, SF), (T)), (DF, (DF, DF), (T)),
235                 (XF, (XF, XF), (T)), (P, (P, P), (T))))
236define_operator(ne,
237                $R1 = $S1 != $S2,
238                ((SI, (SI, SI), (T)), (DI, (DI, DI), (T)),
239                 (SF, (SF, SF), (T)), (DF, (DF, DF), (T)),
240                 (XF, (XF, XF), (T)), (P, (P, P), (T))))
241
242# Unary operations.
243define_operator(neg,
244                $R1 = -$S1,
245                ((SI, (SI), (SI)), (DI, (DI), (DI)),
246                 (SF, (SF), (SF)), (DF, (DF), (DF)),
247                 (XF, (XF), (XF))))
248define_operator(not,
249                $R1 = ~$S1,
250                ((SI, (SI), (SI)), (DI, (DI), (DI))))
251define_operator(not,
252                $R1 = !$S1,
253                ((T, (SI), (SI))))
254
255# Increment operations.
256define_operator(predec,
257                $R1 = *\($TR1 *\) $S1 -= $S2,
258                ((QI, (P, QI), (QI)), (HI, (P, HI), (HI)),
259                 (SI, (P, SI), (SI)), (DI, (P, DI), (DI)),
260                 (P, (P, SI), (P)), (SF, (P, SF), (SF)),
261                 (DF, (P, DF), (DF)), (XF, (P, XF), (XF)),
262                 (BI, (SU, SU, P, SI), (SI))))
263
264define_operator(preinc,
265                $R1 = *\($TR1 *\) $S1 += $S2,
266                ((QI, (P, QI), (QI)), (HI, (P, HI), (HI)),
267                 (SI, (P, SI), (SI)), (DI, (P, DI), (DI)),
268                 (P, (P, SI), (P)), (SF, (P, SF), (SF)),
269                 (DF, (P, DF), (DF)), (XF, (P, XF), (XF)),
270                 (BI, (SU, SU, P, SI), (SI))))
271
272define_operator(postdec,
273                $R1 = *\($TR1 *\) $S1\, *\($TR1 *\) $S1 -= $S2,
274                ((QI, (P, QI), (QI)), (HI, (P, HI), (HI)),
275                 (SI, (P, SI), (SI)), (DI, (P, DI), (DI)),
276                 (P, (P, SI), (P)), (SF, (P, SF), (SF)),
277                 (DF, (P, DF), (DF)), (XF, (P, XF), (XF)),
278                 (BI, (SU, SU, P, SI), (SI))))
279
280define_operator(postinc,
281                $R1 = *\($TR1 *\) $S1\, *\($TR1 *\) $S1 += $S2,
282                ((QI, (P, QI), (QI)), (HI, (P, HI), (HI)),
283                 (SI, (P, SI), (SI)), (DI, (P, DI), (DI)),
284                 (P, (P, SI), (P)), (SF, (P, SF), (SF)),
285                 (DF, (P, DF), (DF)), (XF, (P, XF), (XF)),
286                 (BI, (SU, SU, P, SI), (SI))))
287
288# Jumps.
289define_operator(xjumpif, if \($S1\) pc = code->pc0 + $L1, ((, (T),, (SI))))
290define_operator(xjumpifnot, if \(! $S1\) pc = code->pc0 + $L1, ((, (T),, (SI))))
291define_operator(jump, pc = code->pc0 + $L1, ((,,,(SI))))
292
293# This is for GCC2. It jumps to the address on the stack.
294define_operator(jump, pc = \(void *\) $S1, ((P,,)))
295
296# Switches.  In order to (eventually) support ranges we provide four different
297# varieties of switches.  Arguments are the switch index from the stack, the
298# bytecode offset of the switch table, the size of the switch table, and
299# the default label.
300define_operator(caseSI, CASESI\($S1\, $L1\, $L2\, $L3\), ((, (SI),, (SI, SI, SI))))
301define_operator(caseSU, CASESU\($S1\, $L1\, $L2\, $L3\), ((, (SU),, (SI, SI, SI))))
302define_operator(caseDI, CASEDI\($S1\, $L1\, $L2\, $L3\), ((, (DI),, (SI, SI, SI))))
303define_operator(caseDU, CASEDU\($S1\, $L1\, $L2\, $L3\), ((, (DU),, (SI, SI, SI))))
304
305# Procedure call.
306# Stack arguments are (deepest first):
307#       procedure arguments in reverse order.
308#       pointer to the place to hold the return value.
309#       address of the call description vector.
310#       pointer to the procedure to be called.
311define_operator(call, CALL\($S1\, $S2\, $S3\, sp\), ((, (P, P, P))))
312
313# Procedure return.
314# Pushes on interpreter stack:
315#       value of retptr (pointer to return value storage slot)
316define_operator(return, $R1 = retptr, ((P,,(P))))
317
318# Really return.
319define_operator(ret, return, (()))
320
321# Print an obnoxious line number.
322define_operator(linenote, fprintf\(stderr\, "%d\\n"\, $L1\), ((,,,(SI))))
Note: See TracBrowser for help on using the repository browser.