mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
261 lines
7.2 KiB
Plaintext
261 lines
7.2 KiB
Plaintext
1File: PUTEXPR.C Page 1
|
|
1 /*
|
|
2 Copyright 1982
|
|
3 Alcyon Corporation
|
|
4 8716 Production Ave.
|
|
5 San Diego, Ca. 92121
|
|
6 */
|
|
7
|
|
8 #include "cgen.h"
|
|
9 #ifndef NODEBUG
|
|
10
|
|
11 char invalid[] "INVALID";
|
|
12
|
|
13 char *opname[] {
|
|
14 invalid, /*0*/
|
|
15 "+", /*1*/
|
|
16 "-", /*2*/
|
|
17 "*", /*3*/
|
|
18 "/", /*4*/
|
|
19 "%", /*5*/
|
|
20 ">>", /*6*/
|
|
21 "<<", /*7*/
|
|
22 "&", /*8*/
|
|
23 "|", /*9*/
|
|
24 "^", /*10*/
|
|
25 "!", /*11*/
|
|
26 "U-", /*12*/
|
|
27 "~", /*13*/
|
|
28 "--p", /*14*/
|
|
29 "++p", /*15*/
|
|
30 "p--", /*16*/
|
|
31 "p++", /*17*/
|
|
32 "=", /*18*/
|
|
33 "+=", /*19*/
|
|
34 "-=", /*20*/
|
|
35 "*=", /*21*/
|
|
36 "/=", /*22*/
|
|
37 "%=", /*23*/
|
|
38 ">>=", /*24*/
|
|
39 "<<=", /*25*/
|
|
40 "&=", /*26*/
|
|
41 "|=", /*27*/
|
|
42 "^=", /*28*/
|
|
43 "jsr", /*29*/
|
|
44 "==", /*30*/
|
|
45 "!=", /*31*/
|
|
46 ">", /*32*/
|
|
47 ">=", /*33*/
|
|
48 "<", /*34*/
|
|
49 "<=", /*35*/
|
|
50 "int->long", /*36*/
|
|
51 "long->int", /*37*/
|
|
52 "btst", /*38*/
|
|
53 "load", /*39*/
|
|
54 "long*", /*40*/
|
|
55 "long/", /*41*/
|
|
56 "long%", /*42*/
|
|
57 "long*=", /*43*/
|
|
58 "long/=", /*44*/
|
|
59 "long%=", /*45*/
|
|
1File: PUTEXPR.C Page 2
|
|
60 "=addr", /*46*/
|
|
61 "=not", /*47*/
|
|
62 "=neg", /*48*/
|
|
63 "docast", /*49*/
|
|
64 "st=", /*50*/
|
|
65 "long->float", /*51*/
|
|
66 "float->long", /*52*/
|
|
67 "int->float", /*53*/
|
|
68 "float->int", /*54*/
|
|
69 "tochar", /*55*/
|
|
70 invalid, /*56*/
|
|
71 invalid, /*57*/
|
|
72 invalid, /*58*/
|
|
73 invalid, /*59*/
|
|
74 "U&", /*60*/
|
|
75 "U*", /*61*/
|
|
76 "&&", /*62*/
|
|
77 "||", /*63*/
|
|
78 "?", /*64*/
|
|
79 ":", /*65*/
|
|
80 ",", /*66*/
|
|
81 "cint", /*67*/
|
|
82 "clong", /*68*/
|
|
83 "symbol", /*69*/
|
|
84 "++a", /*70*/
|
|
85 "a--", /*71*/
|
|
86 "call", /*72*/
|
|
87 "call()", /*73*/
|
|
88 "bitfield", /*74*/
|
|
89 "if", /*75*/
|
|
90 "init", /*76*/
|
|
91 "loadR0", /*77*/
|
|
92 "divlong", /*78*/
|
|
93 };
|
|
94
|
|
95 char *types[] {
|
|
96 invalid, /*0=TYPELESS*/
|
|
97 "char", /*1=CHAR*/
|
|
98 invalid, /*2=SHORT*/
|
|
99 "int", /*3=INT*/
|
|
100 "long", /*4=LONG*/
|
|
101 invalid, /*5=UCHAR*/
|
|
102 invalid, /*6=USHORT*/
|
|
103 "uint", /*7=UINT*/
|
|
104 invalid, /*8=ULONG*/
|
|
105 "float", /*9=FLOAT*/
|
|
106 invalid, /*10=DOUBLE*/
|
|
107 "struct", /*11=STRUCT*/
|
|
108 invalid, /*12=undefined*/
|
|
109 invalid, /*13=undefined*/
|
|
110 invalid, /*14=undefined*/
|
|
111 invalid, /*15=undefined*/
|
|
112 };
|
|
113
|
|
114 char *suvals[] {
|
|
115 "zero",
|
|
116 "one",
|
|
117 "quick",
|
|
118 "small",
|
|
1File: PUTEXPR.C Page 3
|
|
119 "constant",
|
|
120 "Areg",
|
|
121 "Dreg",
|
|
122 "addressable",
|
|
123 "loadable",
|
|
124 "easy",
|
|
125 "hard",
|
|
126 "veryhard",
|
|
127 };
|
|
128
|
|
129 int level;
|
|
130
|
|
131 putexpr(name,tp)
|
|
132 char *name;
|
|
133 struct tnode *tp;
|
|
134 {
|
|
135 printf("%s\n",name);
|
|
136 putsexpr(tp);
|
|
137 }
|
|
138
|
|
139 putsexpr(tp)
|
|
140 struct tnode *tp;
|
|
141 {
|
|
142 register struct tnode *ltp;
|
|
143
|
|
144 level++;
|
|
145 ltp = tp->t_left;
|
|
146 outlevel();
|
|
147 printf("%s ",opname[tp->t_op]);
|
|
148 if( tp->t_op == BFIELD || tp->t_op == IFGOTO ) {
|
|
149 if( tp->t_op == BFIELD )
|
|
150 printf("off=%d len=%d\n",(tp->t_su>>8)&0377,tp->t_su&0377);
|
|
151 else
|
|
152 printf("%s goto L%d\n",tp->t_type?"TRUE":"FALSE",tp->t_su);
|
|
153 putsexpr(tp->t_left);
|
|
154 level--;
|
|
155 return;
|
|
156 }
|
|
157 puttsu(tp);
|
|
158 switch( tp->t_op ) {
|
|
159
|
|
160 case DCLONG:
|
|
161 case CLONG:
|
|
162 case CFLOAT: /*[vlh] 3.4 */
|
|
163 printf(" %x.%x\n",tp->t_lvalue.hiword,tp->t_lvalue.loword);
|
|
164 break;
|
|
165
|
|
166
|
|
167 case CINT:
|
|
168 printf(" %d\n",tp->t_value);
|
|
169 break;
|
|
170
|
|
171 case AUTODEC:
|
|
172 case AUTOINC:
|
|
173 printf(" R%d\n",tp->t_reg);
|
|
174 break;
|
|
175
|
|
176 case SYMBOL:
|
|
177 switch( tp->t_sc ) {
|
|
1File: PUTEXPR.C Page 4
|
|
178
|
|
179 case REGISTER:
|
|
180 printf(" R%d",tp->t_reg);
|
|
181 break;
|
|
182
|
|
183 case CINDR:
|
|
184 printf(" %d\n",tp->t_offset);
|
|
185 break;
|
|
186
|
|
187 case CLINDR:
|
|
188 case CFINDR: /* [vlh] 3.4 */
|
|
189 printf(" %x.%x\n",tp->t_offset,tp->t_ssp);
|
|
190 break;
|
|
191
|
|
192 case REGOFF:
|
|
193 printf(" %d(R%d)",tp->t_offset,tp->t_reg);
|
|
194 break;
|
|
195
|
|
196 case EXTERNAL:
|
|
197 case EXTOFF:
|
|
198 printf(" %s+%d",tp->t_symbol,tp->t_offset);
|
|
199 if( tp->t_sc == EXTOFF )
|
|
200 printf("(R%d)",tp->t_reg);
|
|
201 break;
|
|
202
|
|
203 case STATIC:
|
|
204 case STATOFF:
|
|
205 printf(" L%d+%d",tp->t_label,tp->t_offset);
|
|
206 if( tp->t_sc == STATOFF )
|
|
207 printf("(R%d)",tp->t_reg);
|
|
208 break;
|
|
209
|
|
210 case INDEXED:
|
|
211 printf(" %d(R%d,R%d)",tp->t_offset,tp->t_reg,tp->t_xreg);
|
|
212 break;
|
|
213 }
|
|
214 putchar('\n');
|
|
215 break;
|
|
216
|
|
217 case IFGOTO:
|
|
218 putsexpr(tp->t_left);
|
|
219 break;
|
|
220
|
|
221 default:
|
|
222 putchar('\n');
|
|
223 putsexpr(tp->t_left);
|
|
224 if( binop(tp->t_op) )
|
|
225 putsexpr(tp->t_right);
|
|
226 break;
|
|
227 }
|
|
228 level--;
|
|
229 }
|
|
230
|
|
231 outlevel()
|
|
232 {
|
|
233 register int i;
|
|
234
|
|
235 for( i = 0; i < level; i++ )
|
|
236 putchar('\t');
|
|
1File: PUTEXPR.C Page 5
|
|
237 }
|
|
238
|
|
239 puttsu(tp)
|
|
240 struct tnode *tp;
|
|
241 {
|
|
242 register int i;
|
|
243
|
|
244 if( suptype(tp->t_type) )
|
|
245 putchar('*');
|
|
246 printf("%s ",types[btype(tp->t_type)]);
|
|
247 if( tp->t_su != 0 || (tp->t_op == CINT && tp->t_value == 0) ) {
|
|
248 i = tp->t_su >> 8;
|
|
249 if( i > 15 || i < 0 )
|
|
250 printf("INVALID");
|
|
251 else
|
|
252 printf("%s",suvals[tp->t_su>>8]);
|
|
253 }
|
|
254 }
|
|
255 #endif
|