From fd65adf81f6c3e7e94755a83e22f7e0a19f8bd99 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 22 Dec 2021 17:00:55 +0100 Subject: Add IR generation for arithmetic ops --- src/ir.h | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file 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) { return proc; } +void compile_object(ProgramIr *program, Procedure *proc, Object *obj); + +void +compile_arithmetic_list(ProgramIr *program, Procedure *proc, Op op, Object *obj) { + size_t op_line = obj->head->line; + size_t op_col = obj->head->col; + obj = obj->tail; + + compile_object(program, proc, obj->head); + obj = obj->tail; + while (obj != NULL) { + compile_object(program, proc, obj->head); + obj = obj->tail; + Instruction inst = (Instruction){op, NULL, op_line, op_col}; + array_push(proc->instructions, inst); + } +} + +void +compile_proc_call(ProgramIr *program, Procedure *proc, Object *obj) { + // TODO: Handle this on the parser? + if (sv_equal(&obj->head->text, &STRING("+"))) { + compile_arithmetic_list(program, proc, OP_ADD, obj); + } else if (sv_equal(&obj->head->text, &STRING("-"))) { + compile_arithmetic_list(program, proc, OP_SUB, obj); + } else if (sv_equal(&obj->head->text, &STRING("*"))) { + compile_arithmetic_list(program, proc, OP_MUL, obj); + } else if (sv_equal(&obj->head->text, &STRING("/"))) { + compile_arithmetic_list(program, proc, OP_DIV, obj); + } else if (sv_equal(&obj->head->text, &STRING("%"))) { + compile_arithmetic_list(program, proc, OP_MOD, obj); + } else { + assert(false && "compile_proc_call: not implemented"); + } +} + void compile_object(ProgramIr *program, Procedure *proc, Object *obj) { switch (obj->type) { @@ -123,12 +159,17 @@ compile_object(ProgramIr *program, Procedure *proc, Object *obj) { Instruction inst = (Instruction){OP_PUSH, obj, obj->line, obj->col}; array_push(proc->instructions, inst); } break; - // case OBJ_TYPE_PAIR: { compile_proc_call(obj); } break; + case OBJ_TYPE_PAIR: { compile_proc_call(program, proc, obj); } break; // case OBJ_TYPE_IF: { compile_if(obj); } break; // case OBJ_TYPE_LAMBDA: { compile_lambda(obj); } break; // case OBJ_TYPE_DEF: { compile_def(obj); } break; // case OBJ_TYPE_SYMBOL: { compile_symbol(obj); } break; - default: break; + default: { + // TODO: assert? + fprintf(stderr, "NOT IMPLEMENTED: compile_object for "); + OBJ_PRINT(obj); + exit(-1); + } break; } } -- cgit v1.2.1