bitfield assignment without using a shift.
SCCS-vsn: old/pcc/ccom.tahoe/local2.c 1.22
-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"
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");