+ int size = getSize (operandType (IC_RESULT (ic)));
+ int offset = 0;
+ D(emitcode ("; genReceive",""));
+
+ if (ic->argreg == 1) { /* first parameter */
+ if (isOperandInFarSpace (IC_RESULT (ic)) &&
+ (OP_SYMBOL (IC_RESULT (ic))->isspilt ||
+ IS_TRUE_SYMOP (IC_RESULT (ic)))) {
+
+ regs *tempRegs[4];
+ int receivingA = 0;
+ int roffset = 0;
+
+ for (offset = 0; offset<size; offset++)
+ if (!strcmp (fReturn[offset], "a"))
+ receivingA = 1;
+
+ if (!receivingA)
+ {
+ if (size==1 || getTempRegs(tempRegs, size-1, ic))
+ {
+ for (offset = size-1; offset>0; offset--)
+ emitcode("mov","%s,%s", tempRegs[roffset++]->name, fReturn[offset]);
+ emitcode("mov","a,%s", fReturn[0]);
+ _G.accInUse++;
+ aopOp (IC_RESULT (ic), ic, FALSE);
+ _G.accInUse--;
+ aopPut (AOP (IC_RESULT (ic)), "a", offset,
+ isOperandVolatile (IC_RESULT (ic), FALSE));
+ for (offset = 1; offset<size; offset++)
+ aopPut (AOP (IC_RESULT (ic)), tempRegs[--roffset]->name, offset,
+ isOperandVolatile (IC_RESULT (ic), FALSE));
+ goto release;
+ }
+ }
+ else
+ {
+ if (getTempRegs(tempRegs, size, ic))
+ {
+ for (offset = 0; offset<size; offset++)
+ emitcode("mov","%s,%s", tempRegs[offset]->name, fReturn[offset]);
+ aopOp (IC_RESULT (ic), ic, FALSE);
+ for (offset = 0; offset<size; offset++)
+ aopPut (AOP (IC_RESULT (ic)), tempRegs[offset]->name, offset,
+ isOperandVolatile (IC_RESULT (ic), FALSE));
+ goto release;
+ }
+ }
+
+ offset = fReturnSizeMCS51 - size;
+ while (size--) {
+ emitcode ("push", "%s", (strcmp (fReturn[fReturnSizeMCS51 - offset - 1], "a") ?
+ fReturn[fReturnSizeMCS51 - offset - 1] : "acc"));
+ offset++;
+ }
+ aopOp (IC_RESULT (ic), ic, FALSE);
+ size = AOP_SIZE (IC_RESULT (ic));
+ offset = 0;
+ while (size--) {
+ emitcode ("pop", "acc");
+ aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
+ }
+
+ } else {
+ _G.accInUse++;
+ aopOp (IC_RESULT (ic), ic, FALSE);
+ _G.accInUse--;
+ assignResultValue (IC_RESULT (ic));
+ }
+ } else { /* second receive onwards */
+ int rb1off ;
+ aopOp (IC_RESULT (ic), ic, FALSE);
+ rb1off = ic->argreg;
+ while (size--) {
+ aopPut (AOP (IC_RESULT (ic)), rb1regs[rb1off++ -5], offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
+ }
+ }
+
+release:
+ freeAsmop (IC_RESULT (ic), NULL, ic, TRUE);
+}
+
+/*-----------------------------------------------------------------*/
+/* genDummyRead - generate code for dummy read of volatiles */
+/*-----------------------------------------------------------------*/
+static void
+genDummyRead (iCode * ic)
+{
+ operand *op;
+ int size, offset;
+
+ D(emitcode("; genDummyRead",""));
+
+ op = IC_RIGHT (ic);
+ if (op && IS_SYMOP (op))