utah rcsid 1.13 87/05/02 15:50:50: Add ZI feature -- generate result of
authorDonn Seeley <donn@ucbvax.Berkeley.EDU>
Fri, 11 Dec 1987 14:55:45 +0000 (06:55 -0800)
committerDonn Seeley <donn@ucbvax.Berkeley.EDU>
Fri, 11 Dec 1987 14:55:45 +0000 (06:55 -0800)
bitfield assignment without using a shift.

SCCS-vsn: old/pcc/ccom.tahoe/local2.c 1.22

usr/src/old/pcc/ccom.tahoe/local2.c

index 43fc3bf..382b2b0 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)local2.c   1.21 (Berkeley) %G%";
+static char sccsid[] = "@(#)local2.c   1.22 (Berkeley) %G%";
 #endif
 
 # include "pass2.h"
 #endif
 
 # include "pass2.h"
@@ -316,6 +316,25 @@ zzzcode( p, c ) register NODE *p; {
                printf(ACONFMT, (p->in.right->tn.lval&((1<<fldsz)-1))<<fldshf);
                return;
 
                printf(ACONFMT, (p->in.right->tn.lval&((1<<fldsz)-1))<<fldshf);
                return;
 
+       case 'I':       /* produce value of bitfield assignment */
+                       /* avoid shifts -- shifts are SLOW on this machine */
+               {
+                       register NODE *r = p->in.right;
+                       if(r->in.op == ICON && r->tn.name[0] == '\0') {
+                               putstr("movl\t");
+                               printf(ACONFMT, r->tn.lval & ((1<<fldsz)-1));
+                               }
+                       else {
+                               putstr("andl3\t");
+                               printf(ACONFMT, (1 << fldsz) - 1);
+                               putchar(',');
+                               adrput(r);
+                               }
+                       putchar(',');
+                       adrput(resc);
+                       break;
+                       }
+
        case 'H':       /* opcode for shift */
                if(p->in.op == LS || p->in.op == ASG LS)
                        putstr("shll");
        case 'H':       /* opcode for shift */
                if(p->in.op == LS || p->in.op == ASG LS)
                        putstr("shll");