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 */ 37union aarg { 38 int iarg; 39 char *sarg; 40 void *varg; 41}; 42 43struct 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 */ 60typedef unsigned int TWORD; 61#define NIL (NODE *)0 62 63struct regw; 64 65typedef 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