void gen_stmt_if(const stmt *s, out_ctx *octx) { out_blk *blk_true = out_blk_new(octx, "if_true"); out_blk *blk_false = out_blk_new(octx, "if_false"); out_blk *blk_fi = out_blk_new(octx, "fi"); struct out_dbg_lbl *el[2][2]; const out_val *cond; flow_gen(s->flow, s->symtab, el, octx); cond = gen_expr(s->expr, octx); out_ctrl_branch(octx, cond, blk_true, blk_false); out_current_blk(octx, blk_true); { gen_stmt(s->lhs, octx); out_ctrl_transfer(octx, blk_fi, NULL, NULL); } out_current_blk(octx, blk_false); { if(s->rhs) gen_stmt(s->rhs, octx); out_ctrl_transfer(octx, blk_fi, NULL, NULL); } out_current_blk(octx, blk_fi); flow_end(s->flow, s->symtab, el, octx); }
void style_stmt_if(const stmt *s, out_ctx *octx) { stylef("if("); IGNORE_PRINTGEN(gen_expr(s->expr, octx)); stylef(")\n"); gen_stmt(s->lhs, octx); if(s->rhs){ stylef("else\n"); gen_stmt(s->rhs, octx); } }
void gen_stmt_for(stmt *s) { char *lbl_test = asm_label_flow("for_test"); /* don't else-if, possible to have both (comma-exp for init) */ if(s->flow->for_init){ gen_expr(s->flow->for_init, s->flow->for_init_symtab); asm_temp(1, "pop rax ; unused for init"); } asm_label(lbl_test); if(s->flow->for_while){ gen_expr(s->flow->for_while, s->flow->for_init_symtab); asm_temp(1, "pop rax"); asm_temp(1, "test rax, rax"); asm_temp(1, "jz %s", s->lbl_break); } gen_stmt(s->lhs); asm_label(s->lbl_continue); if(s->flow->for_inc){ gen_expr(s->flow->for_inc, s->flow->for_init_symtab); asm_temp(1, "pop rax ; unused for inc"); } asm_temp(1, "jmp %s", lbl_test); asm_label(s->lbl_break); free(lbl_test); }
const out_val *gen_expr_style_stmt(const expr *e, out_ctx *octx) { stylef("({\n"); gen_stmt(e->code, octx); stylef("\n})"); return NULL; }
void style_stmt_case_range(stmt *s) { stylef("\ncase %ld ... %ld: ", (long)const_fold_val_i(s->expr), (long)const_fold_val_i(s->expr2)); gen_stmt(s->lhs); }
void gen_stmt_label(const stmt *s, out_ctx *octx) { out_blk *thisblk = label_getblk(s->bits.lbl.label, octx); if(s->bits.lbl.label->mustgen_spel) out_blk_mustgen(octx, thisblk, s->bits.lbl.label->mustgen_spel); /* explicit fall through */ out_ctrl_transfer_make_current(octx, thisblk); gen_stmt(s->lhs, octx); /* the code-part of the compound statement */ }
void gen_stmt_if(stmt *s) { char *lbl_else = asm_label_code("else"); char *lbl_fi = asm_label_code("fi"); gen_expr(s->expr, s->symtab); asm_temp(1, "pop rax"); asm_temp(1, "test rax, rax"); asm_temp(1, "jz %s", lbl_else); gen_stmt(s->lhs); asm_temp(1, "jmp %s", lbl_fi); asm_label(lbl_else); if(s->rhs) gen_stmt(s->rhs); asm_label(lbl_fi); free(lbl_else); free(lbl_fi); }
void gen_stmt_for(const stmt *s, out_ctx *octx) { struct out_dbg_lbl *el[2][2]; out_blk *blk_test = out_blk_new(octx, "for_test"), *blk_body = out_blk_new(octx, "for_body"), *blk_end = out_blk_new(octx, "for_end"), *blk_inc = out_blk_new(octx, "for_inc"); flow_gen(s->flow, s->flow->for_init_symtab, el, octx); /* don't else-if, possible to have both (comma-exp for init) */ if(s->flow->for_init){ out_val_consume(octx, gen_expr(s->flow->for_init, octx)); out_comment(octx, "for-init"); } out_ctrl_transfer_make_current(octx, blk_test); if(s->flow->for_while){ const out_val *for_cond; for_cond = gen_expr(s->flow->for_while, octx); out_ctrl_branch(octx, for_cond, blk_body, blk_end); }else{ out_ctrl_transfer(octx, blk_body, NULL, NULL); } stmt_init_blks(s, blk_inc, blk_end); out_current_blk(octx, blk_body); { gen_stmt(s->lhs, octx); out_ctrl_transfer(octx, blk_inc, NULL, NULL); } out_current_blk(octx, blk_inc); { if(s->flow->for_inc) out_val_consume(octx, gen_expr(s->flow->for_inc, octx)); out_ctrl_transfer(octx, blk_test, NULL, NULL); } out_current_blk(octx, blk_end); flow_end(s->flow, s->flow->for_init_symtab, el, octx); }
void gen_stmt_do(stmt *s) { char *begin = asm_label_flow("do_start"); asm_label(begin); gen_stmt(s->lhs); asm_label(s->lbl_continue); gen_expr(s->expr, s->symtab); asm_temp(1, "pop rax"); asm_temp(1, "test rax, rax"); asm_temp(1, "jnz %s", begin); asm_label(s->lbl_break); free(begin); }
void style_stmt_for(const stmt *s, out_ctx *octx) { stylef("for("); if(s->flow->for_init) IGNORE_PRINTGEN(gen_expr(s->flow->for_init, octx)); stylef("; "); if(s->flow->for_while) IGNORE_PRINTGEN(gen_expr(s->flow->for_while, octx)); stylef("; "); if(s->flow->for_inc) IGNORE_PRINTGEN(gen_expr(s->flow->for_inc, octx)); stylef(")\n"); gen_stmt(s->lhs, octx); }
void style_stmt_label(const stmt *s, out_ctx *octx) { stylef("\n%s: ", s->bits.lbl.spel); gen_stmt(s->lhs, octx); }
void style_stmt_default(stmt *s) { stylef("\ndefault: "); gen_stmt(s->lhs); }
void gen_stmt_default(stmt *s) { out_label(s->bits.case_lbl); gen_stmt(s->lhs); }
void gen_stmt_label(stmt *s) { asm_label(s->expr->spel); gen_stmt(s->lhs); /* the code-part of the compound stmtement */ }
void gen_stmt_case_range(stmt *s) { out_label(s->bits.case_lbl); gen_stmt(s->lhs); }