Home | History | Annotate | Line # | Download | only in mip
      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 (at) 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