Существуют ли какие-либо инструкции регистров SIMD / вектора, где регистр ymm указан в общем регистре (или регистре SIMD), а не в самой инструкции?
По сути, я пытаюсь написать функцию, которая сохраняет любую серию последовательных регистров ymm в локальный фрейм. Вот идея, за исключением того, что я придумываю то, что считаю полуправдоподобным вымышленным синтаксисом для инструкции, которую ищу.
.text
.align 64
funcname:
orq %rcx, %rcx # is register count <= 0 ???
jle funcdone # # of registers to save is <= 0
xorq %rax, %rax # rax = 0 == vector save element #
funcloop:
vmovapd %ymm(%rsi), (%rdi, %rax) # save ymm?? to address rdi + rax
addq $32, %rax # each ymm vector is 32-bytes
loop funcloop # --rcx; if (rcx > 0) { goto funcloop }
funcdone:
ret
Инструкция vmovapd
- странная инструкция, которая делает то, что я ищу. Я уверен, что никогда не видел инструкции, которая выглядела бы так, но это не значит, что нет какой-то необычной инструкции, которая делает то, что мне нужно.
Или, может быть, инструкция будет выглядеть так:
vmovapd %rsi, (%rdi, %rax)
vmovapd (%rsi), (%rdi, %rax)
Другой альтернативой могут быть биты с 0 по 15 в %rsi
, соответствующие векторным регистрам с ymm00
по ymm15
, и регистр, соответствующий самому низкому установленному биту, сохраняется (или сохраняются все регистры «установленный бит» ymm).
Кстати, для того, что мне нужно выполнить, самомодифицирующийся код не вариант.
VGATHER
, так это возможность выполнять маскированную загрузку (подмножество составляющих «слов») одногоzmm
reg. Т.е. вы можете выразить что-то вродеzmm0
, загрузитьwords[]
из адресаaX[]
, т.е. предоставить массив смещений указателя, чтобы загрузить / сохранить каждую составляющую вектора с / по другому адресу (_mm512_*gather_*()
/_mm512_scatter*_*()
внутренняя функция). Чего до сих пор не существует, так это возможности загружать несколько регистров с помощью одной инструкции. - person FrankH.   schedule 05.02.2014