Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83; site umcp-cs.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!think!harvard!seismo!umcp-cs!chris From: chris@umcp-cs.UUCP (Chris Torek) Newsgroups: net.bugs.4bsd Subject: Re: /lib/c2 optimizes calls instructions Message-ID: <1326@umcp-cs.UUCP> Date: Thu, 22-Aug-85 01:58:56 EDT Article-I.D.: umcp-cs.1326 Posted: Thu Aug 22 01:58:56 1985 Date-Received: Sat, 24-Aug-85 17:31:12 EDT References: <2064@ukma.UUCP> Organization: U of Maryland, Computer Science Dept., College Park, MD Lines: 127 >Index: /lib/c2, BRL-Unix release 3, likely appears in other 4.?BSD. >Problem: Calls instructions have a format "calls ,". > The argument will sometimes be "optimized" into > a register reference. This isn't necessary, and breaks the > massager which helps create the code in the kernel. It saves a little teensy bit of time. Anyway, here's how to work around it. I added a new flag to /lib/c2 (-c) but it should be obvious how to make it always do what -c does. First, change /usr/src/lib/c2/c20.c to handle "-c". (Beware, these are to what amounts to the 4.3BSD c2; your code may vary slightly.) RCS file: RCS/c20.c,v retrieving revision 1.1 diff -c2 -r1.1 c20.c *** /tmp/,RCSt1015521 Thu Aug 22 01:45:07 1985 --- c20.c Thu Aug 22 01:44:13 1985 *************** *** 15,18 caddr_t sbrk(); int ioflag; int fflag; long isn = 2000000; --- 15,19 ----- caddr_t sbrk(); int ioflag; + int cflag; int fflag; long isn = 2000000; *************** *** 57,60 if ((*argv)[1]=='i') ioflag++; else if ((*argv)[1]=='f') fflag++; else nflag++; } else if (infound==0) { --- 58,62 ----- if ((*argv)[1]=='i') ioflag++; else if ((*argv)[1]=='f') fflag++; + else if ((*argv)[1]=='c') cflag++; else nflag++; } else if (infound==0) { Second, modify the optimizer code in /usr/src/lib/c2/c21.c to check cflag before optimizing "calls" constants. This also includes a fix from Donn Seeley for a longstanding fencepost error: RCS file: RCS/c21.c,v retrieving revision 1.1 diff -c2 -r1.1 c21.c *** /tmp/,RCSt1015526 Thu Aug 22 01:45:24 1985 --- c21.c Thu Aug 22 01:44:49 1985 *************** *** 14,17 #define NUSE 6 int ioflag; int biti[NUSE] = {1,2,4,8,16,32}; int bitsize[] = { /* index by type codes */ --- 14,18 ----- #define NUSE 6 int ioflag; + int cflag; int biti[NUSE] = {1,2,4,8,16,32}; int bitsize[] = { /* index by type codes */ *************** *** 509,512 break; /* .rx,.rx,.rx */ case PROBER: --- 510,521 ----- break; + /* .rx,.rx */ + case CALLS: + if (cflag) /* don't optimize constants in calls */ + break; + /* fall through */ + case MTPR: + case CMP: + case BIT: /* .rx,.rx,.rx */ case PROBER: *************** *** 514,522 case CASE: case MOVC3: - /* .rx,.rx */ - case MTPR: - case CALLS: - case CMP: - case BIT: splitrand(p); /* fool repladdr into doing right number of operands */ --- 523,526 ----- case CASE: case MOVC3: splitrand(p); /* fool repladdr into doing right number of operands */ *************** *** 724,728 if (!equstr(regs[RT3],"-(sp)")) p->combop=T(MOVA,BYTE); else {p->combop=T(PUSHA,BYTE); *cp2=0;} ! if (uses[r]==0) {uses[r]=p; regs[r][0]=OPX<<4;} p->pop=0; } --- 728,735 ----- if (!equstr(regs[RT3],"-(sp)")) p->combop=T(MOVA,BYTE); else {p->combop=T(PUSHA,BYTE); *cp2=0;} ! if (r < NUSE && uses[r] == 0) { ! uses[r]=p; ! regs[r][0]=OPX<<4; ! } p->pop=0; } -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 4251) UUCP: seismo!umcp-cs!chris CSNet: chris@umcp-cs ARPA: chris@maryland