- }
- else if( p->in.op == STARG ){ /* store an arg into a temporary */
- l = getlr( p, '3' );
- r = p->in.left;
- }
- else cerror( "STASG bad" );
-
- if( r->in.op == ICON ) r->in.op = NAME;
- else if( r->in.op == REG ) r->in.op = OREG;
- else if( r->in.op != OREG ) cerror( "STASG-r" );
-
- size = p->stn.stsize;
-
- if( size <= 0 || size > 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;
- }
- 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;
+#define MOVB(dst, src, off) { \
+ printf("\tmovb\t"); upput(src, off); putchar(','); \
+ upput(dst, off); putchar('\n'); \
+}
+#define MOVW(dst, src, off) { \
+ printf("\tmovw\t"); upput(src, off); putchar(','); \
+ upput(dst, off); putchar('\n'); \
+}
+#define MOVL(dst, src, off) { \
+ printf("\tmovl\t"); upput(src, off); putchar(','); \
+ upput(dst, off); putchar('\n'); \
+}
+/*
+ * Generate code for a structure assignment.
+ */
+stasg(p)
+ register NODE *p;
+{
+ register NODE *l, *r;
+ register int size;