1 /* Loglan82 Compiler&Interpreter
2 Copyright (C) 1993 Institute of Informatics, University of Warsaw
3 Copyright (C) 1993, 1994 LITA, Pau
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.
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.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 contacts: Andrzej.Salwicki@univ-pau.fr
22 LITA Departement d'Informatique
24 Avenue de l'Universite
26 tel. ++33 59923154 fax. ++33 59841696
28 =======================================================================
43 /** Execute one L-code instruction */
49 virtaddr virt1, virt2, virt3;
53 openrc(a3, &virt2, &t2);
59 storevirt(thisp->backobj, a1);
64 /* skip the address */
66 raise_signal(a3, M[ic - 1], &t1, &t2);
72 openobj(M[a3], &t1, &t2);
79 slopen(M[a3 + APREF], &virt3, &t1, &t2);
85 virt1.addr = M[display2 + a2];
86 virt1.mark = M[virt1.addr + 1];
93 M[a1] = M[prototype[t1]->virtlist + a3];
102 M[a1] = param[a3].xword;
106 MR(a1) = param[a3].xreal;
110 storevirt(param[a3].xvirt, a1);
125 if (member(&virt2, &t1)) {
126 switch ((int) M[t1 + PROTNUM]) {
137 M[a1] = (M[t1 + 2 ] + 3) / t2;
146 if (member(&virt2, &t1)) {
147 switch ((int) M[t1 + PROTNUM]) {
158 M[a1] = (M[t1 + 2] + M[t1]) / t2 - 1;
165 typep(M[a2], a3, &virt1.addr, &virt1.mark);
166 storevirt(virt1, a1);
171 copy(&virt2, &virt1);
172 storevirt(virt1, a1);
178 /* LRCVAVIRT */ /* recover virtual address from ah */
181 virt1.mark = M[virt1.addr + 1];
182 storevirt(virt1, a1);
187 M[a1] = M[prototype[M[temporary]]->virtlist + a2];
193 /* fprintf(stderr, "co ja tu robie?"); */
195 if (!member(&virt2, &M[a1]))
201 M[a1] = absolute(t2);
221 M[a1] = t2 + M[prototype[M[t2 + PROTNUM]]->parlist + a3];
228 t2 = t1 + loadt(M[M[a2]], a3);
230 storevirt(virt1, a1);
235 M[a1] = lbool(is(&virt2, a3));
240 M[a1] = lbool(inl(&virt2, a3));
245 if (member(&virt2, &M[a1]))
252 M[a1] = (word)(MR(a2));
256 MR(a1) = (real)(M[a2]);
265 storevirt(virt1, a1);
268 WARNING: these areas may overlap! */
274 WARNING: these areas may overlap!*/
276 /* MACHINE DEPENDENT */
279 storevirt(virt1, a1);
284 M[a1] = lbool(M[a2 + 1] != M[M[a2] + 1]);
288 M[a1] = lbool(M[a2+1] == M[M[a2] + 1]);
291 /* modify the formal type */
294 /* number of "arrayof" */
296 storevirt(virt1, a1);
300 M[a1] = M[a2] | M[a3];
304 M[a1] = M[a2] & M[a3];
311 if (member(&virt2, &t2)) {
313 t1 = M[a3] - M[t2 + 2];
314 if (t1 < 3 || t1 >= M[t2])
326 /* physical address */
328 M[a1] = t1 + M[a3] - M[t1 + 2];
332 M[a1] = lbool(M[a2] == M[a3]);
336 M[a1] = lbool(M[a2] != M[a3]);
340 M[a1] = lbool(M[a2] < M[a3]);
344 M[a1] = lbool(M[a2] <= M[a3]);
348 M[a1] = lbool(M[a2] > M[a3]);
352 M[a1] = lbool(M[a2] >= M[a3]);
358 storevirt(virt2, a1);
363 M[a1] = M[a2] + M[a3];
371 M[a1] = M[a2] * M[a3];
375 M[a1] = shift(M[a2], M[a3]);
378 case 117:/* LIDIVE */
382 M[a1] = M[a2] / M[a3];
389 M[a1] = M[a2] % M[a3];
393 MR(a1) = MR(a2) + MR(a3);
397 MR(a1) = MR(a2) - MR(a3);
401 MR(a1) = MR(a2) * MR(a3);
405 if (MR(a3) == (real)0.0)
408 MR(a1) = MR(a2) / MR(a3);
414 if (member(&virt2, &t1))
415 M[a1] = lbool(member(&virt3, &t2) && t1 == t2);
417 M[a1] = lbool(!member(&virt3, &t2));
423 if (member(&virt2, &t1))
424 M[a1] = lbool(!member(&virt3, &t2) || t1 != t2);
426 M[a1] = lbool(member(&virt3, &t2));
430 M[a1] = lbool(MR(a2) == MR(a3));
434 M[a1] = lbool(MR(a2) != MR(a3));
438 M[a1] = lbool(MR(a2) < MR(a3));
442 M[a1] = lbool(MR(a2) <= MR(a3));
446 M[a1] = lbool(MR(a2) > MR(a3));
450 M[a1] = lbool(MR(a2) >= MR(a3));
454 M[a1] = M[a2] ^ M[a3];
459 /* reschedule forced so alarm may be switched off */
477 param[a3].xword = M[a1];
486 loadvirt(param[a3].xvirt, a1);
490 param[a3].xreal = MR(a1);
525 /* right side type */
527 typed(virt1.addr, virt1.mark, virt3.addr, virt3.mark, &virt2);
539 goloc(thisp->blck1, thisp->blck2);
543 disp(&thisp->backobj);
555 backhd(&thisp->backobj, &M[temporary]);
563 openobj(a1, &thisp->blck1, &thisp->blck2);
576 backbl(&thisp->backobj, &M[temporary]);
580 /* backpr(&thisp->backobj, &M[temporary]); */
581 back(&thisp->backobj, &M[temporary], (word) 0);
585 back(&thisp->backobj, &M[temporary], (word) 0);
589 fin(ic - APOPCODE, &thisp->backobj, &M[temporary]);
593 /* a2 = address of case description : */
594 /* minimal value, number of branches, */
595 /* remaining branches followed by "otherwise" code */
596 /* in 0..number of branches-1 */
598 if (t1 < 0 || t1 >= M[a2 + 1])
600 ic = a2 + 2 + M[a2 + 1];
616 disp(&thisp->template);
620 for (i = 0; i < a1; i++)
621 enable(thispix, virtprot(M[ic++]));
622 evaluaterpc(thispix);
626 for (i = 0; i < a1; i++)
627 disable(thispix, virtprot(M[ic++]));
640 back(&thisp->backobj, &M[temporary], a1);