GCC Extended ASM синтаксис: загрузить 128-битное расположение памяти в качестве источника - PullRequest
4 голосов
/ 02 февраля 2010

GCC генерирует этот код для шаффла () ниже:

movaps xmm0,XMMWORD PTR [rip+0x125]
pshufb xmm4,xmm0

В идеале это должно быть:

pshufb xmm4,XMMWORD PTR [rip+0x125]

Что такое расширенный синтаксис ASM для генерации этой отдельной инструкции?

Большое спасибо, Адам

PS: закомментированное внутреннее генерирует оптимальный код для этого примера. В общем случае это не работает (GCC может генерировать ненужные копии регистров при наличии глобальных переменных регистров).

#include <stdint.h>

typedef int8_t xmm_t __attribute__ ((vector_size (16)));
const xmm_t xmm_shuf={128, 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15};
register xmm_t xmm __asm__("xmm4");

#define NTL ".intel_syntax noprefix\n"
#define ATT ".att_syntax\n"

void shuffle() {
  //xmm=__builtin_ia32_pshufb128(xmm, xmm_shuf);
  __asm__(NTL"pshufb %0, %1\n"ATT : "=x" (xmm) : "x" (xmm_shuf));
}

int main() {
}

$ gcc -Os -std = gnu99 -msse4.1-преобразование вектора-льна

0000000000400494 <shuffle>:
  400494:       0f 28 05 25 01 00 00    movaps xmm0,XMMWORD PTR [rip+0x125]        # 4005c0 &lt;xmm_shuf+0x10&gt;
  40049b:       66 0f 38 00 e0          pshufb xmm4,xmm0
  4004a0:       c3                      ret   

1 Ответ

5 голосов
/ 02 февраля 2010

Измените ограничение входного операнда на "xm", чтобы в дополнение к регистрам SSE разрешалось размещение памяти.

Однако, когда я тестировал его, компилятор генерировал код, который не соответствует синтаксису Intel. Итак, в конце концов, это то, что я использовал:

__asm__("pshufb %1, %0" : "+x" (xmm) : "xm" (xmm_shuf));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...