From 8a50f99340f283a6c8774eb1c42fd50feb788ad7 Mon Sep 17 00:00:00 2001 From: Konstantin Nazarov Date: Sun, 11 Aug 2024 12:37:00 +0100 Subject: [PATCH] Reduce number of opcodes required for addition --- src/compiler.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/compiler.cpp b/src/compiler.cpp index 84f3259..863358c 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -98,10 +98,24 @@ Result Compiler::compile_primop(Context& context, Symbol& op, Value cur = TRY(expr.rest()); Expression ex = TRY(Expression::create()); - 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})); + if (cur.is()) { + 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(); + 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()) { Pair& pair = *cur.to(); @@ -142,7 +156,7 @@ Result 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;