19658Slinton /* Copyright (c) 1982 Regents of the University of California */ 29658Slinton 3*18213Slinton static char sccsid[] = "@(#)asm.c 1.4 (Berkeley) 03/01/85"; 49658Slinton 5*18213Slinton static char rcsid[] = "$Header: asm.c,v 1.5 84/12/26 10:38:19 linton Exp $"; 6*18213Slinton 79658Slinton /* 89658Slinton * Assembly language dependent symbol routines. 99658Slinton */ 109658Slinton 119658Slinton #include "defs.h" 129658Slinton #include "symbols.h" 139658Slinton #include "asm.h" 149658Slinton #include "languages.h" 159658Slinton #include "tree.h" 169658Slinton #include "eval.h" 179658Slinton #include "operators.h" 189658Slinton #include "mappings.h" 199658Slinton #include "process.h" 209658Slinton #include "runtime.h" 219658Slinton #include "machine.h" 229658Slinton 239658Slinton #define isdouble(range) ( \ 249658Slinton range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \ 259658Slinton ) 269658Slinton 279658Slinton /* 289658Slinton * Initialize assembly language information. 299658Slinton */ 309658Slinton 319658Slinton public asm_init() 329658Slinton { 339658Slinton Language lang; 349658Slinton 359658Slinton lang = language_define("assembler", ".s"); 369658Slinton language_setop(lang, L_PRINTDECL, asm_printdecl); 379658Slinton language_setop(lang, L_PRINTVAL, asm_printval); 389658Slinton language_setop(lang, L_TYPEMATCH, asm_typematch); 39*18213Slinton language_setop(lang, L_BUILDAREF, asm_buildaref); 40*18213Slinton language_setop(lang, L_EVALAREF, asm_evalaref); 4116606Ssam language_setop(lang, L_HASMODULES, asm_hasmodules); 4216606Ssam language_setop(lang, L_PASSADDR, asm_passaddr); 439658Slinton } 449658Slinton 459658Slinton /* 469658Slinton * Test if two types are compatible. 479658Slinton */ 489658Slinton 499658Slinton public Boolean asm_typematch(type1, type2) 509658Slinton Symbol type1, type2; 519658Slinton { 529658Slinton Boolean b; 539658Slinton 549658Slinton b = false; 559658Slinton return b; 569658Slinton } 579658Slinton 589658Slinton public asm_printdecl(s) 599658Slinton Symbol s; 609658Slinton { 619658Slinton switch (s->class) { 62*18213Slinton case CONST: 63*18213Slinton printf("%s = %d", symname(s), s->symvalue.constval->value.lcon); 64*18213Slinton break; 65*18213Slinton 669658Slinton case VAR: 679658Slinton case REF: 689658Slinton printf("&%s = 0x%x", symname(s), s->symvalue.offset); 699658Slinton break; 709658Slinton 719658Slinton case PROC: 729658Slinton case FUNC: 739658Slinton printf("%s (0x%x):", symname(s), codeloc(s)); 749658Slinton break; 759658Slinton 76*18213Slinton case TYPE: 77*18213Slinton printf("%s", symname(s)); 78*18213Slinton break; 79*18213Slinton 80*18213Slinton case ARRAY: 81*18213Slinton printf("$string"); 82*18213Slinton break; 83*18213Slinton 849658Slinton default: 85*18213Slinton printf("[%s]", classname(s)); 86*18213Slinton break; 879658Slinton } 889658Slinton putchar('\n'); 899658Slinton } 909658Slinton 919658Slinton /* 929658Slinton * Print out the value on the top of the expression stack 939658Slinton * in the format for the type of the given symbol. 949658Slinton */ 959658Slinton 969658Slinton public asm_printval(s) 979658Slinton register Symbol s; 989658Slinton { 999658Slinton register Symbol t; 1009658Slinton register Integer len; 1019658Slinton 1029658Slinton switch (s->class) { 1039658Slinton case ARRAY: 1049658Slinton t = rtype(s->type); 1059658Slinton if (t->class == RANGE and istypename(t->type, "$char")) { 1069658Slinton len = size(s); 1079658Slinton sp -= len; 1089658Slinton printf("\"%.*s\"", len, sp); 1099658Slinton } else { 1109658Slinton printarray(s); 1119658Slinton } 1129658Slinton break; 1139658Slinton 1149658Slinton default: 1159658Slinton printf("0x%x", pop(Integer)); 1169658Slinton break; 1179658Slinton } 1189658Slinton } 11916606Ssam 120*18213Slinton /* 121*18213Slinton * Treat subscripting as indirection through pointer to integer. 122*18213Slinton */ 123*18213Slinton 124*18213Slinton public Node asm_buildaref(a, slist) 125*18213Slinton Node a, slist; 126*18213Slinton { 127*18213Slinton Symbol t, eltype; 128*18213Slinton Node p, r; 129*18213Slinton 130*18213Slinton t = rtype(a->nodetype); 131*18213Slinton eltype = t->type; 132*18213Slinton p = slist->value.arg[0]; 133*18213Slinton r = build(O_MUL, p, build(O_LCON, (long) size(eltype))); 134*18213Slinton r = build(O_ADD, build(O_RVAL, a), r); 135*18213Slinton r->nodetype = eltype; 136*18213Slinton return r; 137*18213Slinton } 138*18213Slinton 139*18213Slinton /* 140*18213Slinton * Evaluate a subscript index. Assumes dimension is [0..n]. 141*18213Slinton */ 142*18213Slinton 143*18213Slinton public asm_evalaref(s, base, i) 144*18213Slinton Symbol s; 145*18213Slinton Address base; 146*18213Slinton long i; 147*18213Slinton { 148*18213Slinton Symbol t; 149*18213Slinton 150*18213Slinton t = rtype(s); 151*18213Slinton push(long, base + i * size(t->type)); 152*18213Slinton } 153*18213Slinton 15416606Ssam public boolean asm_hasmodules () 15516606Ssam { 15616606Ssam return false; 15716606Ssam } 15816606Ssam 15916606Ssam public boolean asm_passaddr (param, exprtype) 16016606Ssam Symbol param, exprtype; 16116606Ssam { 16216606Ssam return false; 16316606Ssam } 164