121598Sdist /* 221598Sdist * Copyright (c) 1983 Regents of the University of California. 321598Sdist * All rights reserved. The Berkeley software License Agreement 421598Sdist * specifies the terms and conditions for redistribution. 521598Sdist */ 69658Slinton 721598Sdist #ifndef lint 8*33308Sdonn static char sccsid[] = "@(#)asm.c 5.2 (Berkeley) 01/11/88"; 921598Sdist #endif not lint 109658Slinton 11*33308Sdonn static char rcsid[] = "$Header: asm.c,v 1.2 87/03/25 19:24:09 donn Exp $"; 1218213Slinton 139658Slinton /* 149658Slinton * Assembly language dependent symbol routines. 159658Slinton */ 169658Slinton 179658Slinton #include "defs.h" 189658Slinton #include "symbols.h" 199658Slinton #include "asm.h" 209658Slinton #include "languages.h" 219658Slinton #include "tree.h" 229658Slinton #include "eval.h" 239658Slinton #include "operators.h" 249658Slinton #include "mappings.h" 259658Slinton #include "process.h" 269658Slinton #include "runtime.h" 279658Slinton #include "machine.h" 289658Slinton 299658Slinton #define isdouble(range) ( \ 309658Slinton range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \ 319658Slinton ) 329658Slinton 339658Slinton /* 349658Slinton * Initialize assembly language information. 359658Slinton */ 369658Slinton 379658Slinton public asm_init() 389658Slinton { 399658Slinton Language lang; 409658Slinton 419658Slinton lang = language_define("assembler", ".s"); 429658Slinton language_setop(lang, L_PRINTDECL, asm_printdecl); 439658Slinton language_setop(lang, L_PRINTVAL, asm_printval); 449658Slinton language_setop(lang, L_TYPEMATCH, asm_typematch); 4518213Slinton language_setop(lang, L_BUILDAREF, asm_buildaref); 4618213Slinton language_setop(lang, L_EVALAREF, asm_evalaref); 47*33308Sdonn language_setop(lang, L_MODINIT, asm_modinit); 4816606Ssam language_setop(lang, L_HASMODULES, asm_hasmodules); 4916606Ssam language_setop(lang, L_PASSADDR, asm_passaddr); 509658Slinton } 519658Slinton 529658Slinton /* 539658Slinton * Test if two types are compatible. 549658Slinton */ 559658Slinton 569658Slinton public Boolean asm_typematch(type1, type2) 579658Slinton Symbol type1, type2; 589658Slinton { 599658Slinton Boolean b; 609658Slinton 619658Slinton b = false; 629658Slinton return b; 639658Slinton } 649658Slinton 659658Slinton public asm_printdecl(s) 669658Slinton Symbol s; 679658Slinton { 689658Slinton switch (s->class) { 6918213Slinton case CONST: 7018213Slinton printf("%s = %d", symname(s), s->symvalue.constval->value.lcon); 7118213Slinton break; 7218213Slinton 739658Slinton case VAR: 749658Slinton case REF: 759658Slinton printf("&%s = 0x%x", symname(s), s->symvalue.offset); 769658Slinton break; 779658Slinton 789658Slinton case PROC: 799658Slinton case FUNC: 809658Slinton printf("%s (0x%x):", symname(s), codeloc(s)); 819658Slinton break; 829658Slinton 8318213Slinton case TYPE: 8418213Slinton printf("%s", symname(s)); 8518213Slinton break; 8618213Slinton 8718213Slinton case ARRAY: 8818213Slinton printf("$string"); 8918213Slinton break; 9018213Slinton 919658Slinton default: 9218213Slinton printf("[%s]", classname(s)); 9318213Slinton break; 949658Slinton } 959658Slinton putchar('\n'); 969658Slinton } 979658Slinton 989658Slinton /* 999658Slinton * Print out the value on the top of the expression stack 1009658Slinton * in the format for the type of the given symbol. 1019658Slinton */ 1029658Slinton 1039658Slinton public asm_printval(s) 1049658Slinton register Symbol s; 1059658Slinton { 1069658Slinton register Symbol t; 1079658Slinton register Integer len; 1089658Slinton 1099658Slinton switch (s->class) { 1109658Slinton case ARRAY: 1119658Slinton t = rtype(s->type); 1129658Slinton if (t->class == RANGE and istypename(t->type, "$char")) { 1139658Slinton len = size(s); 1149658Slinton sp -= len; 1159658Slinton printf("\"%.*s\"", len, sp); 1169658Slinton } else { 1179658Slinton printarray(s); 1189658Slinton } 1199658Slinton break; 1209658Slinton 1219658Slinton default: 1229658Slinton printf("0x%x", pop(Integer)); 1239658Slinton break; 1249658Slinton } 1259658Slinton } 12616606Ssam 12718213Slinton /* 12818213Slinton * Treat subscripting as indirection through pointer to integer. 12918213Slinton */ 13018213Slinton 13118213Slinton public Node asm_buildaref(a, slist) 13218213Slinton Node a, slist; 13318213Slinton { 13418213Slinton Symbol t, eltype; 13518213Slinton Node p, r; 13618213Slinton 13718213Slinton t = rtype(a->nodetype); 13818213Slinton eltype = t->type; 13918213Slinton p = slist->value.arg[0]; 14018213Slinton r = build(O_MUL, p, build(O_LCON, (long) size(eltype))); 14118213Slinton r = build(O_ADD, build(O_RVAL, a), r); 14218213Slinton r->nodetype = eltype; 14318213Slinton return r; 14418213Slinton } 14518213Slinton 14618213Slinton /* 14718213Slinton * Evaluate a subscript index. Assumes dimension is [0..n]. 14818213Slinton */ 14918213Slinton 15018213Slinton public asm_evalaref(s, base, i) 15118213Slinton Symbol s; 15218213Slinton Address base; 15318213Slinton long i; 15418213Slinton { 15518213Slinton Symbol t; 15618213Slinton 15718213Slinton t = rtype(s); 15818213Slinton push(long, base + i * size(t->type)); 15918213Slinton } 16018213Slinton 161*33308Sdonn public asm_modinit (typetable) 162*33308Sdonn Symbol typetable[]; 163*33308Sdonn { 164*33308Sdonn /* nothing for right now */ 165*33308Sdonn } 166*33308Sdonn 16716606Ssam public boolean asm_hasmodules () 16816606Ssam { 16916606Ssam return false; 17016606Ssam } 17116606Ssam 17216606Ssam public boolean asm_passaddr (param, exprtype) 17316606Ssam Symbol param, exprtype; 17416606Ssam { 17516606Ssam return false; 17616606Ssam } 177