Могу ли я сразу переместить 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.