diff options
author | kugwa <kugwa2000@gmail.com> | 2016-01-02 21:54:17 +0800 |
---|---|---|
committer | kugwa <kugwa2000@gmail.com> | 2016-01-02 21:54:17 +0800 |
commit | 7ac17bcf455713fbaf44437ba6f632f0f3077691 (patch) | |
tree | 990dfe8d42ade014dfbe82ddf9780f6298896160 | |
parent | 8f2d56608b41b30f6f71c122a00c985054ade0e9 (diff) | |
download | compiler2015-7ac17bcf455713fbaf44437ba6f632f0f3077691.tar compiler2015-7ac17bcf455713fbaf44437ba6f632f0f3077691.tar.gz compiler2015-7ac17bcf455713fbaf44437ba6f632f0f3077691.tar.bz2 compiler2015-7ac17bcf455713fbaf44437ba6f632f0f3077691.tar.lz compiler2015-7ac17bcf455713fbaf44437ba6f632f0f3077691.tar.xz compiler2015-7ac17bcf455713fbaf44437ba6f632f0f3077691.tar.zst compiler2015-7ac17bcf455713fbaf44437ba6f632f0f3077691.zip |
Complete code-gen of while statement
-rw-r--r-- | src/code-generation.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index 0786a0f..8abd72e 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -484,10 +484,42 @@ static void generate_statement( assert(stmt->type_node == CCMMC_AST_NODE_STMT); switch(stmt->value_stmt.kind) { - case CCMMC_KIND_STMT_WHILE: + case CCMMC_KIND_STMT_WHILE: { +#define FPREG_TMP "s16" + size_t label_cmp = state->label_number++; + size_t label_exit = state->label_number++; + CcmmcTmp *tmp1 = ccmmc_register_alloc(state->reg_pool, ¤t_offset); + CcmmcTmp *tmp2 = ccmmc_register_alloc(state->reg_pool, ¤t_offset); + CcmmcTmp *tmp3 = ccmmc_register_alloc(state->reg_pool, ¤t_offset); + const char *result = ccmmc_register_lock(state->reg_pool, tmp1); + const char *op1 = ccmmc_register_lock(state->reg_pool, tmp2); + const char *op2 = ccmmc_register_lock(state->reg_pool, tmp3); + + fprintf(state->asm_output, ".LC%zu\n", label_cmp); + generate_expression(stmt->child, state, result, op1, op2); + if (stmt->child->type_value == CCMMC_AST_VALUE_FLOAT) + fprintf(state->asm_output, + "\tfmov\t%s, %s\n" + "\tfcmp\t%s, #0.0\n" + "\tb.e\t.LC%zu\n", + FPREG_TMP, + result, + FPREG_TMP, + label_exit); + else + fprintf(state->asm_output, + "\tcbz\t%s, .LC%zu\n", + result, + label_exit); generate_statement(stmt->child->right_sibling, state, current_offset); - break; + fprintf(state->asm_output, + "\tb\t.LC%zu\n" + ".LC%zu\n", + label_cmp, + label_exit); +#undef FPREG_TMP + } break; case CCMMC_KIND_STMT_FOR: break; case CCMMC_KIND_STMT_ASSIGN: { |