https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88469

--- Comment #4 from Richard Earnshaw <rearnsha at gcc dot gnu.org> ---
Simpler test-case.

struct x
{
  long long a : 61;
};

void bar (int, struct x);

int foo (int a, int b, int c, struct x d)
{
  bar (a, d);
  return 2;
}

This does not seem to generate ldrd, but does show that 'd' is passed partially
in r3 and partially on the stack, when it should be entirely on the stack.

Correct code should be something like:

        push    {r4, lr}
        ldrd    r2, [sp, #8]
        bl      bar
        mov     r0, #2
        pop     {r4, pc}

But we currently generate:

        sub     sp, sp, #8
        push    {r4, lr}
        ldr     r2, [sp, #16]
        mov     r1, r3
        str     r3, [sp, #12]
        bl      bar
        pop     {r4, lr}
        mov     r0, #2
        add     sp, sp, #8
        bx      lr

Reply via email to