You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
As of this change we handle all relevant ABI scenarios.
1) Windows x64:
- SIMD8: returned and passed as "TYP_LONG", fine.
- SIMD12 / SIMD16 / SIMD32: returned and passed via a return buffer, fine.
2) Unix x64:
- SIMD8: returned and passed in one FP register, fine.
- SIMD12 / SIMD16, Vector4: returned and passed in two FP registers, fine.
- SIMD16, Vector128 / SIMD32: returned and passed via a return buffer, fine.
3) x86:
- SIMD8: can be returned via two registers or a return buffer (and is always passed on stack), both are fine.
- SIMD12/SIMD16/SIMD32: returned via a return buffer, passed on stack, fine.
4) ARM64:
- SIMD8, Vector2: returned in two FP registers (and passed as such or "TYP_LONG" under Windows varargs), fine.
- SIMD8, Vector64: returned in one FP register, can be passed as such or as "TYP_LONG" under Windows varargs.
The latter case is now handled correctly in "Lowering::LowerArg".
- SIMD12: returned in three FP registers, passed as such or in two integer registers under Windows varargs, fine.
- SIMD16, Vector4: returned in four FP registers, passed as such, or in two integer registers under Windows varargs, fine.
- SIMD16, Vector128: returned in one FP register, passed as such, or in two integer registers under Windows varargs, fine
(morph will decompose the varargs case into a `FIELD_LIST` via a temp).
0 commit comments