gen: buffer output
This commit is contained in:
parent
aefbca6519
commit
dc2cda070d
168
gen.c
168
gen.c
@ -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);
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user