From 7412b41b4e4994227a84c2de8f8c901517181487 Mon Sep 17 00:00:00 2001 From: Sam Leffler Date: Thu, 23 Jan 1986 08:35:41 -0800 Subject: [PATCH] restrict structure assignments to use movblk's; print address constants using ACONFMT SCCS-vsn: old/pcc/ccom.tahoe/local2.c 1.2 --- usr/src/old/pcc/ccom.tahoe/local2.c | 58 ++++++++++++----------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/usr/src/old/pcc/ccom.tahoe/local2.c b/usr/src/old/pcc/ccom.tahoe/local2.c index 40b991f865..20e5bee4ff 100644 --- a/usr/src/old/pcc/ccom.tahoe/local2.c +++ b/usr/src/old/pcc/ccom.tahoe/local2.c @@ -1,5 +1,5 @@ #ifndef lint -static char sccsid[] = "@(#)local2.c 1.1 (Berkeley) %G%"; +static char sccsid[] = "@(#)local2.c 1.2 (Berkeley) %G%"; #endif # include "mfile2" @@ -304,7 +304,7 @@ zzzcode( p, c ) register NODE *p; { return; case 'F': /* masked constant for fields */ - printf("$%d", (p->in.right->tn.lval&((1<in.right->tn.lval&((1< 65535 ) cerror("structure size <0=0 or >65535"); - - switch(size) { - case 1: - printf(" movb "); - break; - case 2: - printf(" movw "); - break; - case 4: - printf(" movl "); - break; - case 8: - printf(" movl "); - upput(r); - printf(","); - upput(l); - printf("\n movl "); - break; - default: - printf(" movab "); - adrput(l); - printf(",r1\n movab "); - adrput(r); - printf(",r0\n movl $%d,r2\n movblk\n", size); - rname(2); - goto endstasg; + /* + * Can't optimize with movw's or movl's here as + * we don't know the alignment properties of + * either source or destination (governed, potentially + * by alignment of enclosing structure/union). + * (PERHAPS WE COULD SIMULATE dclstruct?) + */ + if (size != 1) { + printf("\tmovab\t"); + adrput(l); + printf(",r1\n\tmovab\t"); + adrput(r); + printf(",r0\n\tmovl\t$%d,r2\n\tmovblk\n", size); + rname(2); + } else { + printf("\tmovb\t"); + adrput(r); + printf(","); + adrput(l); + printf("\n"); } - adrput(r); - printf(","); - adrput(l); - printf("\n"); - endstasg: if( r->in.op == NAME ) r->in.op = ICON; else if( r->in.op == OREG ) r->in.op = REG; @@ -591,8 +580,7 @@ special( p, shape ) register NODE *p; { } adrcon( val ) CONSZ val; { - printf( "$" ); - printf( CONFMT, val ); + printf(ACONFMT, val); } conput( p ) register NODE *p; { -- 2.20.1