nested ifs
This commit is contained in:
parent
352e46cc64
commit
fd1873549f
20
gen.c
20
gen.c
@ -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:
|
||||
|
11
sprint.c
11
sprint.c
@ -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
10
tests/all/nestif.par
Normal file
@ -0,0 +1,10 @@
|
||||
#:31
|
||||
fn main()
|
||||
{
|
||||
if(true)
|
||||
{
|
||||
if(false);
|
||||
ret 31;
|
||||
}
|
||||
ret 41;
|
||||
}
|
Loading…
Reference in New Issue
Block a user