Reduce number of opcodes required for addition
This commit is contained in:
parent
74bff1a4c4
commit
8a50f99340
1 changed files with 19 additions and 5 deletions
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue