121598Sdist /*
238105Sbostic * Copyright (c) 1983 The Regents of the University of California.
338105Sbostic * All rights reserved.
438105Sbostic *
5*42683Sbostic * %sccs.include.redist.c%
621598Sdist */
79658Slinton
821598Sdist #ifndef lint
9*42683Sbostic static char sccsid[] = "@(#)asm.c 5.4 (Berkeley) 06/01/90";
1038105Sbostic #endif /* not lint */
119658Slinton
129658Slinton /*
139658Slinton * Assembly language dependent symbol routines.
149658Slinton */
159658Slinton
169658Slinton #include "defs.h"
179658Slinton #include "symbols.h"
189658Slinton #include "asm.h"
199658Slinton #include "languages.h"
209658Slinton #include "tree.h"
219658Slinton #include "eval.h"
229658Slinton #include "operators.h"
239658Slinton #include "mappings.h"
249658Slinton #include "process.h"
259658Slinton #include "runtime.h"
269658Slinton #include "machine.h"
279658Slinton
289658Slinton #define isdouble(range) ( \
299658Slinton range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \
309658Slinton )
319658Slinton
329658Slinton /*
339658Slinton * Initialize assembly language information.
349658Slinton */
359658Slinton
asm_init()369658Slinton public asm_init()
379658Slinton {
389658Slinton Language lang;
399658Slinton
409658Slinton lang = language_define("assembler", ".s");
419658Slinton language_setop(lang, L_PRINTDECL, asm_printdecl);
429658Slinton language_setop(lang, L_PRINTVAL, asm_printval);
439658Slinton language_setop(lang, L_TYPEMATCH, asm_typematch);
4418213Slinton language_setop(lang, L_BUILDAREF, asm_buildaref);
4518213Slinton language_setop(lang, L_EVALAREF, asm_evalaref);
4633308Sdonn language_setop(lang, L_MODINIT, asm_modinit);
4716606Ssam language_setop(lang, L_HASMODULES, asm_hasmodules);
4816606Ssam language_setop(lang, L_PASSADDR, asm_passaddr);
499658Slinton }
509658Slinton
519658Slinton /*
529658Slinton * Test if two types are compatible.
539658Slinton */
549658Slinton
asm_typematch(type1,type2)559658Slinton public Boolean asm_typematch(type1, type2)
569658Slinton Symbol type1, type2;
579658Slinton {
589658Slinton Boolean b;
599658Slinton
609658Slinton b = false;
619658Slinton return b;
629658Slinton }
639658Slinton
asm_printdecl(s)649658Slinton public asm_printdecl(s)
659658Slinton Symbol s;
669658Slinton {
679658Slinton switch (s->class) {
6818213Slinton case CONST:
6918213Slinton printf("%s = %d", symname(s), s->symvalue.constval->value.lcon);
7018213Slinton break;
7118213Slinton
729658Slinton case VAR:
739658Slinton case REF:
749658Slinton printf("&%s = 0x%x", symname(s), s->symvalue.offset);
759658Slinton break;
769658Slinton
779658Slinton case PROC:
789658Slinton case FUNC:
799658Slinton printf("%s (0x%x):", symname(s), codeloc(s));
809658Slinton break;
819658Slinton
8218213Slinton case TYPE:
8318213Slinton printf("%s", symname(s));
8418213Slinton break;
8518213Slinton
8618213Slinton case ARRAY:
8718213Slinton printf("$string");
8818213Slinton break;
8918213Slinton
909658Slinton default:
9118213Slinton printf("[%s]", classname(s));
9218213Slinton break;
939658Slinton }
949658Slinton putchar('\n');
959658Slinton }
969658Slinton
979658Slinton /*
989658Slinton * Print out the value on the top of the expression stack
999658Slinton * in the format for the type of the given symbol.
1009658Slinton */
1019658Slinton
asm_printval(s)1029658Slinton public asm_printval(s)
1039658Slinton register Symbol s;
1049658Slinton {
1059658Slinton register Symbol t;
1069658Slinton register Integer len;
1079658Slinton
1089658Slinton switch (s->class) {
1099658Slinton case ARRAY:
1109658Slinton t = rtype(s->type);
1119658Slinton if (t->class == RANGE and istypename(t->type, "$char")) {
1129658Slinton len = size(s);
1139658Slinton sp -= len;
1149658Slinton printf("\"%.*s\"", len, sp);
1159658Slinton } else {
1169658Slinton printarray(s);
1179658Slinton }
1189658Slinton break;
1199658Slinton
1209658Slinton default:
1219658Slinton printf("0x%x", pop(Integer));
1229658Slinton break;
1239658Slinton }
1249658Slinton }
12516606Ssam
12618213Slinton /*
12718213Slinton * Treat subscripting as indirection through pointer to integer.
12818213Slinton */
12918213Slinton
asm_buildaref(a,slist)13018213Slinton public Node asm_buildaref(a, slist)
13118213Slinton Node a, slist;
13218213Slinton {
13318213Slinton Symbol t, eltype;
13418213Slinton Node p, r;
13518213Slinton
13618213Slinton t = rtype(a->nodetype);
13718213Slinton eltype = t->type;
13818213Slinton p = slist->value.arg[0];
13918213Slinton r = build(O_MUL, p, build(O_LCON, (long) size(eltype)));
14018213Slinton r = build(O_ADD, build(O_RVAL, a), r);
14118213Slinton r->nodetype = eltype;
14218213Slinton return r;
14318213Slinton }
14418213Slinton
14518213Slinton /*
14618213Slinton * Evaluate a subscript index. Assumes dimension is [0..n].
14718213Slinton */
14818213Slinton
asm_evalaref(s,base,i)14918213Slinton public asm_evalaref(s, base, i)
15018213Slinton Symbol s;
15118213Slinton Address base;
15218213Slinton long i;
15318213Slinton {
15418213Slinton Symbol t;
15518213Slinton
15618213Slinton t = rtype(s);
15718213Slinton push(long, base + i * size(t->type));
15818213Slinton }
15918213Slinton
asm_modinit(typetable)16033308Sdonn public asm_modinit (typetable)
16133308Sdonn Symbol typetable[];
16233308Sdonn {
16333308Sdonn /* nothing for right now */
16433308Sdonn }
16533308Sdonn
asm_hasmodules()16616606Ssam public boolean asm_hasmodules ()
16716606Ssam {
16816606Ssam return false;
16916606Ssam }
17016606Ssam
asm_passaddr(param,exprtype)17116606Ssam public boolean asm_passaddr (param, exprtype)
17216606Ssam Symbol param, exprtype;
17316606Ssam {
17416606Ssam return false;
17516606Ssam }
176