diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-08-15 19:45:48 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-08-15 19:45:48 +0900 |
| commit | 70f3db84bb3e2f4d85da7392a112f6f82ce97152 (patch) | |
| tree | 7eff3177bbf6433c475da9f7f07460352d41c85f /codegen.c | |
| parent | 4e784d3d5b757f1088d5774897898ca108e9d5d8 (diff) | |
| download | ducc-70f3db84bb3e2f4d85da7392a112f6f82ce97152.tar.gz ducc-70f3db84bb3e2f4d85da7392a112f6f82ce97152.tar.zst ducc-70f3db84bb3e2f4d85da7392a112f6f82ce97152.zip | |
feat: implement conditional expression
Diffstat (limited to 'codegen.c')
| -rw-r--r-- | codegen.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -203,6 +203,20 @@ void codegen_binary_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) { printf(" push rax\n"); } +void codegen_cond_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) { + int label = codegen_new_label(g); + + codegen_expr(g, ast->node_cond, GenMode_rval); + printf(" pop rax\n"); + printf(" cmp rax, 0\n"); + printf(" je .Lelse%d\n", label); + codegen_expr(g, ast->node_then, gen_mode); + printf(" jmp .Lend%d\n", label); + printf(".Lelse%d:\n", label); + codegen_expr(g, ast->node_else, gen_mode); + printf(".Lend%d:\n", label); +} + void codegen_assign_expr_helper(CodeGen* g, AstNode* ast) { if (ast->node_op == TokenKind_assign) { return; @@ -379,6 +393,8 @@ void codegen_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) { codegen_deref_expr(g, ast, gen_mode); } else if (ast->kind == AstNodeKind_binary_expr) { codegen_binary_expr(g, ast, gen_mode); + } else if (ast->kind == AstNodeKind_cond_expr) { + codegen_cond_expr(g, ast, gen_mode); } else if (ast->kind == AstNodeKind_logical_expr) { codegen_logical_expr(g, ast); } else if (ast->kind == AstNodeKind_assign_expr) { |
