在ARM64体系结构中,如果结果的大小超过16个字节,则将其发送到X8寄存器中。我需要以传递此寄存器的方式调用该函数。
typedef struct{char a[16 + 1];} retptr;
typedef retptr (*Func)(void* x0,void* x1,void* x2,void* x3);
void call(void* x0,void* x3,void* x8,void* address)
{
retptr* r = (retptr*)x8;
*r = ((Func)(address))(x0,x1,x2,x3);
}
问题在于该值未传递到寄存器-传递了指向堆栈的指针,然后复制了数据。 https://godbolt.org/z/D-zAnt
call: // @call
sub sp,sp,#64 // =64
str x19,[sp,#32] // 8-byte Folded Spill
stp x29,x30,#48] // 16-byte Folded Spill
add x29,#48 // =48
add x8,#8 // =8
mov x19,x4
blr x5
ldrb w8,#24]
ldur q0,#8]
strb w8,[x19,#16]
str q0,[x19]
ldp x29,#48] // 16-byte Folded Reload
ldr x19,#32] // 8-byte Folded Reload
add sp,#64 // =64
ret