diff options
author | Bad Diode <bd@badd10de.dev> | 2022-04-25 11:17:12 -0300 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-04-25 11:17:12 -0300 |
commit | cc8600eaff00904650c21052d3e2be2508410876 (patch) | |
tree | 8910f8ff68d4d1c728f6bd5539cf851c4f4e1386 /src/ir.c | |
parent | 46c86de715afcf15af6dc4532969d0736a3a2e48 (diff) | |
download | bdl-cc8600eaff00904650c21052d3e2be2508410876.tar.gz bdl-cc8600eaff00904650c21052d3e2be2508410876.zip |
Add more error types for different pipeline stages
Diffstat (limited to 'src/ir.c')
-rw-r--r-- | src/ir.c | 28 |
1 files changed, 26 insertions, 2 deletions
@@ -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 | ||
192 | Operand | 192 | Operand |
193 | emit_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 | |||
215 | Operand | ||
193 | emit_basm(ProgramBASM *program, Node *node) { | 216 | emit_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 | } |