On 10/21/26 6:23 AM, Eldar Osmanovic wrote:
From: Djordje Todorovic <[email protected]>

The RISC-V psABI requires named 2 * XLEN scalar arguments and
return values to use significance-based register-pair ordering:
the lower-order XLEN bits are passed in the lower-numbered register,
and the higher-order XLEN bits are passed in the higher-numbered
register.  This ordering is independent of endianness and applies
to both RV32 and RV64.

On big-endian targets, significance ordering differs from memory-layout
ordering.  If exactly one argument register is available, the low-order
XLEN bits are passed in the register and the high-order XLEN bits are
passed on the stack.

Keep anonymous variadic arguments and aggregates on the existing
memory-layout ordering path, so va_arg spill layout remains
correct on big-endian targets.  Floating-point reals also remain on the
memory-layout ordering path according to the psABI.

The relevant big-endian calling-convention rules were introduced by the
RISC-V ELF psABI change recently [1].

[1] https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/470

Co-authored-by: Eldar Osmanovic <[email protected]>
Signed-off-by: Djordje Todorovic <[email protected]>
Signed-off-by: Eldar Osmanovic <[email protected]>

gcc/ChangeLog:

        * config/riscv/riscv.cc (riscv_2xlen_significance_scalar_p):
        New function.
        (riscv_pass_2xlen_scalar_gpr_pair): Likewise.
        (riscv_pass_2xlen_scalar_gpr_stack): Likewise.
        (riscv_get_arg_info): Use significance-based ordering for named
        2 * XLEN scalar arguments and return values.
        (riscv_function_arg_1): New common implementation. Handle
        2 * XLEN scalar split between a GPR and the stack.
        (riscv_function_arg): Use riscv_function_arg_1.
        (riscv_function_incoming_arg): New function.
        (TARGET_FUNCTION_INCOMING_ARG): Define.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/abi/rv32be-abi-2xlen-aggregate-return.c: New test.
        * gcc.target/riscv/abi/rv32be-abi-2xlen-aggregate-split.c: New test.
        * gcc.target/riscv/abi/rv32be-abi-2xlen-aggregate.c: New test.
        * gcc.target/riscv/abi/rv32be-abi-2xlen-float-incoming.c: New test.
        * gcc.target/riscv/abi/rv32be-abi-2xlen-ilp32e-scalar.c: New test.
        * gcc.target/riscv/abi/rv32be-abi-2xlen-scalar-arg.c: New test.
        * gcc.target/riscv/abi/rv32be-abi-2xlen-scalar-incoming.c: New test.
        * gcc.target/riscv/abi/rv32be-abi-2xlen-scalar-return.c: New test.
        * gcc.target/riscv/abi/rv32be-abi-2xlen-scalar-sibcall.c: New test.
        * gcc.target/riscv/abi/rv32be-abi-2xlen-scalar-split.c: New test.
        * gcc.target/riscv/abi/rv64be-abi-2xlen-scalar-incoming.c: New test.
        * gcc.target/riscv/abi/rv64be-abi-2xlen-vararg.c: New test.
---
My recollection is that a PARALLEL for a return value means we're returning the value in two locations.  Though I guess after re-reading the documentation in this space you could possibly model what you need via the PARALLEL mechanism -- rather than N*2 entries in the PARALLEL for the different locations, you just have one entry pair describing each word sized component.

I'd like Kito to take a look at the patch since he's been involved in the ABI discussion.

I would also suggest looking at the Sashiko output.  I haven't thought hard about the issues it raised, so review it with a skeptical eye.

https://gcc.sashiko.dev/#/patchset/20261021122253.62110-1-eldar.osmanovic%40htecgroup.com

Jeff

Reply via email to