Reduce number of opcodes required for addition

This commit is contained in:
Konstantin Nazarov 2024-08-11 12:37:00 +01:00
parent 74bff1a4c4
commit 8a50f99340
Signed by: knazarov
GPG key ID: 4CFE0A42FA409C22

View file

@ -98,11 +98,25 @@ Result<Expression> Compiler::compile_primop(Context& context, Symbol& op,
Value cur = TRY(expr.rest());
Expression ex = TRY(Expression::create());
if (cur.is<Nil>()) {
uint64_t reg = context.alloc_reg();
int64_t zero = TRY(context.add_const(TRY(Value::create((int64_t)0))));
std::cout << "mov r" << reg << ", c" << zero << "\n";
TRY(ex.add_opcode(Oc::Mov, {0, (int64_t)reg}, {1, zero}));
return ex;
}
Pair& pair = *cur.to<Pair>();
auto subexpr = TRY(pair.first());
auto comp = TRY(compile_expr(context, subexpr));
ex.add_code(comp.code);
uint64_t reg = comp.reg;
cur = TRY(pair.rest());
while (!cur.is<Nil>()) {
Pair& pair = *cur.to<Pair>();
auto subexpr = TRY(pair.first());
@ -142,7 +156,7 @@ Result<Expression> Compiler::compile_int64(Context& context, Int64& value) {
int64_t c = TRY(context.add_const(TRY(value.copy())));
std::cout << "loadc r" << reg << ", " << value.value() << "\n";
std::cout << "mov r" << reg << ", c" << c << "\n";
TRY(ex.add_opcode(Oc::Mov, {0, (int64_t)reg}, {1, (int64_t)c}));
ex.reg = reg;