aboutsummaryrefslogtreecommitdiffstats
path: root/src/ir.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir.c')
-rw-r--r--src/ir.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/ir.c b/src/ir.c
index 2b289d9..075ebe3 100644
--- a/src/ir.c
+++ b/src/ir.c
@@ -173,7 +173,7 @@ emit_builtin(ProgramBASM *program, Node *node) {
173 case TOKEN_LE: { return emit_numcomp(program, node, OP_JMP_GT); } break; 173 case TOKEN_LE: { return emit_numcomp(program, node, OP_JMP_GT); } break;
174 case TOKEN_GE: { return emit_numcomp(program, node, OP_JMP_LT); } break; 174 case TOKEN_GE: { return emit_numcomp(program, node, OP_JMP_LT); } break;
175 default: { 175 default: {
176 // TODO: assert unreachable. 176 push_error(ERR_TYPE_BASM, ERR_UNIMPLEMENTED, node->line, node->col);
177 return (Operand){0}; 177 return (Operand){0};
178 } break; 178 } break;
179 } 179 }
@@ -190,12 +190,36 @@ emit_number(ProgramBASM *program, Node *node) {
190} 190}
191 191
192Operand 192Operand
193emit_bool(ProgramBASM *program, Node *node) {
194 LineInfo line = (LineInfo){.line = node->line, .col = node->col};
195 Operand reg_dst = NEW_REG();
196 Operand val;
197 if (node->boolean) {
198 val = NEW_S64(1);
199 } else {
200 val = NEW_S64(0);
201 }
202 EMIT_1(program, line, OP_LD8, reg_dst, val);
203 return reg_dst;
204}
205
206// TODO: emit_if
207// TODO: emit_and
208// TODO: emit_or
209// TODO: emit_not
210// TODO: emit_global
211// TODO: emit_local
212// TODO: emit_procedure
213// TODO: emit_proc_call
214
215Operand
193emit_basm(ProgramBASM *program, Node *node) { 216emit_basm(ProgramBASM *program, Node *node) {
194 switch (node->type) { 217 switch (node->type) {
218 case NODE_BOOL: { return emit_bool(program, node); } break;
195 case NODE_NUMBER: { return emit_number(program, node); } break; 219 case NODE_NUMBER: { return emit_number(program, node); } break;
196 case NODE_BUILTIN: { return emit_builtin(program, node); } break; 220 case NODE_BUILTIN: { return emit_builtin(program, node); } break;
197 default: { 221 default: {
198 printf("UNIMPLEMENTED\n"); 222 push_error(ERR_TYPE_BASM, ERR_UNIMPLEMENTED, node->line, node->col);
199 return (Operand){0}; 223 return (Operand){0};
200 } break; 224 } break;
201 } 225 }