From 9beb72e69b1815616e12991a77b54d7c02067f46 Mon Sep 17 00:00:00 2001 From: keie Date: Mon, 7 Jan 1985 13:49:31 +0000 Subject: [PATCH] *** empty log message *** --- mach/i86/cg/mach.c | 111 +++++++++++++++++++++++++++++++++++++++++++++ mach/i86/cg/mach.h | 26 +++++++++++ 2 files changed, 137 insertions(+) create mode 100644 mach/i86/cg/mach.c create mode 100644 mach/i86/cg/mach.h diff --git a/mach/i86/cg/mach.c b/mach/i86/cg/mach.c new file mode 100644 index 000000000..aa1b37ba0 --- /dev/null +++ b/mach/i86/cg/mach.c @@ -0,0 +1,111 @@ +/* + * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. + * + * This product is part of the Amsterdam Compiler Kit. + * + * Permission to use, sell, duplicate or disclose this software must be + * obtained in writing. Requests for such permissions may be sent to + * + * Dr. Andrew S. Tanenbaum + * Wiskundig Seminarium + * Vrije Universiteit + * Postbox 7161 + * 1007 MC Amsterdam + * The Netherlands + * + */ + +/* + * machine dependent back end routines for the Intel 8086 + */ + +con_part(sz,w) register sz; word w; { + + while (part_size % sz) + part_size++; + if (part_size == EM_WSIZE) + part_flush(); + if (sz == 1) { + w &= 0xFF; + if (part_size) + w <<= 8; + part_word |= w; + } else { + assert(sz == 2); + part_word = w; + } + part_size += sz; +} + +con_mult(sz) word sz; { + long l; + + if (sz != 4) + fatal("bad icon/ucon size"); + l = atol(str); + fprintf(codefile,"\t.word %d,%d\n", + (int)l&0xFFFF,(int)(l>>16)&0xFFFF); +} + +con_float() { + register i; + + i= argval ; + if (i!= 4 && i!= 8) + fatal("bad fcon size"); + while ( i ) { + fprintf(codefile," .word 0,0\n") ; + i -=4 ; + } +} + +/* + +string holstr(n) word n; { + + sprintf(str,hol_off,n,holno); + return(mystrcpy(str)); +} +*/ + +prolog(nlocals) full nlocals; { + + fprintf(codefile,"\tpush\tbp\n\tmov\tbp,sp\n"); + switch (nlocals) { + case 4: printf("\tpush\tax\n"); + case 2: printf("\tpush\tax\n"); + case 0: break; + default: + printf("\tsub\tsp,%d\n",nlocals); break; + } + +} + +mes(type) word type ; { + int argt ; + + switch ( (int)type ) { + case ms_ext : + for (;;) { + switch ( argt=getarg( + ptyp(sp_cend)|ptyp(sp_pnam)|sym_ptyp) ) { + case sp_cend : + return ; + default: + strarg(argt) ; + printf(".define %s\n",argstr) ; + break ; + } + } + default : + while ( getarg(any_ptyp) != sp_cend ) ; + break ; + } +} + +char *segname[] = { + ".text", /* SEGTXT */ + ".data", /* SEGCON */ + ".data", /* SEGROM */ + ".bss" /* SEGBSS */ +}; diff --git a/mach/i86/cg/mach.h b/mach/i86/cg/mach.h new file mode 100644 index 000000000..6fd5a83a3 --- /dev/null +++ b/mach/i86/cg/mach.h @@ -0,0 +1,26 @@ +#define ex_ap(y) fprintf(codefile,".extern %s\n",y) +#define in_ap(y) /* nothing */ + +#define newilb(x) fprintf(codefile,"%s:\n",x) +#define newdlb(x) fprintf(codefile,"%s:\n",x) +#define dlbdlb(x,y) fprintf(codefile,"%s = %s\n",x,y) +#define newlbss(l,x) fprintf(codefile,"%s: .space\t%d\n",l,x); + +#define cst_fmt "%d" +#define off_fmt "%d" +#define ilb_fmt "I%03x%x" +#define dlb_fmt "_%d" +#define hol_fmt "hol%d" + +#define loc_off "%d(bp)" +#define arg_off "4+%d(bp)" +#define hol_off "%d+hol%d" + +#define con_cst(x) fprintf(codefile,".word\t%d\n",x) +#define con_ilb(x) fprintf(codefile,".word\t%s\n",x) +#define con_dlb(x) fprintf(codefile,".word\t%s\n",x) + +#define modhead "" + +#define id_first '_' +#define BSS_INIT 0 -- 2.34.1