After reflecting on the difficulties of lowering the increment operators, decided just to implement them in bytecode
This commit is contained in:
@@ -535,6 +535,22 @@ obj bytecode_generator (Object) {
|
|||||||
// generate with lvalue=true to make return a pointer
|
// generate with lvalue=true to make return a pointer
|
||||||
if (name == "&" && parameter_nodes.size == 1)
|
if (name == "&" && parameter_nodes.size == 1)
|
||||||
return generate(parameter_nodes[0], true)
|
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);)
|
var params = parameter_nodes.map(fun(n: *ast_node): int return generate(n);)
|
||||||
if (name == "+") {
|
if (name == "+") {
|
||||||
|
|||||||
Reference in New Issue
Block a user