Передача аргумента определяется соглашением о вызовах из системы ABI (Application Binary Interface). Какой ABI используется, зависит от того, для какой цели (ОС + аппаратная платформа) вы компилируете. См., Например, AMD64 ABI , который * nix использует (грубо говоря, есть несколько небольших вариантов).
Ссылка, которую вы предоставили, была на статью о передаче параметров соглашения о вызовах Microsoft x64. Это отмечает:
__m128
всегда передаются по указателю, а не по значению
- первые четыре целых числа или указатели всегда передаются в
RCX
, RDX
, R8
, R9
Таким образом, для любой функции с только __m128
аргументами до четырех будут передаваться как указатели в регистрах, а любые другие передаются как указатели в стеке. Как отмечает Джейсон в другом ответе, эти указатели будут указывать на значения, которые также вероятны в стеке.
__m128
и __m128 &
(а также __m128 *
), вероятно, эквивалентны по стоимости в соглашении о вызовах Microsoft x64 - все они проходят по указателю.
При чтении через AB64 AMD64 выглядит, как будто первые 8 регистров XMM (%xmm0
- %xmm8
) имеют ширину 128 бит и будут принимать значение __m128
по значению. Таким образом, в системах, использующих AMD64 ABI (например, gcc в linux), первые восемь аргументов __m128
окажутся в регистрах.
В этом случае может имеет смысл передавать с 9 по 15 __m128
аргументы как ссылки / указатели - они могут использовать целочисленные регистры. Это позволит избежать копирования их в стек.
Я не уверен, какое соглашение использует gcc для windows (например, mingw). Предположительно он должен использовать соглашение Microsoft x64, если он взаимодействует с другими библиотеками.
Если вам интересно, я бы настоятельно рекомендовал провести несколько экспериментов и посмотреть на разборку - опция gcc -S
отлично подходит для этого! Если вы находитесь в Visual Studio, вы можете использовать окно разборки в отладчике.
Всегда хорошо немного пиковаться под капотом, даже если вы не до конца понимаете, что происходит. Вы начнете видеть шаблоны и сможете задавать вопросы или исследовать то, что видите.