Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / sources / gen / lcode.c
1 /*     Loglan82 Compiler&Interpreter
2      Copyright (C) 1993 Institute of Informatics, University of Warsaw
3      Copyright (C)  1993, 1994 LITA, Pau
4      
5      This program is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published by
7      the Free Software Foundation; either version 2 of the License, or
8      (at your option) any later version.
9      
10      This program is distributed in the hope that it will be useful,
11      but WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13      GNU General Public License for more details.
14      
15
16 =======================================================================
17 */
18
19 #if TALK >= 3
20
21 #include <stdio.h>
22 #include <string.h>
23
24 #include "glodefs.h"
25 #include "mainvar.h"
26
27
28 void dump_lcode( name ) char *name;{
29
30    FILE *fout;
31    char outname[100];
32    unsigned char opdescr[ 229 ];
33    int args[ 3 ] , arg_no ;
34    int  i, opcode, n ;
35
36    strcpy(outname,name);
37    fout=fopen(strcat(outname,".lco"),"w");
38    if( fout==NULL ){
39       fprintf(stderr,"Can't open file %s for writing\n",name);
40       exit(10);
41    }
42
43    /* initiate opdescr */
44
45    for( n=100; n<=131; n++ )  opdescr[ n ]=3;
46    for( n=30 ; n<=83 ; n++ )  opdescr[ n ]=2;
47    opdescr[ 29 ]=3;
48    opdescr[ 37 ]=3;
49    opdescr[ 39 ]=3;
50    opdescr[ 40 ]=3;
51    opdescr[ 44 ]=2;
52    opdescr[ 45 ]=2;
53    for( n=52 ; n<=57 ; n++ )  opdescr[ n ]=3;
54    for( n=84 ; n<=99 ; n++ )  opdescr[ n ]=3;
55    opdescr[ 11 ]=1;
56    opdescr[ 12 ]=1;
57    opdescr[ 13 ]=2;
58    opdescr[ 15 ]=2;
59    opdescr[ 16 ]=2;
60    for( n=20 ; n<=26 ; n++ )  opdescr[ n ]=3;
61    for( n=1  ; n<=5  ; n++ )  opdescr[ n ]=3;
62    opdescr[ 2 ]=2;
63    opdescr[ 132 ]=1;
64    opdescr[ 145 ]=3;
65    opdescr[ 137 ]=2;
66    opdescr[ 138 ]=2;
67    opdescr[ 139 ]=2;
68    opdescr[ 144 ]=2;
69    opdescr[ 149 ]=2;
70    opdescr[ 150 ]=2;
71    opdescr[ 151 ]=2;
72    opdescr[ 152 ]=2;
73    opdescr[ 140 ]=1;
74    opdescr[ 141 ]=1;
75    opdescr[ 143 ]=1;
76    opdescr[ 146 ]=1;
77    opdescr[ 147 ]=1;
78    opdescr[ 148 ]=1;
79    opdescr[ 153 ]=1;
80    opdescr[ 158 ]=1;
81    opdescr[ 159 ]=2;
82    opdescr[ 160 ]=2;
83    opdescr[ 161 ]=2;
84    opdescr[ 162 ]=2;
85    opdescr[ 163 ]=2;
86    opdescr[ 164 ]=3;
87    opdescr[ 165 ]=3;
88    opdescr[ 166 ]=3;
89    opdescr[ 170 ]=3;
90    for( n=172 ; n<= 194 ; n++ )  opdescr[ n ]=0;
91    opdescr[ 175 ]=1;
92    opdescr[ 177 ]=1;
93    opdescr[ 178 ]=1;
94    opdescr[ 181 ]=1;
95    opdescr[ 182 ]=1;
96    opdescr[ 183 ]=1;
97    opdescr[ 184 ]=1;
98    opdescr[ 186 ]=1;
99    opdescr[ 188 ]=1;
100    opdescr[ 189 ]=3;
101    opdescr[ 220 ]=1;
102    opdescr[ 221 ]=0;
103    opdescr[ 222 ]=0;
104    opdescr[ 223 ]=0;
105    opdescr[ 224 ]=0;
106    opdescr[ 225 ]=0;
107    opdescr[ 226 ]=0;
108    opdescr[ 227 ]=0;
109    opdescr[ 228 ]=1;
110    for( n = 195 ; n<=219 ; n++ )  opdescr[ n ]=2;
111    for( n = 201 ; n<=204 ; n++ )  opdescr[ n ]=1;
112
113
114    while( 1 ) {
115
116       opcode = next();
117       arg_no = opdescr[ opcode ] ;
118       for(i = 0 ; i < arg_no  ; i++)  args[ i ] = next();
119
120       fprintf(fout,"  %3d    " , opcode );
121
122       switch( opcode ) {
123
124        case  13 :
125          if(args[ 1 ] > 0 )
126             fprintf(fout,"     t%-5d := R%1d",args[0],args[1]);
127          else
128             fprintf(fout,"     t%-5d := %5d(R6)",args[0],args[1]);
129          break;
130
131        case  23 :
132          fprintf(fout,"     t%-5d := sp%-3d.par%02d",args[0],args[1],args[2]);
133          break;
134
135        case  37 :
136          fprintf(fout,"     t%-5d := t%-5d + %d",args[0],args[1],args[2]);
137          break;
138
139        case  60 :
140          fprintf(fout,"     t%-5d := t%-5d",args[0],args[1]);
141          break;
142
143        case  64 :
144        case  65 :
145        case  66 :
146        case  67 :
147        case  68 :
148        case  69 :
149        case  70 :
150        case  71 :
151        case  72 :
152          fprintf(fout,"     t%-5d := %2d * t%-5d",args[0],opcode-62,args[1]);
153          break;
154
155        case 110 :
156          fprintf(fout,"     t%-5d := ( t%-5d  > t-5d )",args[0],args[1],args[2]);
157          break;
158
159        case 132 :
160          fprintf(fout,"     call sp%-3d",args[0]);
161          break;
162
163        case 139 :
164          if( args[ 1 ] > 0 )
165             fprintf(fout,"     R%1d   := t%-5d",args[1],args[0]);
166          else
167             fprintf(fout,"     %5d(R6)  := t%-5d",-args[1],args[0]);
168          break;
169
170        case 140 :
171          fprintf(fout,"     nop");
172          break;
173
174        case 145 :
175          fprintf(fout,"     sp%-3d.par%02d := t%-5d",args[1],args[2],args[0]);
176          break;
177
178        case 151 :
179          fprintf(fout,"     if not t%-5d  goto L%-4d",args[0],args[1]);
180          break;
181
182        case 152 :
183          fprintf(fout,"     if t%-5d  goto  L%-4d",args[0],args[1]);
184          break;
185
186        case 174 :
187          fprintf(fout,"LASTWILL :");
188          break;
189
190        case 177 :
191          fprintf(fout,"* line  %5d",-args[0]+1);
192          break;
193
194        case 179 :
195          fprintf(fout," Entry point:");
196          break;
197
198        case 181 :
199          fprintf(fout,"L%-4d :",args[0]);
200          break;
201
202        case 182 :
203          fprintf(fout,"     jump  L%-4d",args[0]);
204          break;
205
206        case 184 :
207          fprintf(fout,"BEGIN   M%05d",args[0]);
208          break;
209
210        case 185 :
211          fprintf(fout,"END");
212          break;
213
214        case 191 :
215          fprintf(fout,"     backbl");
216          break;
217
218        case 192 :
219          fprintf(fout,"     backpr");
220          break;
221
222        case 193 :
223          fprintf(fout,"     back");
224          break;
225
226        case 194 :
227          fprintf(fout,"      fin");
228          break;
229
230        case 199 :
231          fprintf(fout,"     iconst t%-5d = %5d",args[0],args[1]);
232          break;
233
234        case 200 :
235          fprintf(fout,"END OF CODE" );
236          break;
237
238        case 201 :
239          fprintf(fout,"     tempvar1  t%-5d",args[0]);
240          break;
241
242        case 202 :
243          fprintf(fout,"     tempvar2  t%-5d",args[0]);
244          break;
245
246        case 203 :
247          fprintf(fout,"     tempvar3  t%-5d",args[0]);
248          break;
249
250        case 204 :
251          fprintf(fout,"     tempvar4  t%-5d",args[0]);
252          break;
253
254        case 205 :
255          fprintf(fout,"     globvar   t%-5d   [ desc = &5d ]",args[0],args[1]);
256          break;
257
258        case 208 :
259          fprintf(fout,"     livevar   t%-5d  := t%-5d",args[0],args[1]);
260          break;
261
262        case 223 :
263        case 224 :
264        case 225 :
265        case 227 :
266          {
267             qcurr=1;
268             makeproclist();
269             fprintf(fout,"     proclist   ");
270          }
271          break;
272
273        default  :
274          for( i=0; i<arg_no; i++ ) fprintf(fout,"     %c = %5d ",'A'+i,args[i]);
275          break;
276
277       }
278
279       fflush(fout);
280
281       fprintf(fout,"\n");
282
283       if( opcode>=172 && opcode<=176  ||  opcode>=178 && opcode<=194 )
284          fprintf(fout,"---------------------------------------------------\n");
285
286       if( opcode == 200 )  break ;      /* end-marker */
287
288    }
289
290    fclose(fout);
291
292 }
293
294 #endif
295