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;