allow positive Var stack locations

This commit is contained in:
corey 2024-01-26 09:25:08 -06:00
parent df77188305
commit e53e3dfdd9
3 changed files with 7 additions and 7 deletions

10
gen.c
View File

@ -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
View File

@ -29,7 +29,7 @@ typedef struct eval_elem
{
size_t type;
VTYPE vtype;
size_t vstackloc;
int32_t vstackloc;
union
{
int32_t i32;

2
mem.h
View File

@ -42,7 +42,7 @@ typedef struct Var
char*name;
VTYPE type;
bool is_arg; // Remember to move arg register to stack
size_t stackloc; // STACK: rsp-???
int32_t stackloc; // STACK: rsp-???
} Var;
// Function descriptor