*** empty log message ***
authorem <none@none>
Fri, 26 Jul 1985 11:29:08 +0000 (11:29 +0000)
committerem <none@none>
Fri, 26 Jul 1985 11:29:08 +0000 (11:29 +0000)
mach/ns/ncg/mach.c [new file with mode: 0644]
mach/ns/ncg/mach.h [new file with mode: 0644]

diff --git a/mach/ns/ncg/mach.c b/mach/ns/ncg/mach.c
new file mode 100644 (file)
index 0000000..fd4b55e
--- /dev/null
@@ -0,0 +1,143 @@
+con_part(sz, w)
+       register int    sz;
+       word            w;
+{
+       while (part_size % sz) part_size++;
+
+       if (part_size == TEM_WSIZE)
+               part_flush();
+       if (sz == 1 || sz == 2) {
+               w &= (sz == 1 ? 0xFF : 0xFFFF);
+               w <<= 8 * part_size;
+               part_word |= w;
+       } else {
+               assert(sz == 4);
+               part_word = w;
+       }
+       part_size += sz;
+}
+
+con_mult(sz)
+       word    sz;
+{
+       if (sz != 4)
+               fatal("bad icon/ucon size");
+       fprintf(codefile,".long\t%s\n",str);
+}
+
+#ifdef REGVARS
+full lbytes;
+struct regadm {
+       char *ra_str;
+       long ra_off;
+} regadm[4];
+int n_regvars;
+
+regscore(off,size,typ,score,totyp) long off; {
+
+       /*This function is copied from pdp/ncg
+        */
+       /*
+        * This function is full of magic constants.
+        * They are a result of experimentation.
+        */
+
+       if (size != 2)
+               return(-1);
+       score -= 1;     /* allow for save/restore */
+       if (off>=0)
+               score -= 2;
+       if (typ==reg_pointer)
+               score *= 17;
+       else if (typ==reg_loop)
+               score = 10*score+50;    /* Guestimate */
+       else
+               score *= 10;
+       return(score);  /* 10 * estimated # of words of profit */
+}
+
+i_regsave() {
+
+       n_regvars=0;
+}
+
+f_regsave(){
+       register i;
+
+       fprintf(codefile, "enter [");
+       if (n_regvars>=1){
+               fprintf(codefile,"%s",regadm[0].ra_str);
+               for (i=1; i<n_regvars; i++)
+                       fprintf(codefile,",%s",regadm[0].ra_str);
+       }
+       fprintf(codefile, "], %d\n", lbytes);
+       for (i=0;i<n_regvars;i++)
+               if (regadm[i].ra_off>=0)
+                       fprintf(codefile, "movd %ld(fp), %s",
+                         regadm[i].ra_off, regadm[i].ra_str);
+}
+
+regsave(regstr,off,size) char *regstr; long off; {
+
+       fprintf(codefile,"\t! Local %ld into %s\n",off,regstr);
+       regadm[n_regvars].ra_str = regstr;
+       regadm[n_regvars].ra_off = off;
+       n_regvars++;
+}
+
+regreturn() {
+       register int i;
+
+       fprintf(codefile, "exit [");
+       if (n_regvars>=1){
+               fprintf(codefile,"%s",regadm[0].ra_str);
+               for (i=1; i<n_regvars; i++)
+                       fprintf(codefile,",%s",regadm[0].ra_str);
+       }
+       fprintf(codefile, "]\n");
+}
+
+#endif
+
+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) ;
+                               fprintf(codefile,".define %s\n",argstr) ;
+                               break ;
+                       }
+               }
+       default :
+               while ( getarg(any_ptyp) != sp_cend ) ;
+               break ;
+       }
+}
+
+prolog(nlocals) full nlocals; {
+
+#ifndef REGVARS
+       fprintf(codefile, "enter[], %d\n",nlocals);
+#else
+       lbytes = nlocals;
+#endif
+}
+
+char *segname[] = {
+       ".text",
+       ".data",
+       ".data",
+       ".bss"
+};
+
+con_float() {
+
+       fatal("no reals");
+}
diff --git a/mach/ns/ncg/mach.h b/mach/ns/ncg/mach.h
new file mode 100644 (file)
index 0000000..d270fc5
--- /dev/null
@@ -0,0 +1,22 @@
+#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 hol_off         "%d+hol%d"
+
+#define con_cst(x)      fprintf(codefile,".long\t%d\n",x)
+#define con_ilb(x)      fprintf(codefile,".long\t%s\n",x)
+#define con_dlb(x)      fprintf(codefile,".long\t%s\n",x)
+
+#define id_first        '_'
+#define BSS_INIT        0