ZU and ZV weren't getting properly distinguished.
[unix-history] / usr / src / old / pcc / pcc.h
CommitLineData
bb0cfa24
DF
1/*
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
6 * @(#)pcc.h 5.1 (Berkeley) %G%
7 */
8
9ef81f2b
RC
9/*
10 * This file contains definitions for all the constants and structures
11 * needed to use the intermediate code files generated and read by
12 * the Portable C Compiler and related compilers.
13 *
14 * Rules for changing this code:
15 * 1) All op values must be integer constants -- this permits us to run
16 * a 'sed' script on this file to create %term declarations for yacc.
17 * 2) Because the PCC uses fancy ASG and UNARY macros, assignment
18 * operators must have values 1 greater than corresponding normal
19 * operators, and unary operators must have values 2 greater ditto.
20 * 3) Ops used only by f1 must have values >= 150 (PCCF_FORTOPS).
21 * 4) Other language-dependent ops must have values >= 200.
22 */
23
24# ifndef PCC_TOKENS
25
26# define PCC_TOKENS 0
27
28# define PCC_ERROR 1 /* an error node */
29# define PCC_FREE 2 /* an unused node */
30
31/*
32 * Constants.
33 */
34# define PCC_STRING 3 /* a string constant */
35# define PCC_ICON 4 /* an integer constant */
36# define PCC_FCON 5 /* a floating point constant */
37# define PCC_DCON 6 /* a double precision f.p. constant */
38
39/*
40 * Leaf types.
41 */
42# define PCC_NAME 7 /* an identifier */
43# define PCC_REG 8 /* a register */
44# define PCC_OREG 9 /* register and offset */
45# define PCC_CCODES 10 /* condition codes */
46# define PCC_FLD 11 /* a bit field */
47
48/*
49 * Arithmetic operators.
50 */
51# define PCC_PLUS 12 /* + */
52# define PCC_PLUSEQ 13 /* += */
53# define PCC_UPLUS 14 /* unary + (for completeness) */
54# define PCC_MINUS 15 /* - */
55# define PCC_MINUSEQ 16 /* -= */
56# define PCC_UMINUS 17 /* unary - */
57# define PCC_MUL 18 /* * */
58# define PCC_MULEQ 19 /* *= */
59/* Reserve a slot for 'unary *', which is PCC jargon for PCC_DEREF (yech) */
60# define PCC_DIV 21 /* / */
61# define PCC_DIVEQ 22 /* /= */
62# define PCC_MOD 23 /* % */
63# define PCC_MODEQ 24 /* %= */
64# define PCC_INCR 25 /* ++ */
65# define PCC_DECR 26 /* -- */
66# define PCC_ASSIGN 27 /* = (these last 3 are stretching it) */
67
68/*
69 * Bit operators.
70 */
71# define PCC_AND 28 /* & */
72# define PCC_ANDEQ 29 /* &= */
73/* Reserve a slot for 'unary &', jargon for PCC_ADDROF */
74# define PCC_OR 31 /* | */
75# define PCC_OREQ 32 /* |= */
76# define PCC_ER 33 /* ^ */
77# define PCC_EREQ 34 /* ^= */
78# define PCC_LS 35 /* << */
79# define PCC_LSEQ 36 /* <<= */
80# define PCC_RS 37 /* >> */
81# define PCC_RSEQ 38 /* >>= */
82# define PCC_COMPL 39 /* ~ */
83
84/*
85 * Booleans.
86 */
87# define PCC_EQ 40 /* == */
88# define PCC_NE 41 /* != */
89# define PCC_LE 42 /* <= */
90# define PCC_LT 43 /* < */
91# define PCC_GE 44 /* >= */
92# define PCC_GT 45 /* > */
93# define PCC_ULE 46 /* unsigned <= */
94# define PCC_ULT 47 /* unsigned < */
95# define PCC_UGE 48 /* unsigned >= */
96# define PCC_UGT 49 /* unsigned > */
97# define PCC_QUEST 50 /* ? (for conditional expressions) */
98# define PCC_COLON 51 /* : (for conditional expressions) */
99# define PCC_ANDAND 52 /* && */
100# define PCC_OROR 53 /* || */
101# define PCC_NOT 54 /* ! */
102
103/*
104 * Function calls.
105 */
106# define PCC_CALL 55 /* call by value */
107/* no ASG */
108# define PCC_UCALL 57 /* call with no arguments */
109# define PCC_FORTCALL 58 /* call by reference? */
110/* no ASG */
111# define PCC_UFORTCALL 60 /* ??? */
112# ifdef INLINE
113# define PCC_INLINE 61 /* inline function */
114/* no ASG */
115# define PCC_UINLINE 63 /* inline with no arguments */
116# endif INLINE
117
118/*
119 * Referencing and dereferencing.
120 */
121# define PCC_DEREF 20 /* * */
122# define PCC_ADDROF 30 /* & */
123
124/*
125 * Special structure operators.
126 */
127# define PCC_DOT 64 /* . */
128# define PCC_STREF 65 /* -> */
129# define PCC_STASG 66 /* structure assignment */
130# define PCC_STARG 67 /* an argument of type structure */
131# define PCC_STCALL 68 /* a function of type structure */
132/* no ASG */
133# define PCC_USTCALL 70 /* unary structure function */
134
135/*
136 * Conversions.
137 */
138# define PCC_SCONV 71 /* scalar conversion */
139# define PCC_PCONV 72 /* pointer conversion */
140# define PCC_PMCONV 73 /* pointer multiply conversion */
141# define PCC_PVCONV 74 /* pointer divide conversion */
142# define PCC_CAST 75 /* redundant? */
143
144/*
145 * Bracket types.
146 */
147# define PCC_LB 76 /* [ */
148# define PCC_RB 77 /* ] */
149
150/*
151 * Comma nodes.
152 */
153# define PCC_COMOP 78 /* , (in expressions) */
154# define PCC_CM 79 /* , (in argument lists) */
155
156/*
157 * Miscellaneous.
158 */
159# define PCC_FORCE 80 /* result of last expression goes in r0 */
160# define PCC_GOTO 81 /* unconditional goto */
161# define PCC_CBRANCH 82 /* goto label if !test */
162# define PCC_RETURN 83 /* return from function */
163# define PCC_INIT 84 /* initialized data */
164# define PCC_TYPE 85 /* a type */
165# define PCC_CLASS 86 /* a storage class */
166
167# define PCC_MAXOP 86 /* highest numbered PCC op */
168
169/*
170 * Special codes for interfacing to /lib/f1.
171 */
172# define PCCF_FORTOPS 150
173# define PCCF_FTEXT 150 /* pass literal assembler text */
174# define PCCF_FEXPR 151 /* a statement */
175# define PCCF_FSWITCH 152 /* not implemented */
176# define PCCF_FLBRAC 153 /* beginning of subroutine */
177# define PCCF_FRBRAC 154 /* end of subroutine */
178# define PCCF_FEOF 155 /* end of file */
179# define PCCF_FARIF 156 /* not implemented */
180# define PCCF_FLABEL 157 /* an f77 label */
181
182# endif PCC_TOKENS
183
184
185/*
186 * Types, as encoded in intermediate file cookies.
187 */
188# define PCCT_UNDEF 0
189# define PCCT_FARG 1 /* function argument */
190# define PCCT_CHAR 2
191# define PCCT_SHORT 3
192# define PCCT_INT 4
193# define PCCT_LONG 5
194# define PCCT_FLOAT 6
195# define PCCT_DOUBLE 7
196# define PCCT_STRTY 8
197# define PCCT_UNIONTY 9
198# define PCCT_ENUMTY 10
199# define PCCT_MOETY 11 /* member of enum */
200# define PCCT_UCHAR 12
201# define PCCT_USHORT 13
202# define PCCT_UNSIGNED 14
203# define PCCT_ULONG 15
204
205/*
206 * Type modifiers.
207 */
208# define PCCTM_PTR 020
209# define PCCTM_FTN 040
210# define PCCTM_ARY 060
211# define PCCTM_BASETYPE 017
212# define PCCTM_TYPESHIFT 2
213
214
215/*
216 * Useful macros. 'PCCOM' macros apply to ops.
217 */
218# define PCCOM_ASG 1+
219# define PCCOM_UNARY 2+
220# define PCCOM_NOASG (-1)+
221# define PCCOM_NOUNARY (-2)+
222
223# define PCCM_TRIPLE(op, var, type) \
224 ((op) | ((var) << 8) | (long) (type) << 16)
225# define PCCM_TEXT(s) \
226 PCCM_TRIPLE(PCCF_FTEXT, (strlen(s) + 3) / 4, 0)
227# define PCCM_ADDTYPE(t, m) \
228 ((((t) &~ PCCTM_BASETYPE) << PCCTM_TYPESHIFT) | \
229 (m) | ((t) & PCCTM_BASETYPE))