Clang + ARM64:如何将X8作为参数传递?

在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
onitsuka1024 回答:Clang + ARM64:如何将X8作为参数传递?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3160737.html

大家都在问