gen: buffer output

This commit is contained in:
corey 2024-01-20 12:05:48 -06:00
parent aefbca6519
commit dc2cda070d

168
gen.c
View File

@ -812,17 +812,19 @@ void gen_eval(Gen*gen,const PNode*pn,FILE*file)
// Evaluate one operation
void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file,Vec*stack)
{
uint32_t res=0;
LangDef ld=(gen->buildarch==M_X86_64)?gen_x86_64_langdef():gen_i386_langdef();
eval_elem tmpelem={0};
char operator[1024];
char operands[2][1024];
char operator[1024];
char output_buffer[4096];
eval_elem tmpelem={0};
size_t opos=0;
uint32_t res=0;
// TODO: refactor this function to be smarter,
// removing special cases and pendantic-ness
// Create strings of operands, operators
// Analyze and print evaluation "steps"
// Construct operand strings
{
// Create operand eval_elems
@ -877,29 +879,29 @@ void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file
case '!':
if(elem[0].type==EE_VAR)
{
fprintf(file,"\tcmpl $0,%s\n",operands[0]);
fprintf(file,"\tsete %%al\n");
fprintf(file,"\tmovzbl %%al,%%eax\n");
/* fprintf(file,"\tmovl %%eax,-%lu(%%%s)\n",elem[0].vstackloc,ld.bp); */
opos+=sprintf(output_buffer+opos,"\tcmpl $0,%s\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tsete %%al\n");
opos+=sprintf(output_buffer+opos,"\tmovzbl %%al,%%eax\n");
/* opos+=sprintf(output_buffer+opos,"\tmovl %%eax,-%lu(%%%s)\n",elem[0].vstackloc,ld.bp); */
tmpelem=(eval_elem){.type=EE_ACC,.val={0}};
vec_push(stack,&tmpelem);
}
else if(elem[0].type==EE_I32)
{
fprintf(file,"\tmovl $%s,%%eax\n",operands[0]);
fprintf(file,"\tcmpl $0,%%eax\n");
fprintf(file,"\tsete %%al\n");
fprintf(file,"\tmovzbl %%al,%%eax\n");
opos+=sprintf(output_buffer+opos,"\tmovl $%s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tcmpl $0,%%eax\n");
opos+=sprintf(output_buffer+opos,"\tsete %%al\n");
opos+=sprintf(output_buffer+opos,"\tmovzbl %%al,%%eax\n");
tmpelem=(eval_elem){.type=EE_ACC,.val={0}};
vec_push(stack,&tmpelem);
}
else if(elem[0].type==EE_ACC)
{
fprintf(file,"\tcmpl $0,%%eax\n");
fprintf(file,"\tsete %%al\n");
fprintf(file,"\tmovzbl %%al,%%eax\n");
//fprintf(file,"\tmovl %%eax,-%lu(%%%s)\n",elem[0].vstackloc,ld.bp);
opos+=sprintf(output_buffer+opos,"\tcmpl $0,%%eax\n");
opos+=sprintf(output_buffer+opos,"\tsete %%al\n");
opos+=sprintf(output_buffer+opos,"\tmovzbl %%al,%%eax\n");
//opos+=sprintf(output_buffer+opos,"\tmovl %%eax,-%lu(%%%s)\n",elem[0].vstackloc,ld.bp);
tmpelem=(eval_elem){.type=EE_ACC,.val={0}};
vec_push(stack,&tmpelem);
}
@ -951,26 +953,26 @@ void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file
break;
case '+':
fprintf(file,"\taddl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\taddl %s,%%eax\n",operands[1]);
vec_push(stack,&tmpelem);
break;
case '-':
fprintf(file,"\tsubl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\tsubl %s,%%eax\n",operands[1]);
vec_push(stack,&tmpelem);
break;
case '*':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\tmovl %s,%%%s\n",operands[1],ld.scratch1);
fprintf(file,"\timull %%%s\n",ld.scratch1);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%%s\n",operands[1],ld.scratch1);
opos+=sprintf(output_buffer+opos,"\timull %%%s\n",ld.scratch1);
vec_push(stack,&tmpelem);
break;
case '/':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\tmovl %s,%%%s\n",operands[1],ld.scratch1);
fprintf(file,"\tidiv %%%s\n",ld.scratch1);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%%s\n",operands[1],ld.scratch1);
opos+=sprintf(output_buffer+opos,"\tidiv %%%s\n",ld.scratch1);
vec_push(stack,&tmpelem);
break;
@ -990,30 +992,30 @@ void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file
break;
case '+':
fprintf(file,"\tmovl %s,%%eax\n",operands[0]);
fprintf(file,"\taddl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\taddl %s,%%eax\n",operands[1]);
vec_push(stack,&tmpelem);
break;
case '-':
fprintf(file,"\tmovl %s,%%eax\n",operands[0]);
fprintf(file,"\tsubl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tsubl %s,%%eax\n",operands[1]);
vec_push(stack,&tmpelem);
break;
case '*':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\tmovl %s,%%eax\n",operands[0]);
fprintf(file,"\tmovl %s,%%%s\n",operands[1],ld.scratch1);
fprintf(file,"\timull %%%s\n",ld.scratch1);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%%s\n",operands[1],ld.scratch1);
opos+=sprintf(output_buffer+opos,"\timull %%%s\n",ld.scratch1);
vec_push(stack,&tmpelem);
break;
case '/':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\tmovl %s,%%eax\n",operands[0]);
fprintf(file,"\tmovl %s,%%%s\n",operands[1],ld.scratch1);
fprintf(file,"\tidivl %%%s\n",ld.scratch1);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%%s\n",operands[1],ld.scratch1);
opos+=sprintf(output_buffer+opos,"\tidivl %%%s\n",ld.scratch1);
vec_push(stack,&tmpelem);
break;
@ -1030,36 +1032,36 @@ void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file
{
case '=':
fprintf(file,"\tmovl %s,%s\n",operands[0],operands[1]);
fprintf(file,"\tmovl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%s\n",operands[0],operands[1]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '+':
fprintf(file,"\tmovl %s,%%eax\n",operands[1]);
fprintf(file,"\taddl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\taddl %s,%%eax\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '-':
fprintf(file,"\tmovl %s,%%eax\n",operands[1]);
fprintf(file,"\tsubl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\tsubl %s,%%eax\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '*':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\tmovl %s,%%eax\n",operands[1]);
fprintf(file,"\tmovl %s,%%%s\n",operands[0],ld.scratch1);
fprintf(file,"\timul %%%s\n",ld.scratch1);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%%s\n",operands[0],ld.scratch1);
opos+=sprintf(output_buffer+opos,"\timul %%%s\n",ld.scratch1);
vec_push(stack,&tmpelem);
break;
case '/':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\tmovl %s,%%eax\n",operands[1]);
fprintf(file,"\tmovl %s,%%%s\n",operands[0],ld.scratch1);
fprintf(file,"\tidivl %%%s\n",ld.scratch1);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%%s\n",operands[0],ld.scratch1);
opos+=sprintf(output_buffer+opos,"\tidivl %%%s\n",ld.scratch1);
vec_push(stack,&tmpelem);
break;
@ -1076,34 +1078,34 @@ void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file
{
case '=':
fprintf(file,"\tmovl %s,%%eax\n",operands[0]);
fprintf(file,"\tmovl %%eax,%s\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tmovl %%eax,%s\n",operands[1]);
vec_push(stack,&tmpelem);
break;
case '+':
fprintf(file,"\tmovl %s,%%eax\n",operands[1]);
fprintf(file,"\taddl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\taddl %s,%%eax\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '-':
fprintf(file,"\tmovl %s,%%eax\n",operands[1]);
fprintf(file,"\tsubl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\tsubl %s,%%eax\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '*':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\tmovl %s,%%eax\n",operands[1]);
fprintf(file,"\timull %s\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\timull %s\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '/':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\tmovl %s,%%eax\n",operands[1]);
fprintf(file,"\tidivl %s\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\tmovl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\tidivl %s\n",operands[0]);
vec_push(stack,&tmpelem);
break;
@ -1120,29 +1122,29 @@ void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file
{
case '=':
fprintf(file,"\tmovl %%eax,%s\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tmovl %%eax,%s\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '+':
fprintf(file,"\taddl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\taddl %s,%%eax\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '-':
fprintf(file,"\tsubl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tsubl %s,%%eax\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '*':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\timull %s\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\timull %s\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '/':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\tidivl %s\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\tidivl %s\n",operands[0]);
vec_push(stack,&tmpelem);
break;
@ -1164,24 +1166,24 @@ void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file
break;
case '+':
fprintf(file,"\taddl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\taddl %s,%%eax\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '-':
fprintf(file,"\tsubl %s,%%eax\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\tsubl %s,%%eax\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '*':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\timull %s\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\timull %s\n",operands[0]);
vec_push(stack,&tmpelem);
break;
case '/':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\tidivl %s\n",operands[0]);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\tidivl %s\n",operands[0]);
vec_push(stack,&tmpelem);
break;
@ -1198,29 +1200,29 @@ void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file
{
case '=':
fprintf(file,"\tmovl %%eax,%s\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\tmovl %%eax,%s\n",operands[1]);
vec_push(stack,&tmpelem);
break;
case '+':
fprintf(file,"\taddl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\taddl %s,%%eax\n",operands[1]);
vec_push(stack,&tmpelem);
break;
case '-':
fprintf(file,"\tsubl %s,%%eax\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\tsubl %s,%%eax\n",operands[1]);
vec_push(stack,&tmpelem);
break;
case '*':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\timull %s\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\timull %s\n",operands[1]);
vec_push(stack,&tmpelem);
break;
case '/':
fprintf(file,"\txorl %%edx,%%edx\n");
fprintf(file,"\tidivl %s\n",operands[1]);
opos+=sprintf(output_buffer+opos,"\txorl %%edx,%%edx\n");
opos+=sprintf(output_buffer+opos,"\tidivl %s\n",operands[1]);
vec_push(stack,&tmpelem);
break;
@ -1228,4 +1230,6 @@ void gen_evalop(Gen*gen,PNode*pn,eval_elem*elem,size_t nops,Tok*curtok,FILE*file
}
fwrite(output_buffer,1,opos,file);
}