From 10ce06ff2bccc18e4757cf040f6ffad1fa3cb8b5 Mon Sep 17 00:00:00 2001 From: em Date: Fri, 18 Jan 1985 15:33:44 +0000 Subject: [PATCH] Routines are called with calls instead of jsb. EM_BSIZE is required to be a constant. --- mach/vax4/cg/mach.c | 241 ++++++++++++++++++++------------------------ 1 file changed, 112 insertions(+), 129 deletions(-) diff --git a/mach/vax4/cg/mach.c b/mach/vax4/cg/mach.c index 7d5a296de..c7077cef6 100644 --- a/mach/vax4/cg/mach.c +++ b/mach/vax4/cg/mach.c @@ -1,6 +1,6 @@ -#ifndef NORCSID +#ifndef lint static char rcsid[] = "$Header$"; -#endif +#endif lint /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * @@ -18,17 +18,23 @@ static char rcsid[] = "$Header$"; * */ -/* Machine dependent back end routines for the VAX using 4-byte words +/* + * Machine dependent back end routines for the VAX using 4-byte words */ -con_part(sz,w) register sz; word w; { - - /* Byte order: | 3 | 2 | 1 | 0 | */ - - /* Align new bytes on boundary of its on size. */ +/* + * Byte order: | 3 | 2 | 1 | 0 | + */ +con_part(sz, w) + register int sz; + word w; +{ + /* + * Align new bytes on boundary of its on size. + */ while (part_size % sz) part_size++; - if (part_size == EM_WSIZE) + if (part_size == TEM_WSIZE) part_flush(); if (sz == 1 || sz == 2) { /* Smaller than a machineword. */ @@ -40,26 +46,30 @@ con_part(sz,w) register sz; word w; { part_word = w; } part_size += sz; -} /* con_part */ - -con_mult(sz) word sz; { +} +con_mult(sz) + word sz; +{ if (sz != 4) fatal("bad icon/ucon size"); fprintf(codefile,".long\t%s\n",str); } -mes(mesno) word mesno ; { +mes(mesno) + word mesno; +{ while (getarg(any_ptyp) != sp_cend ); } -con_float() { - - /* Insert a dot at the right position, if it is not present, +con_float() +{ + /* + * Insert a dot at the right position, if it is not present, * to make the floating point constant acceptable to the assembler. */ - register char * c; - extern char * index(); + register char *c; + extern char *index(); if (argval != 4 && argval != 8) fatal("bad fcon size"); @@ -70,7 +80,8 @@ con_float() { if (index(str,'.') != (char *) 0) { fprintf(codefile,"%s\n",str); - /* There must be a dot after the `e' or - if the `e' is not present - + /* + * There must be a dot after the `e' or - if the `e' is not present - * at the end. */ } else if ((c = index(str,'e')) != (char *) 0) { @@ -78,12 +89,13 @@ con_float() { fprintf(codefile,"%s.e%s\n",str,c--); *c = 'e'; } else fprintf(codefile,"%s.\n",str); -} /* con_float */ +} #ifndef REGVARS -prolog(nlocals) full nlocals; { - - fprintf(codefile,"\tpushl\tfp\n\tmovl\tsp,fp\n"); +prolog(nlocals) + full nlocals; +{ + fprintf(codefile,".word 00\n"); if (nlocals == 0) return; if (nlocals == 4) @@ -94,7 +106,7 @@ prolog(nlocals) full nlocals; { fprintf(codefile,"\tsubl2\t$%ld,sp\n",nlocals); } -#endif REGVARS +#endif not REGVARS char *segname[] = { ".text", /* SEGTXT */ @@ -104,14 +116,17 @@ char *segname[] = { }; #ifdef REGVARS -int EM_BSIZE; /* Difference between AB and LB. */ -static int nlocals; /* Number of local variables. */ +static full nlocals; /* Number of local variables. */ #define NR_REG 8 /* Number of registers. */ #define FIRST_REG 4 #define LAST_REG (FIRST_REG + NR_REG - 1) -prolog(n) { /* Save number of locals. */ +/* + * Save number of locals. + */ +prolog(n) +{ nlocals = n; } @@ -119,42 +134,54 @@ prolog(n) { /* Save number of locals. */ * Structure to store information about the registers to be stored. */ static struct s_reg { - char * sr_str; /* Name of register used. */ - long sr_off; /* Offset from LB. */ - int sr_size;/* Size in bytes. */ + char *sr_str; /* Name of register used. */ + long sr_off; /* Offset from LB. */ + int sr_size; /* Size in bytes. */ } a_reg[NR_REG + 1], *p_reg; -i_regsave() { /* Initialize saving of registers. */ - EM_BSIZE = 0; +/* + * Initialize saving of registers. + */ +i_regsave() +{ p_reg = a_reg; } -regsave(str, off, size) char * str; long off; int size; { - - /* Called for each register to be saved. */ - +/* + * Called for each register to be saved. + * Save the parameters in the struct. + */ +regsave(str, off, size) + char *str; + long off; + int size; +{ p_reg->sr_str = str; p_reg->sr_off = off; (p_reg++)->sr_size = size; fprintf(codefile, "\t# Local %ld, size %d, to register %s\n", off, size, str - ); + ); } -f_regsave() { - - register struct s_reg * p; +/* + * Generate code to save the registers. + */ +f_regsave() +{ + register struct s_reg *p; register int mask; register int i; register int count; mask = 0; count = p_reg - a_reg; + /* + * For each register to be saved, set a bit in the + * mask corresponding to its number. + */ for (p = a_reg; p < p_reg; p++) { - /* For each register to be saved, set a bit in the - * mask corresponding to its number. - */ i = atoi(p->sr_str + 1); if (p->sr_size <= 4) mask |= (1 << i); @@ -163,59 +190,25 @@ f_regsave() { count++; } } - - /* Generate code to save registers. */ - if (count > 2) - fprintf(codefile, "pushr\t$%d\n", mask); - else - for (i = FIRST_REG; i <= LAST_REG; i++) { - /* For all registers that can be used, - * see if it must be saved, and do that as cheap - * as possible. - */ - if (((mask >> i) & 03) == 03) { - fprintf(codefile, "movq\tr%d,-(sp)\n",i); - break; - } else if ((1 << i) & mask) { - if (count == 1) - fprintf(codefile,"pushl\tr%d\n",i); - else - fprintf(codefile,"pushr\t$%d\n",mask); - break; - } - } - - /* Save a word indicating which registers were saved. - * The count uniquely specifies which registers were saved, because - * registers are always allocated consecutively within a class, - * starting from FIRST_REG. I only have one class. + /* + * Now generate code to save registers. + */ + fprintf(codefile, ".word 0%o\n", mask); + /* + * Emit code to initialize parameters in registers. + */ + for (p = a_reg; p < p_reg; p++) + if (p->sr_off >= 0) + fprintf(codefile, + "mov%c\t%ld(ap), %s\n, + p->sr_size == 4 ? 'l' : 'q', + p->sr_off, + p->sr_str + ); + + /* + * Generate room for locals. */ - fprintf(codefile, "pushl\t$%d\n", count); - - /* Compute AB - LB. */ - EM_BSIZE = 4 * count + 12; - - /* Now finish the procedure prolog. */ - fprintf(codefile, "pushl\tfp\nmovl\tsp,fp\n"); - - /* Emit code to initialize parameters in registers. */ - for (p = a_reg; p < p_reg; p++) { - if (p->sr_off >= 0) { - if (p->sr_size == 4) { - fprintf(codefile, - "movl\t%ld(fp),%s\n", - p->sr_off + EM_BSIZE, p->sr_str - ); - } else if (p->sr_size == 8) { - fprintf(codefile, - "movq\t%ld(fp),%s\n", - p->sr_off + EM_BSIZE, p->sr_str - ); - } - } - } - - /* Generate room for locals. */ if (nlocals == 0) return; if (nlocals == 4) @@ -225,46 +218,36 @@ f_regsave() { else fprintf(codefile,"subl2\t$%ld,sp\n",nlocals); -} /* f_regsave */ - -regreturn() { - - fprintf(codefile, "jmp\t.return\n"); -} /* regreturn */ +} -regscore(off, size, typ, score, totyp) long off; { +regreturn() { } - register int i; +regscore(off, size, typ, score, totyp) + long off; + int size, typ, totyp, score; +{ + register int i = score; - i = score; /* Local/parameter is used score times. */ - - /* If the offset doesn't fit in a byte, word-offset is used, + /* + * If the offset doesn't fit in a byte, word-offset is used, * which is one byte more expensive. */ - if (off > 109 || off < -128) i *= 2; /* Word offset. */ - - /* 109: guestimate. We don't know AB -LB yet. - * 109 is the number if there are two registervariables. + if (off > 127 || off < -128) i *= 2; + /* + * Compute cost of initialization for parameters. */ - - /* Compute cost of initialization for parameters. */ - if (off > 109) - i -= 5; - else if (off >= 0) - i -= 4; - - if (typ == reg_pointer) - i += score; /* Sometimes saves an instruction. */ - else if (typ == reg_loop) - i += 5; - - i -= 2; /* Cost of save. */ - - /* Actually the first registers are more expensive, but then - * the following registers are cheaper. + if (off > 127) i -= 5; + else if (off >= 0) i -= 4; + /* + * Storing a pointer in a register sometimes saves an instruction. */ - - return (i); -} /* regscore */ + if (typ == reg_pointer) i += score; + else if (typ == reg_loop) i += 5; + /* + * Now adjust for the saving of the register. + * But this costs no space at all. + */ + return i - 1; +} #endif REGVARS -- 2.34.1