Как заставить GCC передать структуру 128 бит /256 бит в качестве параметра функции в регистре xmm/ymm?

108
8

Как заставить GCC передать структуру 128 бит /256 бит в качестве параметра функции в регистре xmm/ymm?
то есть. если моя структура имеет ширину 256 бит (UnsignedLongLongStruct ниже)


(Я знаю, если я использую intrinsics для создания упакованного целого числа, gcc достаточно умен, чтобы помещать его в регистр% ymm, но могу ли я сделать это со структурой?)


typedef struct {
unsigned long long ull1;
unsigned long long ull2;
unsigned long long ull3;
unsigned long long ull4;
} UnsignedLongLongStruct;

void func1( UnsignedLongLongStruct unsignedLongLongStruct ) {
....
}

спросил(а) 2021-01-25T16:09:38+03:00 4 месяца, 4 недели назад
1
Решение
63

TL; DR. Похоже, что вызывающие соглашения явно указывают __m256 и друзей, которые будут помещены в учетные записи umm.


В X86-64 System V ABI, пункт 3.2.3, вы можете проверить, как передаются параметры. Мое чтение состоит в том, что только аргументы __m256 будут преобразованы в один SSE и 3 SSEUP 8-байтовых фрагмента, что позволяет передавать их в регистр ymm.

Это сделает так, чтобы ваш аргумент передавался в памяти, что мы видим в clang, gcc и icc: тестовая программа на godbolt


Чтобы передать его как регистр, когда я читаю соглашения о вызовах, кажется, что вы должны передать его как __m256 (или его вариант).

ответил(а) 2021-01-25T16:09:38+03:00 4 месяца, 4 недели назад
45

Вызывающие соглашения немного бесполезны для разных платформ и компиляторов. Вы должны передать вход в свою функцию по значению как __m256.


Если это тривиальная функция, и вы хотите, чтобы GCC вставил ее в линию, вы можете объявить ее атрибутом always_inline, чтобы избежать лишних нагрузок/хранилищ:

inline __attribute__((always_inline)) __m256 foo(__m256 const input);

ответил(а) 2021-01-25T16:09:38+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема