SSE2 и структура вставки встроенной сборки - PullRequest
1 голос
/ 07 июня 2019

Я начал изучать команды SIMD, используя смесь кода c и встроенной сборки gcc. Я пытаюсь понять, как я могу добавить значения из структуры в плавающий указатель (xmm0). Я не могу понять, как правильно это сделать.

Я динамически выделил одну структуру и назвал ее tmp. Теперь я хочу добавить значения struct к плавающему указателю, используя только инструкции SSE2.

#include <stdio.h>
#include <stdlib.h>

struct Test{
  unsigned char a;
  unsigned char b;
  unsigned char c;
  unsigned char d;
} test;

int main()
{
  struct Test *tmp = malloc(sizeof(test));
  tmp->a = 10;
  tmp->b = 2;
  tmp->c = 3;
  tmp->d = 4;
  asm ( "movapd [tmp], %%xmm0;"
  );
  free(tmp);
  return 0;
}

После компиляции этого кода я получаю сообщение об ошибке: "Ошибка: неверный символ '[' начальный операнд 1` [tmp] '"

Я хотел бы знать, что я делаю неправильно и как вставить значения структуры в плавающий указатель.

1 Ответ

4 голосов
/ 07 июня 2019

sizeof (Test) == 4. Это не будет хорошо играть с movapd!Также имейте в виду, что вызовы malloc не всегда возвращают 16-байтовую выровненную память, поэтому вы, вероятно, захотите использовать _mm_malloc (или эквивалентный).

Добавляя к предыдущим комментариям, либо используйте intrinsics (и бросьте код в godbolt, чтобы увидеть полученный ASM / машинный код) , либо напишите весь метод в ASM.Помимо того, что встроенный ASM может быть читаемым примерно на 100 футов, как газета, он не переносим между компиляторами и просто не разрешен на некоторых компиляторах (например, VC ++).Встроенные являются предпочтительным вариантом.

...