pshub は pshufw/pshufdのようにimm8がつかないんだが
どんな命令なんだ?
678 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/04(土) 20:39:25 ID:0xg7Kp7s
+ 90:0f 38 00 01[ ]+pshufb \(%ecx\),%mm0
+ 94:0f 38 00 c1[ ]+pshufb %mm1,%mm0
+ 98:66 0f 38 00 01[ ]+pshufb \(%ecx\),%xmm0
+ 9d:66 0f 38 00 c1[ ]+pshufb %xmm1,%xmm0
俺はこんなオペレーションかと思った(MM版の場合)
tmp = dest
for(int i = 0; i < 8; i++) { dest[i] = tmp[ (ecx >> (i * 4)) * 0x0F ]; }
でも汎用レジスタって4バイトだから各バイトの順番表すとして8個しか順番保てなくね?
ひょっとしてxmm版はmm版2個くっつけただけの糞命令?
xmm版がまともなことを期待しますよ。
>>677 もしAltiVec的なvector permute命令だとすると,二つ目の引数に行き先の位置が書いてあって
abcdefghijklmnop, 03 05 01 12 04 08 02 11 09 10 06 13 15 00 07 14
-> ncgaebkofijhdlpm
とバイト単位で並べ替える命令すかね。。。
エンコードは
(66) 0F 38 ?? MOD/RM
だから
pshufb mm1, mm2/mem64
pshufb xmm1, xmm2/mem128
だろ
682 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/04(土) 20:51:20 ID:0xg7Kp7s
失敬。直感でアドレスかと思った。
それならこれでOKだね。
MM版
tmp = dest ;
for(int i = 0; i < 8; i++) {
dest[i] = tmp[src[i]];
}
XMM版
tmp = dest ;
for(int i = 0; i < 16; i++) {
dest[i] = tmp[src[i]];
}
683 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/04(土) 20:52:26 ID:0xg7Kp7s
×アドレスかと
○レジスタ即値かと
ってことは
VPERM移植ktkr!!!!
今回のSPECはそのSSE4を使ったものなのかな?
685 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/04(土) 20:58:03 ID:0xg7Kp7s
687 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/04(土) 21:02:05 ID:0xg7Kp7s
なるほど。
完璧なVPERM移植は命令フォーマット的に無理すね。