System.Numerics structs are incorrect sizes #6411
Comments
Seems like the types are constrained to having at least SIMD register size. Lines 1988 to 1990 in 6b58f13 |
I remembered this Bugzilla bug where @kumpera indicated this is expected: https://bugzilla.xamarin.com/show_bug.cgi?id=56602 |
SIMD support was originally designed to support 16bytes only types. |
We can make them have a non-16 byte size, but then we can't do SIMD operations like loads/stores on them. |
The size in memory of these structures is more important than individual SIMD optimizations, because there is a lot of code in the wild that works only under the assumption that these types are tightly-packed in memory. It is not a problem if the results of intermediate operations are expanded to a 16-byte form in order to better utilize SIMD operations -- this is what CoreCLR and .NET Framework do -- but the in-memory representation cannot change. As a comparison, if this same behavior was observed in the analogous MonoGame structures, then a lot of things using them would break. |
@vargaz we can emit simd load/store for Vector2. Vector3 is a bit trickier since it can live at the edge of a page. |
…e SIMD for these types for now, since the SIMD code can't handle types which are smaller than a SIMD reg. Fixes mono#6411.
Bumps to Java.Interop/master/0afb2b0f Bumps to llvm/master/a9cfb50e. Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=11771 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=15051 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=19436 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=45901 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=56071 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=58413 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=58413 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=58413 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=59184 fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=60065 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=60225 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=60298 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=60359 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=60568 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=60756 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=60848 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=60862 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=60900 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=60904 Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=60986 Fixes: https://github.com/mono/mono/issues/59400 Fixes: mono/mono#6169 Fixes: mono/mono#6187 Fixes: mono/mono#6192 Fixes: mono/mono#6255 Fixes: mono/mono#6264 Fixes: mono/mono#6266 Fixes: mono/mono#6281 Fixes: mono/mono#6283 Fixes: mono/mono#6320 Fixes: mono/mono#6339 Fixes: mono/mono#6343 Fixes: mono/mono#6349 Fixes: mono/mono#6379 Fixes: mono/mono#6383 Fixes: mono/mono#6401. Fixes: mono/mono#6411 Fixes: mono/mono#6414 Fixes: mono/mono#6490 Fixes: mono/mono#6721 Fixes: mono/mono#6767 Fixes: mono/mono#6777 Fixes: mono/mono#6848 Fixes: mono/mono#6940 Fixes: mono/mono#6948 Fixes: mono/mono#6998 Fixes: mono/mono#7016 Fixes: mono/mono#7085 Fixes: mono/mono#7086 Fixes: mono/mono#7095 Fixes: mono/mono#7137 Fixes: mono/mono#7184 Fixes: mono/mono#7240 Fixes: mono/mono#7262 Fixes: mono/mono#7289 Fixes: mono/mono#7338 Fixes: mono/mono#7356 Fixes: mono/mono#7364 Fixes: mono/mono#7378 Fixes: mono/mono#7389 Fixes: mono/mono#7460 Fixes: mono/mono#7535 Fixes: mono/mono#7536 Fixes: mono/mono#7610 Fixes: mono/mono#7624 Fixes: mono/mono#7637 Fixes: mono/mono#7655 Fixes: mono/mono#7657 Fixes: mono/mono#7685 Fixes: mono/mono#7786 Fixes: mono/mono#7792 Fixes: mono/mono#7822 Fixes: mono/mono#7860 Fixes: mono/mono#8089 Fixes: mono/mono#8267 Fixes: mono/mono#8409 Fixes: xamarin/maccore#628 Fixes: xamarin/maccore#629 Fixes: xamarin/maccore#673 Fixes: xamarin/maccore#673 Fixes: #1561
Many of the structures in the System.Numerics namespace are being padded out to an incorrectly-large size in memory. Although this was likely done as a kind of performance optimization, it has widespread side effects that break many of the main use cases for the types. This behavior is also different from .NET Core and .NET Framework.
The types affected:
Plane is probably larger because it contains a Vector3, but I've listed it anyways.
There are some test cases in corefx which ensure that these structures are the expected physical size in memory. For example
The text was updated successfully, but these errors were encountered: