1 /*        Id: node.h,v 1.43 2015/11/17 19:19:40 ragge Exp   */
2 /*        $NetBSD: node.h,v 1.1.1.5 2016/02/09 20:29:16 plunky Exp $  */
3 /*
4  * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se).
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #ifndef NODE_H
31 #define NODE_H
32 
33 /*
34  * The attribute struct contains stuff that might be useful in
35  * both passes; but currently it's only legal to use it in pass1.
36  */
37 union aarg {
38           int iarg;
39           char *sarg;
40           void *varg;
41 };
42 
43 struct attr {
44           struct attr *next;
45           unsigned int atype:12, sz:2;
46           union aarg aa[];
47 };
48 
49 #define iarg(x) aa[x].iarg
50 #define sarg(x) aa[x].sarg
51 #define varg(x) aa[x].varg
52 
53 /*
54  * The node structure is the basic element in the compiler.
55  * Depending on the operator, it may be one of several types.
56  *
57  * This is rewritten to be a struct instead of a union as it
58  * was in the old compiler.
59  */
60 typedef unsigned int TWORD;
61 #define NIL (NODE *)0
62 
63 struct regw;
64 
65 typedef struct node {
66           int       n_op;
67           union {
68                     int _reg;
69                     struct regw *_regw;
70           } n_3;
71 #define   n_reg     n_3._reg
72 #define   n_regw    n_3._regw
73           TWORD     n_type;
74           TWORD     n_qual;
75           int       n_su;
76           union {
77                     char *    _name;
78                     int       _label;
79 #ifdef LANG_CXX
80                     union     dimfun *_df;
81 #endif
82           } n_5;
83           struct attr *n_ap;
84           union {
85                     struct {
86                               union {
87                                         struct node *_left;
88                                         CONSZ _val;
89                               } n_l;
90                               union {
91                                         struct node *_right;
92                                         int _rval;
93 #ifdef LANG_CXX
94                                         struct symtab *_sp;
95 #endif
96                               } n_r;
97                     } n_u;
98                     void *_dcon;
99 #if 0
100 #ifdef SOFTFLOAT
101 #ifdef FDFLOAT
102                     /* To store F- or D-floats */
103                     struct softfloat {
104                               unsigned short fd1, fd2, fd3, fd4;
105                     } _dcon;
106 #else
107 #error missing softfloat structure definition
108 #endif
109 #else
110                     long double         _dcon;
111 #endif
112 #endif
113           } n_f;
114 } NODE;
115 
116 #define   n_name    n_5._name
117 #define   n_df      n_5._df
118 #define   n_label   n_5._label
119 
120 #define   n_left    n_f.n_u.n_l._left
121 #define   n_val     n_f.n_u.n_l._val
122 #define   n_slval   n_f.n_u.n_l._slval
123 #define   n_right   n_f.n_u.n_r._right
124 #define   n_rval    n_f.n_u.n_r._rval
125 #define   n_sp      n_f.n_u.n_r._sp
126 #define   n_dcon    n_f._dcon
127 #define   getlval(p)          ((p)->n_f.n_u.n_l._val)
128 #define   setlval(p,v)        ((p)->n_f.n_u.n_l._val = (v))
129 
130 #define   NLOCAL1   010000
131 #define   NLOCAL2   020000
132 #define   NLOCAL3   040000
133 /*
134  * Node types.
135  *
136  * MAXOP is the highest number used by the backend.
137  */
138 
139 #define FREE        1
140 /*
141  * Value nodes.
142  */
143 #define NAME        2
144 #define ICON        4
145 #define FCON        5
146 #define REG         6
147 #define OREG        7
148 #define TEMP        8
149 #define XARG        9
150 
151 /*
152  * Arithmetic nodes.
153  */
154 #define PLUS        10
155 #define MINUS       11
156 #define DIV         12
157 #define MOD         13
158 #define MUL         14
159 
160 /*
161  * Bitwise operations.
162  */
163 #define AND         15
164 #define OR          16
165 #define ER          17
166 #define LS          18
167 #define RS          19
168 #define COMPL       20
169 
170 #define UMUL        23
171 #define UMINUS      24
172 
173 /*
174  * Logical compare nodes.
175  */
176 #define EQ          25
177 #define NE          26
178 #define LE          27
179 #define LT          28
180 #define GE          29
181 #define GT          30
182 #define ULE         31
183 #define ULT         32
184 #define UGE         33
185 #define UGT         34
186 
187 /*
188  * Branch nodes.
189  */
190 #define CBRANCH     35
191 
192 /*
193  * Convert types.
194  */
195 #define FLD         36
196 #define SCONV       37
197 #define PCONV       38
198 #define PMCONV      39
199 #define PVCONV      40
200 
201 /*
202  * Function calls.
203  */
204 #define CALL        41
205 #define   UCALL     42
206 #define FORTCALL 43
207 #define UFORTCALL 44
208 #define STCALL      45
209 #define USTCALL     46
210 
211 /*
212  *  Other used nodes.
213  */
214 #define CCODES      47
215 #define CM          48
216 #define ASSIGN      49
217 #define STASG       50
218 #define STARG       51
219 #define FORCE       52
220 #define XASM        53
221 #define   GOTO      54
222 #define   RETURN    55
223 #define   FUNARG    57
224 #define   ADDROF    58
225 
226 #define   MAXOP     58
227 
228 #endif
229