|
| static infix_status | prepare_forward_call_frame_riscv64 (infix_arena_t *arena, infix_call_frame_layout **out_layout, infix_type *ret_type, infix_type **arg_types, size_t num_args, size_t num_fixed_args, void *target_fn) |
| |
| static infix_status | generate_forward_prologue_riscv64 (code_buffer *buf, infix_call_frame_layout *layout) |
| |
| static infix_status | generate_forward_argument_moves_riscv64 (code_buffer *buf, infix_call_frame_layout *layout, infix_type **arg_types, size_t num_args, c23_maybe_unused size_t num_fixed_args) |
| |
| static infix_status | generate_forward_call_instruction_riscv64 (code_buffer *, infix_call_frame_layout *) |
| |
| static infix_status | generate_forward_epilogue_riscv64 (code_buffer *buf, infix_call_frame_layout *layout, infix_type *ret_type) |
| |
| static infix_status | prepare_reverse_call_frame_riscv64 (infix_arena_t *arena, infix_reverse_call_frame_layout **out_layout, infix_reverse_t *context) |
| |
| static infix_status | generate_reverse_prologue_riscv64 (code_buffer *buf, infix_reverse_call_frame_layout *layout) |
| |
| static infix_status | generate_reverse_argument_marshalling_riscv64 (code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context) |
| |
| static infix_status | generate_reverse_dispatcher_call_riscv64 (code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context) |
| |
| static infix_status | generate_reverse_epilogue_riscv64 (code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context) |
| |
| static infix_status | prepare_direct_forward_call_frame_riscv64 (infix_arena_t *arena, infix_direct_call_frame_layout **out_layout, infix_type *ret_type, infix_type **arg_types, size_t num_args, infix_direct_arg_handler_t *handlers, void *target_fn) |
| |
| static infix_status | generate_direct_forward_prologue_riscv64 (code_buffer *buf, infix_direct_call_frame_layout *layout) |
| |
| static infix_status | generate_direct_forward_argument_moves_riscv64 (code_buffer *buf, infix_direct_call_frame_layout *layout) |
| |
| static infix_status | generate_direct_forward_call_instruction_riscv64 (code_buffer *buf, infix_direct_call_frame_layout *layout) |
| |
| static infix_status | generate_direct_forward_epilogue_riscv64 (code_buffer *buf, infix_direct_call_frame_layout *layout, infix_type *ret_type) |
| |
| static void | rv64_emit_compute_addr (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t offset) |
| |
| static void | rv64_mem_ld (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off) |
| |
| static void | rv64_mem_sd (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off) |
| |
| static void | rv64_mem_lw (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off) |
| |
| static void | rv64_mem_sw (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off) |
| |
| static void | rv64_mem_lbu (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off) |
| |
| static void | rv64_mem_lhu (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off) |
| |
| static void | rv64_mem_sb (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off) |
| |
| static void | rv64_mem_sh (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off) |
| |
| static void | rv64_mem_fld (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off) |
| |
| static void | rv64_mem_fsd (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off) |
| |
| static void | rv64_mem_flw (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off) |
| |
| static void | rv64_mem_fsw (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off) |
| |
| static void | rv64_emit_stack_sub (code_buffer *buf, uint32_t amount) |
| |
| static void | rv64_emit_stack_add (code_buffer *buf, uint32_t amount) |
| |
| static void | rv64_emit_load_gpr_value_sized (code_buffer *buf, uint8_t rd, uint8_t addr_reg, size_t size, bool is_signed) |
| |
| static void | rv64_emit_load_gpr_value (code_buffer *buf, uint8_t rd, uint8_t addr_reg, const infix_type *type) |
| |
| static void | rv64_emit_copy_memory (code_buffer *buf, uint8_t dst_base, int32_t dst_off, uint8_t src_base, int32_t src_off, size_t size) |
| |
| static void | rv64_emit_store_gpr_low_bytes (code_buffer *buf, uint8_t base, uint8_t rd, int32_t off, size_t size) |
| |
| static void | rv64_emit_store_gpr_return (code_buffer *buf, uint8_t base, size_t size) |
| |
| static void | rv64_emit_store_fp_value (code_buffer *buf, uint8_t base, uint8_t fa, int32_t off, size_t size) |
| |
| static void | rv64_emit_load_fp_value (code_buffer *buf, uint8_t base, uint8_t fa, int32_t off, size_t size) |
| |
| static bool | rv64_flatten_all_recursive (const infix_type *type, size_t base_offset, rv64_all_leaf_list *out, size_t depth) |
| |
| static bool | rv64_flatten_all (const infix_type *type, rv64_all_leaf_list *out) |
| |
| static void | rv64_emit_load_fp_aggregate (code_buffer *buf, uint8_t addr_reg, uint8_t base_fpr, const infix_type *type) |
| |
| static void | rv64_emit_store_fp_aggregate (code_buffer *buf, uint8_t addr_reg, uint8_t base_fpr, const infix_type *type) |
| |
| static void | rv64_emit_load_mixed (code_buffer *buf, uint8_t addr_reg, uint8_t gpr_reg, uint8_t fpr_reg, const infix_type *type) |
| |
| static void | rv64_emit_store_mixed (code_buffer *buf, uint8_t addr_reg, uint8_t gpr_reg, uint8_t fpr_reg, const infix_type *type) |
| |
| static bool | rv64_return_in_memory (const infix_type *type) |
| |
| static rv64_return_class | rv64_classify_return (const infix_type *type) |
| |
| static uint32_t | rv64_stack_place (uint32_t *stack_offset, const infix_type *type) |
| |
| static rv64_arg_class | rv64_classify_integer (infix_type *type, bool is_variadic_arg, size_t *gpr_count, uint32_t *stack_offset, bool *variadic_stack_mode) |
| |
| static rv64_arg_class | rv64_classify_arg (infix_type *type, bool is_variadic_arg, size_t *gpr_count, size_t *vpr_count, uint32_t *stack_offset, bool *variadic_stack_mode) |
| |
| static infix_status | generate_forward_call_instruction_riscv64 (code_buffer *buf, c23_maybe_unused infix_call_frame_layout *layout) |
| |
| static rv64_direct_scratch_info | rv64_direct_scratch (const infix_direct_arg_layout *arg) |
| |
| static size_t | rv64_direct_standard_alloc (const infix_direct_call_frame_layout *layout) |
| |
| static infix_status | generate_direct_forward_call_instruction_riscv64 (code_buffer *buf, c23_maybe_unused infix_direct_call_frame_layout *layout) |
| |
Implements the FFI logic for the RISC-V RV64GC (lp64d) architecture.
Copyright (c) 2026 Sanko Robinson
This source code is dual-licensed under the Artistic License 2.0 or the MIT License. You may choose to use this code under the terms of either license.
SPDX-License-Identifier: (Artistic-2.0 OR MIT)
The documentation blocks within this file are licensed under the Creative Commons Attribution 4.0 International License (CC BY 4.0).
SPDX-License-Identifier: CC-BY-4.0