Передача параметров функции типа XMVECTOR

Почему определения FXMVECTOR отличаются на 32-битной и 64-битной?
Почему бы не передать XMVECTOR по ссылке на 32-разрядную версию, чтобы использовать славу SIMD?

Заранее спасибо!

2

Решение

Детали различных макросов и типов соглашений о вызовах подробно описаны на 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.

Таким образом, чтобы гарантировать, что вещи могут быть переданы в регистр, они передаются «по значению». Чтобы свести к минимуму копии, вещи, которые вряд ли попадут в регистр, должны передаваться «по ссылке».

Конечно, реальная надежда состоит в том, что встраивание удаляет использование соглашения о вызовах в окончательно оптимизированном коде, но вы не можете гарантировать это.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]