nested ifs

This commit is contained in:
corey 2024-01-16 20:58:49 -06:00
parent 352e46cc64
commit fd1873549f
3 changed files with 26 additions and 15 deletions

20
gen.c
View File

@ -566,18 +566,22 @@ void gen_code(Gen*gen,PNode*pn,FILE*file)
}
fprintf(file,"\tcmpl $0,%%eax\n");
}
size_t labelno_cache=gen->labelno;
++gen->labelno;
fprintf(file,"\tjz .L%02lu\n",gen->labelno);
fprintf(file,"\tjz .L%02lu\n",labelno_cache);
for(size_t i=0;i<pn->pnodes.size;++i)
gen_code(gen,vec_at(&pn->pnodes,i,PNode*),file);
fprintf(file,".L%02lu:\n",gen->labelno);
fprintf(file,".L%02lu:\n",labelno_cache);
break;
case PWHILE:
++gen->labelno;
fprintf(file,".L%02lu:\n",gen->labelno);
{
size_t pwhile_label1=gen->labelno++;
size_t pwhile_label2=gen->labelno++;
fprintf(file,".L%02lu:\n",pwhile_label1);
if(pn->tokens.size>1)
{
switch(gen->buildarch)
@ -594,13 +598,15 @@ void gen_code(Gen*gen,PNode*pn,FILE*file)
}
fprintf(file,"\tcmpl $0,%%eax\n");
}
fprintf(file,"\tjz .L%02lu\n",++gen->labelno);
fprintf(file,"\tjz .L%02lu\n",pwhile_label2);
for(size_t i=0;i<pn->pnodes.size;++i)
gen_code(gen,vec_at(&pn->pnodes,i,PNode*),file);
fprintf(file,"\tjmp .L%02lu\n",gen->labelno-1);
fprintf(file,".L%02lu:\n",gen->labelno);
fprintf(file,"\tjmp .L%02lu\n",pwhile_label1);
fprintf(file,".L%02lu:\n",pwhile_label2);
}
break;
case PASM:

View File

@ -13,22 +13,17 @@
static int sprinti(char*s,int d);
static int sprinti16(char*s,int d);
typedef union sprint_type {int64_t i64;int32_t i32;char c;char*s;}sprint_type;
// Print formatted string with variable number
// of arguments into destination string dest
int sprint(char*dest,char*fmt,...)
{
bool special=false;
typedef union type {int64_t i64;int32_t i32;char c;char*s;}type;
type rdi;
type rsi;
type rdx;
type rcx;
type r8;
type r9;
int bpos=0;
type args[6];
int curarg=2;
sprint_type args[6];
sprint_type rdi,rsi,rdx,rcx,r8,r9;
__rdi(rdi);
__rsi(rsi);

10
tests/all/nestif.par Normal file
View File

@ -0,0 +1,10 @@
#:31
fn main()
{
if(true)
{
if(false);
ret 31;
}
ret 41;
}