-/*-----------------------------------------------------------------*/
-/* gen51AggregateAssign - copy complete array's or structures */
-/*-----------------------------------------------------------------*/
-void gen51AggregateAssign(iCode *ic) {
- operand *left=IC_LEFT(ic);
- operand *right=IC_RIGHT(ic);
- char *fromName=OP_SYMBOL(right)->rname;
- char *toName=OP_SYMBOL(left)->rname;
- int fromSize=getSize(OP_SYMBOL(right)->type);
- int toSize=getSize(OP_SYMBOL(left)->type);
- int count=toSize;
-
- D(emitcode (";", "gen51AggregateAssign"));
-
- if (SPEC_OCLS(OP_SYMBOL(left)->etype)!=xdata ||
- SPEC_OCLS(OP_SYMBOL(right)->etype)!=code) {
- // well, this code isn't used yet from anywhere else as for initialising
- fprintf (stderr, "*** error: %s:%d can only assign aggregates from cseg to xseg for now\n", ic->filename, ic->lineno);
- exit (457);
- }
-
- if (fromSize!=toSize) {
- fprintf (stderr, "*** error: %s:%d aggregates have different size\n",
- ic->filename, ic->lineno);
- exit (821);
- }
-
-#if 1
- // use the generic memcpy() for now
- emitcode (";", "initialize %s", OP_SYMBOL(IC_LEFT(ic))->name);
- emitcode ("mov", "dptr,#_memcpy_PARM_2");
- emitcode ("mov", "a,#%s", fromName);
- emitcode ("movx", "@dptr,a");
- emitcode ("inc", "dptr");
- emitcode ("mov", "a,#(%s>>8)", fromName);
- emitcode ("movx", "@dptr,a");
- emitcode ("inc", "dptr");
- emitcode ("mov", "a,#%02x; only from cseg for now", 2);
- emitcode ("movx", "@dptr,a");
- emitcode ("mov", "dptr,#_memcpy_PARM_3");
- emitcode ("mov", "a,#(%d>>0); number of bytes", count);
- emitcode ("movx", "@dptr,a");
- emitcode ("inc", "dptr");
- emitcode ("mov", "a,#(%d>>8)", count);
- emitcode ("movx", "@dptr,a");
- emitcode ("mov", "dptr,#%s", toName);
- emitcode ("mov", "b,#%02x; only to xseg for now", 1);
- emitcode ("lcall", "_memcpy");
-#else
- // more efficient, but will require the native_memcpy_cs2xs
- emitcode ("mov", "r0,#%s", fromName);
- emitcode ("mov", "r1,#(%s>>8)", fromName);
- emitcode ("mov", "r2,#%s", toName);
- emitcode ("mov", "r3,#(%s>>8)", toName);
- emitcode ("mov", "r4,#%d", count);
- emitcode ("mov", "r5,#(%d>>8)", count);
- emitcode ("lcall", "_native_memcpy_cs2xs");
-#endif
-}
-