[Development] Passing QSize, QPoint, QTime and other small structs by value

Sergio Martins sergio.martins at kdab.com
Fri Apr 7 18:35:22 CEST 2017


On 2017-04-07 14:02, Lars Knoll wrote:
> There might be a little catch with regards to structs containing
> members that are 8 bytes in size (aka quint64). Are those getting
> passed in registers on 32bit ARM?

struct struct_16Bytes
{
     unsigned long long first, second;
};

unsigned long long test(struct_16Bytes s)
{
     return s.second;
}

Generates:
         mov     r0, r2 ; Each member fills in two registers
         mov     r1, r3
         bx      lr


If I change the signature to: "test(const struct_16Bytes &s)", then it 
generates:
         ldr     r2, [r0, #8]   ; ldrs are slow, since they read from 
memory
         ldr     r1, [r0, #12]
         mov     r0, r2
         bx      lr



(Tested on ARM 32bit, clang -target arm-none-linux-gnueabi)




Regards,
-- 
SĂ©rgio Martins | sergio.martins at kdab.com | Senior Software Engineer
Klarälvdalens Datakonsult AB, a KDAB Group company
Tel: Sweden (HQ) +46-563-540090, USA +1-866-777-KDAB(5322)
KDAB - The Qt, C++ and OpenGL Experts



More information about the Development mailing list