diff options
author | Bad Diode <bd@badd10de.dev> | 2021-12-22 17:00:55 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-12-22 17:00:55 +0100 |
commit | fd65adf81f6c3e7e94755a83e22f7e0a19f8bd99 (patch) | |
tree | 3a4c3986e8eff68c89b152bba7317903c06cf19d | |
parent | 7963d9ab628d03c5004f32899aa6b21663a78007 (diff) | |
download | bdl-fd65adf81f6c3e7e94755a83e22f7e0a19f8bd99.tar.gz bdl-fd65adf81f6c3e7e94755a83e22f7e0a19f8bd99.zip |
Add IR generation for arithmetic ops
-rw-r--r-- | src/ir.h | 45 |
1 files changed, 43 insertions, 2 deletions
@@ -112,6 +112,42 @@ proc_alloc(ProgramIr *program, StringView name) { | |||
112 | return proc; | 112 | return proc; |
113 | } | 113 | } |
114 | 114 | ||
115 | void compile_object(ProgramIr *program, Procedure *proc, Object *obj); | ||
116 | |||
117 | void | ||
118 | compile_arithmetic_list(ProgramIr *program, Procedure *proc, Op op, Object *obj) { | ||
119 | size_t op_line = obj->head->line; | ||
120 | size_t op_col = obj->head->col; | ||
121 | obj = obj->tail; | ||
122 | |||
123 | compile_object(program, proc, obj->head); | ||
124 | obj = obj->tail; | ||
125 | while (obj != NULL) { | ||
126 | compile_object(program, proc, obj->head); | ||
127 | obj = obj->tail; | ||
128 | Instruction inst = (Instruction){op, NULL, op_line, op_col}; | ||
129 | array_push(proc->instructions, inst); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | void | ||
134 | compile_proc_call(ProgramIr *program, Procedure *proc, Object *obj) { | ||
135 | // TODO: Handle this on the parser? | ||
136 | if (sv_equal(&obj->head->text, &STRING("+"))) { | ||
137 | compile_arithmetic_list(program, proc, OP_ADD, obj); | ||
138 | } else if (sv_equal(&obj->head->text, &STRING("-"))) { | ||
139 | compile_arithmetic_list(program, proc, OP_SUB, obj); | ||
140 | } else if (sv_equal(&obj->head->text, &STRING("*"))) { | ||
141 | compile_arithmetic_list(program, proc, OP_MUL, obj); | ||
142 | } else if (sv_equal(&obj->head->text, &STRING("/"))) { | ||
143 | compile_arithmetic_list(program, proc, OP_DIV, obj); | ||
144 | } else if (sv_equal(&obj->head->text, &STRING("%"))) { | ||
145 | compile_arithmetic_list(program, proc, OP_MOD, obj); | ||
146 | } else { | ||
147 | assert(false && "compile_proc_call: not implemented"); | ||
148 | } | ||
149 | } | ||
150 | |||
115 | void | 151 | void |
116 | compile_object(ProgramIr *program, Procedure *proc, Object *obj) { | 152 | compile_object(ProgramIr *program, Procedure *proc, Object *obj) { |
117 | switch (obj->type) { | 153 | switch (obj->type) { |
@@ -123,12 +159,17 @@ compile_object(ProgramIr *program, Procedure *proc, Object *obj) { | |||
123 | Instruction inst = (Instruction){OP_PUSH, obj, obj->line, obj->col}; | 159 | Instruction inst = (Instruction){OP_PUSH, obj, obj->line, obj->col}; |
124 | array_push(proc->instructions, inst); | 160 | array_push(proc->instructions, inst); |
125 | } break; | 161 | } break; |
126 | // case OBJ_TYPE_PAIR: { compile_proc_call(obj); } break; | 162 | case OBJ_TYPE_PAIR: { compile_proc_call(program, proc, obj); } break; |
127 | // case OBJ_TYPE_IF: { compile_if(obj); } break; | 163 | // case OBJ_TYPE_IF: { compile_if(obj); } break; |
128 | // case OBJ_TYPE_LAMBDA: { compile_lambda(obj); } break; | 164 | // case OBJ_TYPE_LAMBDA: { compile_lambda(obj); } break; |
129 | // case OBJ_TYPE_DEF: { compile_def(obj); } break; | 165 | // case OBJ_TYPE_DEF: { compile_def(obj); } break; |
130 | // case OBJ_TYPE_SYMBOL: { compile_symbol(obj); } break; | 166 | // case OBJ_TYPE_SYMBOL: { compile_symbol(obj); } break; |
131 | default: break; | 167 | default: { |
168 | // TODO: assert? | ||
169 | fprintf(stderr, "NOT IMPLEMENTED: compile_object for "); | ||
170 | OBJ_PRINT(obj); | ||
171 | exit(-1); | ||
172 | } break; | ||
132 | } | 173 | } |
133 | } | 174 | } |
134 | 175 | ||