1854bb00c6
On ARM64 macos and ios, when varargs are used, the first vararg blocks all cpu and fpu registers. On Windows x64, when varargs are used, floating point arguments are passed _both_ in the integer and double register. The Windows logic requires a new kind of native location: `BothNativeLocations`, which signals that a value needs to be copied to both locations before an FFI call, and can be copied from any of the two locations when getting an FFI callback. TEST=runtime/vm/compiler/ffi/unit_tests/variadic_double/x64_win.expect Note that integer arguments already block out the corresponding xmm registers on Windows x64. On System-V, an upper bound of the number of XMM registers used must be passed in AL. (Not reflected in the unit tests here, but will be in the dependent CL.) On ARM (32 bit), using varargs forces the calling convention to be in softfp mode even on hardfp supported devices. On RISC-V, the FPU registers are blocked when using varargs. TEST=runtime/vm/compiler/ffi/native_calling_convention_test.cc Test outputs in: runtime/vm/compiler/ffi/unit_tests/variadic_* Run test with `tools/test.py ffi_unit`. Bug: https://github.com/dart-lang/sdk/issues/38578 Change-Id: Ic568f8156c1c28ac3d6a2144805edf8caaa0169c Cq-Include-Trybots: luci.dart.try:vm-precomp-ffi-qemu-linux-release-arm-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/278342 Reviewed-by: Ryan Macnak <rmacnak@google.com>