Адрес памяти ограничения указателя стека встроенной сборки aarch64 со смещением для Clang 6+ - PullRequest
0 голосов
/ 28 апреля 2019

Я заметил, что на разных уровнях оптимизации Clang 6 иногда использует ldp (пара регистров загрузки неона) для соседних адресов памяти vld1 инстансы загрузки неона.

Я пытаюсь использовать встроенную сборку, чтобы вручную принудительно выполнить больше инструкций пары нагрузки. Исходный массив хранится в стеке, и когда сам Clang создает инструкции ldp, он использует указатель стека со смещением, однако, когда я вхожу в массив с его индексом со встроенной сборкой, он расширяется в регистр x для адреса. Это работает, однако, вызывает снижение производительности. Я полагаю, что это потому, что чтение из стека происходит быстрее, но регистр ax в качестве адреса источника может указывать на кучу, которая, в свою очередь, может ссылаться на стек, хотя я не уверен, или, возможно, он читает из дублированных данных в куче , Это пример того, что я сейчас использую.

asm (
    "ldp %q[DST1], %q[DST2], [%[SRC]]" "\n"
    : [DST1] "=w" (TMP1), [DST2] "=w" (TMP2)
    : [SRC] "X" (&K2[8])
);

и это то, что Clang расширяет в

ldp q19, q4, [x11]

Но я хочу использовать указатель стека с адресом смещения, автоматически разрешенным из индексированной переменной массива K2. например,

ldp q19, q4, [sp,#32]

Смещения адреса указателя стека в разобранном коде не являются смежными, поэтому я не могу просто жестко закодировать регистр sp и ввести смещение для загрузки последовательных данных. Это связано с тем, что Clang 6 объединяет идентичные значения в других массивах, используемых другими функциями, в стек.

GCC имеет машинные ограничения aarch64, такие как k , которые предназначены для регистра указателя стека (sp) и Ump , которые предназначены для адресов команд stp и ldp store / load pair, которые я никогда не работал ни над GCC, ни над Clang, последний не имеет эквивалентных ограничений в своей редкой документации.

Я предпочитаю использовать Clang 6, поскольку он генерирует код, который на 6% быстрее, чем GCC 8, потому что он упорядочивает большинство инструкций в цикле, критичном к производительности, для правильного дублирования.

Можно ли в любом случае ввести массив с индексом в качестве входных данных для встроенной сборки и автоматически преобразовать его в указатель стека с адресом смещения в Clang 6?

1 Ответ

1 голос
/ 28 апреля 2019

Вы пытались использовать операнд источника памяти, например [SRC] "m" (K2[8])?Без этого вы даже не сказали компилятору, что содержимое памяти также является входом для встроенного asm, так что это может изменить ваш asm в отношении.сохраняет или выполняет удаление из мертвого хранилища.

Разрешение компилятору выбрать режим адресации - это целая точка "m" операндов.

...