Aarch64 jit compiler wip: suppport floating-point arguments

This commit is contained in:
Nikita Lisitsa 2026-01-05 10:29:46 +03:00
parent 428283dbf8
commit c9f4a9c19d
3 changed files with 26 additions and 13 deletions

View file

@ -172,8 +172,8 @@ int main(int argc, char ** argv)
{
// TODO: remove, testing-only code; should execute entry point instead
auto offset = module.code.symbol_table.at("test");
auto fptr = (float(*)())(module.code.memory.data.get() + offset);
auto x = fptr();
auto fptr = (float(*)(float))(module.code.memory.data.get() + offset);
auto x = fptr(6.f);
std::cout << "Result: " << std::boolalpha << x << std::endl;
}
}

View file

@ -1,4 +1,2 @@
func test() -> f32:
if 0.0 >= 1.0:
return 3.1415
return 2.71828
func test(x : f32) -> f32:
return x * 1.5

View file

@ -634,18 +634,33 @@ namespace pslang::jit::aarch64
{
// TODO: floating-point / struct arguments
scopes.emplace_back();
for (std::size_t i = 0; i < node.arguments.size(); ++i)
std::uint8_t reg = 0;
std::uint8_t fp_reg = 0;
for (auto const & argument : node.arguments)
{
auto type = ast::get_type(*node.arguments[i].type);
auto type = ast::get_type(*argument.type);
if (types::is_bool_type(*type))
{
builder.tst(i, i);
builder.csetm(i, 0b0001);
builder.tst(reg, reg);
builder.csetm(reg, 0b0001);
push(reg);
++reg;
}
else if (types::is_integer_type(*type))
extend(i, type);
push(i);
scopes.back().variables[node.arguments[i].name] = {.frame_offset = stack_offset};
{
extend(reg, type);
push(reg);
++reg;
}
else if (types::is_floating_point_type(*type))
{
auto mode = fp_mode_for(*type);
push_fp(fp_reg, mode);
++fp_reg;
}
scopes.back().variables[argument.name] = {.frame_offset = stack_offset};
}
apply(*node.statements);
scopes.pop_back();