64 bites alkalmazásunk sok kódot tartalmaz (többek között szabványos könyvtárakban), amelyek SSE módban xmm0-xmm7 regisztereket használnak.
Gyors memóriamásolást szeretnék megvalósítani ymm regiszterekkel. Nem tudom módosítani az összes kódot, amely xmm regisztereket használ a VEX előtag hozzáadásához, és úgy gondolom, hogy ez nem praktikus, mivel növeli a kód méretét, és lelassíthatja a futását, mivel a CPU-nak nagyobb utasításokat kell dekódolnia .
Csupán két ymm regisztert (és esetleg zmm-t - az ígéretek szerint még idén elérhetővé válnak a zmm-t támogató megfizethető processzorok) szeretnék használni a gyors memóriamásoláshoz.
A kérdés a következő: hogyan kell használni az ymm regisztereket, de elkerülni az átmeneti büntetéseket?
A büntetés akkor következik be, ha csak ymm8-ymm15 regisztereket használok (nem ymm0-ymm7)? Az SSE-nek eredetileg nyolc 128 bites regisztere volt (xmm0-xmm7), de 64 bites módban (xmm8-xmm15) is elérhetők a nem VEX előtagú utasításokhoz. Átnéztem azonban a 64 bites alkalmazásunkat, és csak xmm0-xmm7-et használ, mivel van 32 bites verziója is, majdnem ugyanazzal a kóddal. A büntetés csak akkor következik be, ha a CPU valójában egy xmm regisztert próbál használni, amelyet korábban ymm-ként használtak, és amelynek egyike magasabb, 128 bites, nem nulla? Nem jobb az általam használt ymm regisztereket nullázni a gyors memóriamásolás után? Például egyszer egy ymm regisztert használtam 32 bájt memória másolására – mi a leggyorsabb módja annak nullázásának? Elég gyors a "vpxor ymm15, ymm15, ymm15"? (AFAIK, a vpxor a 3 ALU végrehajtási port bármelyikén végrehajtható, p0/p1/p5, míg a vxorpd csak p5-ön). Nem lenne itt az ideje nullázni, mint amennyit csak 32 bájt memória másolására használnánk?