xref: /netbsd/usr.sbin/gspa/gspa/gsp_act.c (revision 1b75c508)
1 /*	$NetBSD: gsp_act.c,v 1.5 2006/08/26 18:15:37 christos Exp $	*/
2 /*
3  * GSP assembler - semantic actions
4  *
5  * Copyright (c) 1993 Paul Mackerras.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *      This product includes software developed by Paul Mackerras.
19  * 4. The name of the author may not be used to endorse or promote products
20  *    derived from this software without specific prior written permission
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #include <sys/cdefs.h>
35 #ifndef lint
36 __RCSID("$NetBSD: gsp_act.c,v 1.5 2006/08/26 18:15:37 christos Exp $");
37 #endif
38 
39 #include <stdlib.h>
40 #include <string.h>
41 #include <util.h>
42 #include "gsp_ass.h"
43 
44 void
free_operands(operand l)45 free_operands(operand l)
46 {
47 	operand op, oq;
48 
49 	for( op = l; op != NULL; op = oq ){
50 		oq = op->next;
51 		if( op->type == EXPR ||
52 		    (op->type == EA && op->mode >= M_INDEX) )
53 			free_expr(op->op_u.value);
54 		free(op);
55 	}
56 }
57 
58 operand
add_operand(operand first,operand last)59 add_operand(operand first, operand last)
60 {
61 	operand p;
62 
63 	for( p = first; p->next != NULL; p = p->next )
64 		;
65 	p->next = last;
66 	return first;
67 }
68 
69 operand
reg_op(int reg)70 reg_op(int reg)
71 {
72 	operand o;
73 
74 /*	printf("reg_op reg=%d sign=%d\n", reg, sign);	*/
75 	new(o);
76 	o->type = REG;
77 	o->reg_no = reg;
78 	o->next = NULL;
79 	return o;
80 }
81 
82 operand
expr_op(expr val)83 expr_op(expr val)
84 {
85 	operand o;
86 
87 /*	printf("immed len=%d\n", len);	*/
88 	new(o);
89 	o->type = EXPR;
90 	o->op_u.value = val;
91 	o->next = NULL;
92 	return o;
93 }
94 
95 operand
string_op(char * str)96 string_op(char *str)
97 {
98 	operand o;
99 
100 /*	printf("string_op str=%s\n", str);	*/
101 	new(o);
102 	o->type = STR_OPN;
103 	o->op_u.string = str;
104 	o->next = NULL;
105 	return o;
106 }
107 
108 operand
abs_adr(expr adr)109 abs_adr(expr adr)
110 {
111 	operand o;
112 
113 /*	printf("abs_adr len=%d\n", len);	*/
114 	new(o);
115 	o->type = EA;
116 	o->mode = M_ABSOLUTE;
117 	o->op_u.value = adr;
118 	o->next = NULL;
119 	return o;
120 }
121 
122 operand
reg_ind(int reg,int mode)123 reg_ind(int reg, int mode)
124 {
125 	operand o;
126 
127 /*	printf("reg_adr r1=%d r2=%d mode=%d\n", r1, r2, mode);	*/
128 	new(o);
129 	o->type = EA;
130 	o->mode = mode;
131 	o->reg_no = reg;
132 	o->next = NULL;
133 	return o;
134 }
135 
136 operand
reg_indxy(int reg,char * xy)137 reg_indxy(int reg, char *xy)
138 {
139 	ucasify(xy);
140 	if( strcmp(xy, ".XY") != 0 )
141 		perr("Register format must be .XY");
142 	return reg_ind(reg, M_INDXY);
143 }
144 
145 operand
reg_index(int reg,expr disp)146 reg_index(int reg, expr disp)
147 {
148 	operand o;
149 
150 	o = reg_ind(reg, M_INDEX);
151 	o->op_u.value = disp;
152 	return o;
153 }
154 
155 expr
id_expr(char * id)156 id_expr(char *id)
157 {
158 	expr x;
159 
160 /*	printf("id_expr id=%s\n", id);	*/
161 	new(x);
162 	x->e_op = SYM;
163 	x->e_sym = lookup(id, TRUE);
164 	return x;
165 }
166 
167 expr
num_expr(int val)168 num_expr(int val)
169 {
170 	expr x;
171 
172 /*	printf("num_expr val=%d\n", val);	*/
173 	new(x);
174 	x->e_op = CONST;
175 	x->e_val = val;
176 	return x;
177 }
178 
179 expr
here_expr()180 here_expr()
181 {
182 	expr x;
183 
184 /*	printf("here_expr()\n");	*/
185 	new(x);
186 	x->e_op = '.';
187 	return x;
188 }
189 
190 expr
bexpr(int op,expr l,expr r)191 bexpr(int op, expr l, expr r)
192 {
193 	expr x;
194 
195 /*	printf("bexpr op=%d\n", op);	*/
196 	new(x);
197 	x->e_op = op;
198 	x->e_left = l;
199 	x->e_right = r;
200 	return x;
201 }
202 
203 void
free_expr(expr x)204 free_expr(expr x)
205 {
206 	if( x->e_op != SYM && x->e_op != CONST && x->e_op != '.' ){
207 		free_expr(x->e_left);
208 		if( x->e_right != NULL )
209 			free_expr(x->e_right);
210 	}
211 	free(x);
212 }
213