diff --git a/libs/jit/source/arch/aarch64/compiler_v2.cpp b/libs/jit/source/arch/aarch64/compiler_v2.cpp index a52e1ad..c77b154 100644 --- a/libs/jit/source/arch/aarch64/compiler_v2.cpp +++ b/libs/jit/source/arch/aarch64/compiler_v2.cpp @@ -15,6 +15,8 @@ namespace pslang::jit::aarch64 struct local_context { + bool use_frame_pointer = true; + std::unordered_map extern_symbols; std::unordered_map nodes; @@ -632,12 +634,18 @@ namespace pslang::jit::aarch64 else throw std::runtime_error("Unsupported function argument type"); } - builder.sub_imm(31, 31, 16); - builder.str(30, 31, 0); + if (!lcontext.use_frame_pointer) + { + builder.sub_imm(31, 31, 16); + builder.str(30, 31, 0); + } lcontext.branch_resolve.emplace_back(pcontext.code.size(), node.target); builder.bl(0); - builder.ldr(30, 31, 0); - builder.add_imm(31, 31, 16); + if (!lcontext.use_frame_pointer) + { + builder.ldr(30, 31, 0); + builder.add_imm(31, 31, 16); + } // TODO: struct/array return value? if (types::is_unit_type(*type)) @@ -695,6 +703,11 @@ namespace pslang::jit::aarch64 else throw std::runtime_error("Unsupported return value type"); } + if (lcontext.use_frame_pointer) + { + builder.ldr(29, 31, (stack_size - 16) / 8); + builder.ldr(30, 31, (stack_size - 8) / 8); + } if (stack_size > 0) builder.add_imm(31, 31, stack_size); builder.ret(); @@ -703,6 +716,10 @@ namespace pslang::jit::aarch64 void compile(ir::node_ref begin, ir::node_ref end) { stack_size = 0; + + if (lcontext.use_frame_pointer) + stack_size += 16; + for (auto it = begin; it != end; ++it) { if (ir::is_value_instruction(it->instruction)) @@ -711,6 +728,7 @@ namespace pslang::jit::aarch64 stack_position[it] = stack_size; } } + stack_size = ((stack_size + 15) / 16) * 16; if (!std::holds_alternative(begin->instruction)) @@ -721,6 +739,12 @@ namespace pslang::jit::aarch64 lcontext.nodes[it] = pcontext.code.size(); if (stack_size > 0) builder.sub_imm(31, 31, stack_size); + if (lcontext.use_frame_pointer) + { + builder.str(29, 31, (stack_size - 16) / 8); + builder.str(30, 31, (stack_size - 8) / 8); + builder.add_imm(31, 29, stack_size - 16); + } ++it; for (; it != end; ++it)