1*21598Sdist /* 2*21598Sdist * Copyright (c) 1983 Regents of the University of California. 3*21598Sdist * All rights reserved. The Berkeley software License Agreement 4*21598Sdist * specifies the terms and conditions for redistribution. 5*21598Sdist */ 69658Slinton 7*21598Sdist #ifndef lint 8*21598Sdist static char sccsid[] = "@(#)asm.c 5.1 (Berkeley) 05/31/85"; 9*21598Sdist #endif not lint 109658Slinton 1118213Slinton static char rcsid[] = "$Header: asm.c,v 1.5 84/12/26 10:38:19 linton 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); 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 559658Slinton public Boolean asm_typematch(type1, type2) 569658Slinton Symbol type1, type2; 579658Slinton { 589658Slinton Boolean b; 599658Slinton 609658Slinton b = false; 619658Slinton return b; 629658Slinton } 639658Slinton 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 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 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 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 16016606Ssam public boolean asm_hasmodules () 16116606Ssam { 16216606Ssam return false; 16316606Ssam } 16416606Ssam 16516606Ssam public boolean asm_passaddr (param, exprtype) 16616606Ssam Symbol param, exprtype; 16716606Ssam { 16816606Ssam return false; 16916606Ssam } 170