Тип операнда невременной нагрузки (MOVNTDQA), выравнивание и синтаксис asm - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь выполнить невременную загрузку, используя инструкцию VMOVNTDQA для массива данных, который был выделен с помощью posix_memalign() (предположим, что это комбинирование записи путем изменения библиотеки), с выравниванием, выполненным для 16В. Однако я продолжаю получать ошибки. uint64 и uint128 имеют typedef long long и __int128 соответственно. Вот фрагмент кода:

uint64* arr;
posix_memalign((void**) &arr, 16, arr_size * sizeof(uint64))
uint128 b;
//index is a uint64 type and calculated earlier 
asm volatile ("vmovntdqa %1, %0" : "=x" (b) : "m" (arr[index]));
//additional code working on b here, result stored back to arr[index]

VMOVNTDQA spe c говорит, что инструкция имеет тип VMOVNTDQA xmm1, m128, а адреса должны быть выровнены по 128-битному (16-байтному). Теперь вышеприведенный код выравнивает адреса по 16B. Приведенный выше код работает нормально и не дает никаких ошибок по умолчанию, если arr if типа uint128. Тем не менее, я должен иметь возможность загружать 128-битное значение из 64-битного массива элементов, если он выровнен.

Мой вопрос заключается в том, происходит ли segfault из-за того, что m128 принимает только элементы типа __int128? или это проблема выравнивания? или есть проблема с приведенным выше синтаксисом asm?

Спасибо

...