void genif(SNODE *stmt) /* * generate code to evaluate an if statement. */ { int lab1, lab2; int areg, sreg; lab1 = nextlabel++; /* else label */ lab2 = nextlabel++; /* exit label */ InitRegs(); /* clear temps */ ChooseRegs(&areg, &sreg); falsejp(stmt->exp, areg, sreg, lab1); genstmt(stmt->s1); if (stmt->s2 != 0) /* else part exists */ { gen_codes(op_jmp, 0, make_label(lab2), 0); gen_label(lab1); genstmt(stmt->s2); gen_label(lab2); } else /* no else code */ gen_label(lab1); }
void genselect(STATEMENT *stmt, SYMBOL *funcsp, BOOL jmptrue) { if (stmt->altlabel) { // gen_label(stmt->altlabel); // intermed_tail->dc.opcode = i_skipcompare; } if (jmptrue) truejp(stmt->select, funcsp, stmt->label); else falsejp(stmt->select, funcsp, stmt->label); if (stmt->altlabel) { // gen_label(stmt->altlabel); // intermed_tail->dc.opcode = i_skipcompare; } }
void genif(SNODE *stmt) /* * generate code to evaluate an if statement. */ { int lab1, lab2; lab1 = nextlabel++; /* else label */ lab2 = nextlabel++; /* exit label */ initstack(); /* clear temps */ falsejp(stmt->exp,lab1); genstmt(stmt->s1); if( stmt->s2 != 0 ) /* else part exists */ { gen_code(op_jmp,0,make_label(lab2),0); gen_label(lab1); genstmt(stmt->s2); gen_label(lab2); } else /* no else code */ gen_label(lab1); }