aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-12-22 17:00:55 +0100
committerBad Diode <bd@badd10de.dev>2021-12-22 17:00:55 +0100
commitfd65adf81f6c3e7e94755a83e22f7e0a19f8bd99 (patch)
tree3a4c3986e8eff68c89b152bba7317903c06cf19d
parent7963d9ab628d03c5004f32899aa6b21663a78007 (diff)
downloadbdl-fd65adf81f6c3e7e94755a83e22f7e0a19f8bd99.tar.gz
bdl-fd65adf81f6c3e7e94755a83e22f7e0a19f8bd99.zip
Add IR generation for arithmetic ops
-rw-r--r--src/ir.h45
1 files changed, 43 insertions, 2 deletions
diff --git a/src/ir.h b/src/ir.h
index 10f48fd..b42e02f 100644
--- a/src/ir.h
+++ b/src/ir.h
@@ -112,6 +112,42 @@ proc_alloc(ProgramIr *program, StringView name) {
112 return proc; 112 return proc;
113} 113}
114 114
115void compile_object(ProgramIr *program, Procedure *proc, Object *obj);
116
117void
118compile_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
133void
134compile_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
115void 151void
116compile_object(ProgramIr *program, Procedure *proc, Object *obj) { 152compile_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