Могу ли я сразу переместить 256-битную память из регистров YMM?

Могу ли я сразу переместить 256-битную память из регистров YMM? Если я хочу заполнить регистр xmm, я использую встроенный asm в gcc:

          "movlpd mytest_1(%rip),%xmm1 \n\t"
          "movhpd mytest_1+8(%rip),%xmm1 \n\t"

Можно ли сделать это проще?

Кроме того: та же самая процедура перемещает выровненные или нет 4 четырех слов за 1 шаг к Ymm0? Я ищу обратную сторону Vmovdqa ymm1, mem256 source -> destination.

1 ответ

"movlpd mytest_1(%rip),%xmm1 \n\t"
"movhpd mytest_1+8(%rip),%xmm1 \n\t"

Эти две инструкции могут быть объединены в одну movdqu / movdqa потому что x86 это архитектура Little Endian

"movdqu mytest_1(%rip),%xmm1 \n\t"    // 16-byte unaligned or
"movdqa mytest_1(%rip),%xmm1 \n\t"    // for 16-byte aligned 'mytest_1'

Оба могут также использоваться для передачи 32-битной памяти AVX (vmovdqu / vmovdqa):

"vmovdqu mytest_1(%rip),%ymm1 \n\t"   // 32-byte unaligned or
"vmovdqa mytest_1(%rip),%ymm1 \n\t"   // for 32-byte aligned 'mytest_1'

По поводу второй части вашего вопроса:

Я ищу обратную сторону Vmovdqa ymm1, mem256 source -> destination.

Это работает в обоих направлениях, например, возможные инструкции для vmovdqa:

VMOVDQA ymm1, ymm2/m256   RM   V/V   AVX   Move aligned packed integer values from ymm2/mem to ymm1.
VMOVDQA ymm2/m256, ymm1   MR   V/V   AVX   Move aligned packed integer values from ymm1 to ymm2/mem.
Другие вопросы по тегам