So on x86, EVERY -Zcallconv=fast function’s signature should look like this:declare {[ 3 x i64 ], [ 4 x < 2 x i64 >]} @my_func ( i64 %rdi , i64 %rsi , i64 %rdx , i64 %rcx , i64 %r8 , i64 %r9 , < 2 x i64 > %xmm0 , < 2 x i64 > %xmm1 , < 2 x i64 > %xmm2 , < 2 x i64 > %xmm3 , < 2 x i64 > %xmm4 , < 2 x i64 > %xmm5 , < 2 x i64 > %xmm6 , < 2 x i64 > %xmm7 , ; other args... ) LLVM IRWhen passing pointers, the appropriate i64 s should be replaced by ptr , and when passing double s, they replace <2 x i64> s.But you’re probably saying, “Miguel, that’s crazy!
%Out = type {[ 3 x i64 ], [ 4 x < 2 x i64 >]} define %Out @square ( i64 %rdi , i64 %rsi , i64 %rdx , ptr %rcx , i64 %r8 , i64 %r9 , < 2 x i64 > %…