1*9658Slinton /* Copyright (c) 1982 Regents of the University of California */ 2*9658Slinton 3*9658Slinton static char sccsid[] = "@(#)@(#)asm.c 1.1 12/15/82"; 4*9658Slinton 5*9658Slinton /* 6*9658Slinton * Assembly language dependent symbol routines. 7*9658Slinton */ 8*9658Slinton 9*9658Slinton #include "defs.h" 10*9658Slinton #include "symbols.h" 11*9658Slinton #include "asm.h" 12*9658Slinton #include "languages.h" 13*9658Slinton #include "tree.h" 14*9658Slinton #include "eval.h" 15*9658Slinton #include "operators.h" 16*9658Slinton #include "mappings.h" 17*9658Slinton #include "process.h" 18*9658Slinton #include "runtime.h" 19*9658Slinton #include "machine.h" 20*9658Slinton 21*9658Slinton #define isdouble(range) ( \ 22*9658Slinton range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \ 23*9658Slinton ) 24*9658Slinton 25*9658Slinton /* 26*9658Slinton * Initialize assembly language information. 27*9658Slinton */ 28*9658Slinton 29*9658Slinton public asm_init() 30*9658Slinton { 31*9658Slinton Language lang; 32*9658Slinton 33*9658Slinton lang = language_define("assembler", ".s"); 34*9658Slinton language_setop(lang, L_PRINTDECL, asm_printdecl); 35*9658Slinton language_setop(lang, L_PRINTVAL, asm_printval); 36*9658Slinton language_setop(lang, L_TYPEMATCH, asm_typematch); 37*9658Slinton } 38*9658Slinton 39*9658Slinton /* 40*9658Slinton * Test if two types are compatible. 41*9658Slinton */ 42*9658Slinton 43*9658Slinton public Boolean asm_typematch(type1, type2) 44*9658Slinton Symbol type1, type2; 45*9658Slinton { 46*9658Slinton Boolean b; 47*9658Slinton 48*9658Slinton b = false; 49*9658Slinton return b; 50*9658Slinton } 51*9658Slinton 52*9658Slinton public asm_printdecl(s) 53*9658Slinton Symbol s; 54*9658Slinton { 55*9658Slinton switch (s->class) { 56*9658Slinton case VAR: 57*9658Slinton case REF: 58*9658Slinton printf("&%s = 0x%x", symname(s), s->symvalue.offset); 59*9658Slinton break; 60*9658Slinton 61*9658Slinton case PROC: 62*9658Slinton case FUNC: 63*9658Slinton printf("%s (0x%x):", symname(s), codeloc(s)); 64*9658Slinton break; 65*9658Slinton 66*9658Slinton default: 67*9658Slinton error("class %s in c_printdecl", classname(s)); 68*9658Slinton } 69*9658Slinton putchar('\n'); 70*9658Slinton } 71*9658Slinton 72*9658Slinton /* 73*9658Slinton * Print out the value on the top of the expression stack 74*9658Slinton * in the format for the type of the given symbol. 75*9658Slinton */ 76*9658Slinton 77*9658Slinton public asm_printval(s) 78*9658Slinton register Symbol s; 79*9658Slinton { 80*9658Slinton register Symbol t; 81*9658Slinton register Integer len; 82*9658Slinton 83*9658Slinton switch (s->class) { 84*9658Slinton case ARRAY: 85*9658Slinton t = rtype(s->type); 86*9658Slinton if (t->class == RANGE and istypename(t->type, "$char")) { 87*9658Slinton len = size(s); 88*9658Slinton sp -= len; 89*9658Slinton printf("\"%.*s\"", len, sp); 90*9658Slinton } else { 91*9658Slinton printarray(s); 92*9658Slinton } 93*9658Slinton break; 94*9658Slinton 95*9658Slinton default: 96*9658Slinton printf("0x%x", pop(Integer)); 97*9658Slinton break; 98*9658Slinton } 99*9658Slinton } 100