void eoftn(struct interpass_prolog * ipp) { int i, j; int addto; addto = offcalc(ipp); if (ipp->ipp_ip.ip_lbl == 0) return; /* no code needs to be generated */ /* return from function code */ for (i = ipp->ipp_regs[0], j = 0; i; i >>= 1, j++) { if (i & 1) fprintf(stdout, "\tlw %s,-%d(%s)\n\tnop\n", rnames[j], regoff[j], rnames[FP]); } printf("\taddiu %s,%s,%d\n", rnames[SP], rnames[FP], ARGINIT/SZCHAR); printf("\tlw %s,%d(%s)\n", rnames[RA], 4-ARGINIT/SZCHAR, rnames[SP]); printf("\tlw %s,%d(%s)\n", rnames[FP], 0-ARGINIT/SZCHAR, rnames[SP]); printf("\tjr %s\n", rnames[RA]); printf("\tnop\n"); #ifdef USE_GAS printf("\t.end %s\n", ipp->ipp_name); printf("\t.size %s,.-%s\n", ipp->ipp_name, ipp->ipp_name); #endif }
/* * Print out the prolog assembler. */ void prologue(struct interpass_prolog * ipp) { int addto; int i, j; ftype = ipp->ipp_type; printf("\t.align 2\n"); if (ipp->ipp_vis) printf("\t.globl %s\n", ipp->ipp_name); printf("\t.ent %s\n", ipp->ipp_name); printf("%s:\n", ipp->ipp_name); addto = offcalc(ipp); /* for the moment, just emit this PIC stuff - NetBSD does it */ printf("\t.frame %s,%d,%s\n", rnames[FP], ARGINIT/SZCHAR, rnames[RA]); printf("\t.set noreorder\n"); printf("\t.cpload $25\t# pseudo-op to load GOT ptr into $25\n"); printf("\t.set reorder\n"); printf("\tsubu %s,%s,%d\n", rnames[SP], rnames[SP], ARGINIT/SZCHAR); /* for the moment, just emit PIC stuff - NetBSD does it */ printf("\t.cprestore 8\t# pseudo-op to store GOT ptr at 8(sp)\n"); printf("\tsw %s,4(%s)\n", rnames[RA], rnames[SP]); printf("\tsw %s,(%s)\n", rnames[FP], rnames[SP]); printf("\tmove %s,%s\n", rnames[FP], rnames[SP]); #ifdef notyet /* profiling */ if (pflag) { printf("\t.set noat\n"); printf("\tmove %s,%s\t# save current return address\n", rnames[AT], rnames[RA]); printf("\tsubu %s,%s,8\t# _mcount pops 2 words from stack\n", rnames[SP], rnames[SP]); printf("\tjal %s\n", exname("_mcount")); printf("\tnop\n"); printf("\t.set at\n"); } #endif if (addto) printf("\tsubu %s,%s,%d\n", rnames[SP], rnames[SP], addto); for (i = ipp->ipp_regs[0], j = 0; i; i >>= 1, j++) if (i & 1) fprintf(stdout, "\tsw %s,-%d(%s) # save permanent\n", rnames[j], regoff[j], rnames[FP]); }
void prologue(struct interpass_prolog *ipp) { int addto; ftype = ipp->ipp_type; /* * We here know what registers to save and how much to * add to the stack. */ addto = offcalc(ipp); printf("\t.proc\ncallinfo frame=%d, save_rp, save_sp\n\t.entry\n", addto); prtprolog(ipp, addto); }
void prologue(struct interpass_prolog *ipp) { int addto; ftype = ipp->ipp_type; #ifdef LANG_F77 if (ipp->ipp_vis) printf(" .globl %s\n", ipp->ipp_name); printf(" .align 4\n"); printf("%s:\n", ipp->ipp_name); #endif /* * We here know what register to save and how much to * add to the stack. */ addto = offcalc(ipp); prtprolog(ipp, addto); }