19658Slinton /* Copyright (c) 1982 Regents of the University of California */ 29658Slinton 3*9684Slinton static char sccsid[] = "@(#)asm.c 1.2 12/15/82"; 49658Slinton 59658Slinton /* 69658Slinton * Assembly language dependent symbol routines. 79658Slinton */ 89658Slinton 99658Slinton #include "defs.h" 109658Slinton #include "symbols.h" 119658Slinton #include "asm.h" 129658Slinton #include "languages.h" 139658Slinton #include "tree.h" 149658Slinton #include "eval.h" 159658Slinton #include "operators.h" 169658Slinton #include "mappings.h" 179658Slinton #include "process.h" 189658Slinton #include "runtime.h" 199658Slinton #include "machine.h" 209658Slinton 219658Slinton #define isdouble(range) ( \ 229658Slinton range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \ 239658Slinton ) 249658Slinton 259658Slinton /* 269658Slinton * Initialize assembly language information. 279658Slinton */ 289658Slinton 299658Slinton public asm_init() 309658Slinton { 319658Slinton Language lang; 329658Slinton 339658Slinton lang = language_define("assembler", ".s"); 349658Slinton language_setop(lang, L_PRINTDECL, asm_printdecl); 359658Slinton language_setop(lang, L_PRINTVAL, asm_printval); 369658Slinton language_setop(lang, L_TYPEMATCH, asm_typematch); 379658Slinton } 389658Slinton 399658Slinton /* 409658Slinton * Test if two types are compatible. 419658Slinton */ 429658Slinton 439658Slinton public Boolean asm_typematch(type1, type2) 449658Slinton Symbol type1, type2; 459658Slinton { 469658Slinton Boolean b; 479658Slinton 489658Slinton b = false; 499658Slinton return b; 509658Slinton } 519658Slinton 529658Slinton public asm_printdecl(s) 539658Slinton Symbol s; 549658Slinton { 559658Slinton switch (s->class) { 569658Slinton case VAR: 579658Slinton case REF: 589658Slinton printf("&%s = 0x%x", symname(s), s->symvalue.offset); 599658Slinton break; 609658Slinton 619658Slinton case PROC: 629658Slinton case FUNC: 639658Slinton printf("%s (0x%x):", symname(s), codeloc(s)); 649658Slinton break; 659658Slinton 669658Slinton default: 679658Slinton error("class %s in c_printdecl", classname(s)); 689658Slinton } 699658Slinton putchar('\n'); 709658Slinton } 719658Slinton 729658Slinton /* 739658Slinton * Print out the value on the top of the expression stack 749658Slinton * in the format for the type of the given symbol. 759658Slinton */ 769658Slinton 779658Slinton public asm_printval(s) 789658Slinton register Symbol s; 799658Slinton { 809658Slinton register Symbol t; 819658Slinton register Integer len; 829658Slinton 839658Slinton switch (s->class) { 849658Slinton case ARRAY: 859658Slinton t = rtype(s->type); 869658Slinton if (t->class == RANGE and istypename(t->type, "$char")) { 879658Slinton len = size(s); 889658Slinton sp -= len; 899658Slinton printf("\"%.*s\"", len, sp); 909658Slinton } else { 919658Slinton printarray(s); 929658Slinton } 939658Slinton break; 949658Slinton 959658Slinton default: 969658Slinton printf("0x%x", pop(Integer)); 979658Slinton break; 989658Slinton } 999658Slinton } 100