Съществуват ли инструкции за 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
и регистърът, съответстващ на най-ниския зададен бит, се запазва (или се записват всички "set bit" ymm регистри).
Между другото, за това, което трябва да постигна, самопроменящият се код не е опция.
VGATHER
, е способността да прави маскирани зареждания към (подмножество от съставните „думи“ на) еднаzmm
рег. т.е. можете да изразите нещо като вzmm0
, заредетеwords[]
от addraX[]
, т.е. подадете масив от отмествания на указателя, за да заредите/съхраните всяка съставна част на вектора от/на различен адрес (_mm512_*gather_*()
/_mm512_scatter*_*()
присъщи). Това, което все още не съществува, е възможността за зареждане на множество правила с една инструкция. - person FrankH.   schedule 05.02.2014