allow positive Var stack locations
This commit is contained in:
parent
df77188305
commit
e53e3dfdd9
10
gen.c
10
gen.c
|
@ -138,7 +138,7 @@ void gen_declare_variable(Gen*gen,PNode*pn,FILE*file)
|
|||
.type=I32,
|
||||
/* .location=STACK, */
|
||||
/* .regnum=0, */
|
||||
.stackloc=gen->stackptr->stacksize,
|
||||
.stackloc=-gen->stackptr->stacksize,
|
||||
};
|
||||
vec_push((Vec*)&gen->stackptr->vars,&var);
|
||||
|
||||
|
@ -199,7 +199,7 @@ void gen_declare_function(Gen*gen,PNode*pn,FILE*file)
|
|||
Var var={
|
||||
.name=vec_at(&pn->tokens,i,const Tok*)->str.buffer,
|
||||
.is_arg=true,
|
||||
.stackloc=stacksize,
|
||||
.stackloc=-stacksize,
|
||||
};
|
||||
vec_push((Vec*)&gen->stackptr->vars,&var);
|
||||
}
|
||||
|
@ -300,7 +300,7 @@ void gen_prolog(Gen*gen,const PNode*pn,FILE*file,size_t stacksize)
|
|||
if(gen->buildarch==M_X86_64)
|
||||
for(size_t i=0,j=pn->vars.size-1;i<pn->vars.size;++i,--j)
|
||||
if(i<6&&vec_at(&pn->vars,i,Var*)->is_arg)
|
||||
fprintf(file,"\t%s %%%s,-%lu(%%%s)\n",ld.mov_32,ld.registers_abi_32[j],vec_at(&pn->vars,i,Var*)->stackloc,ld.bp);
|
||||
fprintf(file,"\t%s %%%s,%d(%%%s)\n",ld.mov_32,ld.registers_abi_32[j],vec_at(&pn->vars,i,Var*)->stackloc,ld.bp);
|
||||
}
|
||||
|
||||
void gen_epilog(Gen*gen,const PNode*pn,FILE*file)
|
||||
|
@ -936,7 +936,7 @@ eval_lastelem:
|
|||
break;
|
||||
|
||||
case EE_VAR:
|
||||
fprintf(file,"\tmovl -%lu(%%%s),%%eax\n",e.vstackloc,ld.bp);
|
||||
fprintf(file,"\tmovl %d(%%%s),%%eax\n",e.vstackloc,ld.bp);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -996,7 +996,7 @@ void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file
|
|||
{
|
||||
switch(elem[i].type)
|
||||
{
|
||||
case EE_VAR: sprintf(operands[i],"-%lu(%%%s)",elem[i].vstackloc,ld.bp); break;
|
||||
case EE_VAR: sprintf(operands[i],"%d(%%%s)",elem[i].vstackloc,ld.bp); break;
|
||||
case EE_FUNC: sprintf(operands[i],"%s",elem[i].val.name); break;
|
||||
case EE_IDENT: sprintf(operands[i],"%s",elem[i].val.name); break;
|
||||
case EE_I32: sprintf(operands[i],"$%d",elem[i].val.i32); break;
|
||||
|
|
2
gen.h
2
gen.h
|
@ -29,7 +29,7 @@ typedef struct eval_elem
|
|||
{
|
||||
size_t type;
|
||||
VTYPE vtype;
|
||||
size_t vstackloc;
|
||||
int32_t vstackloc;
|
||||
union
|
||||
{
|
||||
int32_t i32;
|
||||
|
|
Loading…
Reference in New Issue
Block a user