int nArgs, int rent)
{
symbol *sym;
- int argStack = 0;
/* create the symbol */
sym = newSymbol (name, 0);
while (nArgs--)
{
- argStack += getSize (type);
args->type = copyLinkChain (argType);
args->etype = getSpec (args->type);
if (!nArgs)
/* save it */
addSymChain (sym);
sym->cdef = 1;
- sym->argStack = (rent ? argStack : 0);
allocVariables (sym);
return sym;
nic->filename = ic->filename;
nic->block = ic->block;
nic->level = ic->level;
+ nic->parmBytes = ic->parmBytes;
/* deal with the special cases first */
switch (ic->op)
nop->noSpilLoc = op->noSpilLoc;
nop->usesDefs = op->usesDefs;
nop->isParm = op->isParm;
- nop->parmBytes = op->parmBytes;
return nop;
}
nop->noSpilLoc = op->noSpilLoc;
nop->usesDefs = op->usesDefs;
nop->isParm = op->isParm;
- nop->parmBytes = op->parmBytes;
switch (nop->type)
{
op->key = sym->key;
op->isvolatile = isOperandVolatile (op, TRUE);
op->isGlobal = isOperandGlobal (op);
- op->parmBytes = sym->argStack;
return op;
}
geniCodeParms (parms, &stack, getSpec (operandType (left)), OP_SYMBOL (left));
/* now call : if symbol then pcall */
- if (IS_ITEMP (left))
+ if (IS_OP_POINTER (left))
ic = newiCode (PCALL, left, NULL);
else
ic = newiCode (CALL, left, NULL);
ADDTOCHAIN (ic);
/* stack adjustment after call */
- left->parmBytes = stack;
+ ic->parmBytes = stack;
return result;
}
unsigned int noSpilLoc:1; /* cannot be assigned a spil location */
unsigned key;
- int parmBytes;
union
{
struct symbol *symOperand; /* operand is of type symbol */
int lineno; /* file & lineno for debug information */
char *filename;
+
+ int parmBytes; /* if call/pcall, count of parameter bytes
+ on stack */
}
iCode;
while (val)
{
SPEC_REGPARM (val->etype) = 1;
- sym->argStack -= getSize (val->type);
val = val->next;
}
}
int liveTo; /* live to sequence number */
int used; /* no. of times this was used */
int recvSize; /* size of first argument */
- int argStack; /* stacks used by parameters */
-
}
symbol;
}
/* adjust the stack for parameters if required */
- if (IC_LEFT (ic)->parmBytes) {
- if (IC_LEFT (ic)->parmBytes > 63) {
- emitcode ("sbiw", "r28,%d", IC_LEFT (ic)->parmBytes);
+ if (ic->parmBytes) {
+ if (ic->parmBytes > 63) {
+ emitcode ("sbiw", "r28,%d", ic->parmBytes);
}
else {
emitcode ("subi", "r28,lo8(%d)",
- IC_LEFT (ic)->parmBytes);
+ ic->parmBytes);
emitcode ("sbci", "r29,hi8(%d)",
- IC_LEFT (ic)->parmBytes);
+ ic->parmBytes);
}
}
/* adjust the stack for parameters if
required */
- if (IC_LEFT (ic)->parmBytes) {
+ if (ic->parmBytes) {
int i;
- if (IC_LEFT (ic)->parmBytes > 3) {
+ if (ic->parmBytes > 3) {
emitcode ("mov", "a,%s", spname);
emitcode ("add", "a,#0x%02x",
- (-IC_LEFT (ic)->parmBytes) & 0xff);
+ (-ic->parmBytes) & 0xff);
emitcode ("mov", "%s,a", spname);
}
else
- for (i = 0; i < IC_LEFT (ic)->parmBytes; i++)
+ for (i = 0; i < ic->parmBytes; i++)
emitcode ("dec", "%s", spname);
}
/* adjust the stack for parameters if required */
- if (IC_LEFT (ic)->parmBytes) {
- if (IC_LEFT (ic)->parmBytes > 63) {
- emitcode ("sbiw", "r28,%d", IC_LEFT (ic)->parmBytes);
+ if (ic->parmBytes) {
+ if (ic->parmBytes > 63) {
+ emitcode ("sbiw", "r28,%d", ic->parmBytes);
}
else {
emitcode ("subi", "r28,lo8(%d)",
- IC_LEFT (ic)->parmBytes);
+ ic->parmBytes);
emitcode ("sbci", "r29,hi8(%d)",
- IC_LEFT (ic)->parmBytes);
+ ic->parmBytes);
}
}
if (ic->regsSaved)
/* adjust the stack for parameters if
required */
- if (IC_LEFT (ic)->parmBytes)
+ if (ic->parmBytes)
{
int i;
- if (IC_LEFT (ic)->parmBytes > 3)
+ if (ic->parmBytes > 3)
{
emitcode ("mov", "a,%s", spname);
- emitcode ("add", "a,#0x%02x", (-IC_LEFT (ic)->parmBytes) & 0xff);
+ emitcode ("add", "a,#0x%02x", (-ic->parmBytes) & 0xff);
emitcode ("mov", "%s,a", spname);
}
else
- for (i = 0; i < IC_LEFT (ic)->parmBytes; i++)
+ for (i = 0; i < ic->parmBytes; i++)
emitcode ("dec", "%s", spname);
}
/* adjust the stack for parameters if
required */
- if (IC_LEFT (ic)->parmBytes)
+ if (ic->parmBytes)
{
int i;
- if (IC_LEFT (ic)->parmBytes > 3)
+ if (ic->parmBytes > 3)
{
emitcode ("mov", "a,%s", spname);
- emitcode ("add", "a,#0x%02x", (-IC_LEFT (ic)->parmBytes) & 0xff);
+ emitcode ("add", "a,#0x%02x", (-ic->parmBytes) & 0xff);
emitcode ("mov", "%s,a", spname);
}
else
- for (i = 0; i < IC_LEFT (ic)->parmBytes; i++)
+ for (i = 0; i < ic->parmBytes; i++)
emitcode ("dec", "%s", spname);
}
/* adjust the stack for parameters if
required */
- if (IC_LEFT (ic)->parmBytes)
+ if (ic->parmBytes)
{
int i;
- if (IC_LEFT (ic)->parmBytes > 3)
+ if (ic->parmBytes > 3)
{
emitcode ("mov", "a,%s", spname);
- emitcode ("add", "a,#0x%02x", (-IC_LEFT (ic)->parmBytes) & 0xff);
+ emitcode ("add", "a,#0x%02x", (-ic->parmBytes) & 0xff);
emitcode ("mov", "%s,a", spname);
}
else
- for (i = 0; i < IC_LEFT (ic)->parmBytes; i++)
+ for (i = 0; i < ic->parmBytes; i++)
emitcode ("dec", "%s", spname);
}
/* adjust the stack for parameters if
required */
- if (IC_LEFT (ic)->parmBytes)
+ if (ic->parmBytes)
{
int i;
- if (IC_LEFT (ic)->parmBytes > 3)
+ if (ic->parmBytes > 3)
{
emitcode ("mov", "a,%s", spname);
- emitcode ("add", "a,#0x%02x", (-IC_LEFT (ic)->parmBytes) & 0xff);
+ emitcode ("add", "a,#0x%02x", (-ic->parmBytes) & 0xff);
emitcode ("mov", "%s,a", spname);
}
else
- for (i = 0; i < IC_LEFT (ic)->parmBytes; i++)
+ for (i = 0; i < ic->parmBytes; i++)
emitcode ("dec", "%s", spname);
}
/* adjust the stack for parameters if
required */
- if (IC_LEFT(ic)->parmBytes) {
+ if (ic->parmBytes) {
int i;
- if (IC_LEFT(ic)->parmBytes > 3) {
+ if (ic->parmBytes > 3) {
emitcode("mov","a,%s",spname);
- emitcode("add","a,#0x%02x", (- IC_LEFT(ic)->parmBytes) & 0xff);
+ emitcode("add","a,#0x%02x", (- ic->parmBytes) & 0xff);
emitcode("mov","%s,a",spname);
} else
- for ( i = 0 ; i < IC_LEFT(ic)->parmBytes ;i++)
+ for ( i = 0 ; i < ic->parmBytes ;i++)
emitcode("dec","%s",spname);
}
/* adjust the stack for parameters if
required */
- if (IC_LEFT(ic)->parmBytes) {
+ if (ic->parmBytes) {
int i;
- if (IC_LEFT(ic)->parmBytes > 3) {
+ if (ic->parmBytes > 3) {
emitcode("mov","a,%s",spname);
- emitcode("add","a,#0x%02x", (- IC_LEFT(ic)->parmBytes) & 0xff);
+ emitcode("add","a,#0x%02x", (- ic->parmBytes) & 0xff);
emitcode("mov","%s,a",spname);
} else
- for ( i = 0 ; i < IC_LEFT(ic)->parmBytes ;i++)
+ for ( i = 0 ; i < ic->parmBytes ;i++)
emitcode("dec","%s",spname);
}
}
/* adjust the stack for parameters if required */
- if (IC_LEFT (ic)->parmBytes)
+ if (ic->parmBytes)
{
- int i = IC_LEFT (ic)->parmBytes;
+ int i = ic->parmBytes;
_G.stack.pushed -= i;
if (IS_GB)
{
if (ic->op == ADDRESS_OF && uic->op == IPUSH)
goto hluse;
- if (ic->op == CALL && IC_LEFT (ic)->parmBytes == 0 && (uic->op == '-' || uic->op == '+'))
+ if (ic->op == CALL && ic->parmBytes == 0 && (uic->op == '-' || uic->op == '+'))
goto hluse;
return;
hluse: