Почему определения FXMVECTOR отличаются на 32-битной и 64-битной?
Почему бы не передать XMVECTOR по ссылке на 32-разрядную версию, чтобы использовать славу SIMD?
Заранее спасибо!
Детали различных макросов и типов соглашений о вызовах подробно описаны на MSDN.
Короче говоря, библиотека пытается поддерживать разумно «оптимальные» соглашения о вызовах для ряда платформ:
32-битный __fastcall
где первые три значения SIMD передаются в регистр. Остальные должны быть переданы по ссылке, поскольку стек гарантирует только 4-байтовое выравнивание.
32-битный __vectorcall
(требуется VS 2013 или более поздняя версия), где в регистр передаются до первых шести значений SIMD, а также HVA (то есть матрицы значений SIMD)
64-битный __fastcall
который никогда не будет передавать значения SIMD в регистр, но стек выровнен по 16 байтов.
64-битный __vectorcall
(требуется VS 2013 или более поздняя версия), где в регистр передаются до первых шести значений SIMD, а также HVA (то есть матрицы значений SIMD)
32-разрядный ARM, который передаст до первых четырех значений SIMD в регистр и поддерживает HVA.
Таким образом, чтобы гарантировать, что вещи могут быть переданы в регистр, они передаются «по значению». Чтобы свести к минимуму копии, вещи, которые вряд ли попадут в регистр, должны передаваться «по ссылке».
Конечно, реальная надежда состоит в том, что встраивание удаляет использование соглашения о вызовах в окончательно оптимизированном коде, но вы не можете гарантировать это.
Других решений пока нет …