From 8de92e1c3b052f56e4935a7ea70d7f70b3abb331 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Wed, 14 Mar 2018 23:43:52 -0400 Subject: [PATCH] After reflecting on the difficulties of lowering the increment operators, decided just to implement them in bytecode --- stdlib/bytecode_generator.krak | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/stdlib/bytecode_generator.krak b/stdlib/bytecode_generator.krak index 3b8b7f4..f656a7d 100644 --- a/stdlib/bytecode_generator.krak +++ b/stdlib/bytecode_generator.krak @@ -535,6 +535,22 @@ obj bytecode_generator (Object) { // generate with lvalue=true to make return a pointer if (name == "&" && parameter_nodes.size == 1) return generate(parameter_nodes[0], true) + if (name == "++" || name == "++p" || name == "--" || name == "--p") { + var op_size = size_to_operand_size(type_size(get_ast_type(parameter_nodes[0]))) + var addr_reg = generate(parameter_nodes[0], true) + var value_reg = emit_ldr(addr_reg, 0, op_size) + var mod_reg = -1 + if (name[0] == '+') + mod_reg = emit_addi(value_reg, 1) + else + mod_reg = emit_addi(value_reg, -1) + emit_str(addr_reg, 0, mod_reg, op_size) + // if preincrement, return modified value, else unmodified + if (name.length() == 2) + return mod_reg + else + return value_reg + } var params = parameter_nodes.map(fun(n: *ast_node): int return generate(n);) if (name == "+") {