こんにちは。
かじり程度で、mmx/sseを使用した事があるだけなのですが・・・。一応お話だけでも。
乗算の方は色々有りすぎて、分からないのですが、
>>8bit→32bitを行う関数
の方は pinsrw と言う命令が、xmm/mmレジスタの任意の場所に向かってデータを置けるので、其れを利用して並べると言うのなら出来ます。
対応する関数は、
PINSRW __m64 _mm_insert_pi16 (__m64 a, int d, int n)
PINSRW __m128i _mm_insert_epi16 ( __m128i a, int b, int imm)
ですが、ストレートに書いてしまった方が楽だと思います。
アラはあるとは思いますが、其処は勘弁です。本当に早いかどうかは不明です・・・。
// simdblast.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#include "emmintrin.h"
__m128i ui8_to_i32(const unsigned __int8 buf_i8[4])
{
__declspec(align(16)) __m128i mem;
__asm
{
//pushad
xor ecx, ecx
mov esi, buf_i8
mov eax, [esi]
mov cl, al
pinsrw xmm0, ecx, 0
mov cl, ah
pinsrw xmm0, ecx, 2
shr eax, 16
mov cl, al
pinsrw xmm0, ecx, 4
mov cl, ah
pinsrw xmm0, ecx, 6
movaps mem, xmm0
//movups mem, xmm0
//popad
emms
}
return mem;
}
int _tmain(int argc, _TCHAR* argv[])
{
__declspec(align(16)) __m128i a = {5,6,7,8};
__declspec(align(16)) __m128i b = {1,2,3,4};
::printf("1バイト\n");
for(int i = 0; i < 4; ++i)
{
::printf("[a : %d][b : %d]\n", a.m128i_u8[i], b.m128i_u8[i]);
}
//8bit→32bitへ変換
a = ::ui8_to_i32(a.m128i_u8);
b = ::ui8_to_i32(b.m128i_u8);
::printf("4バイト\n");
for(int i = 0; i < 4; ++i)
{
::printf("[a : %d][b : %d]\n", a.m128i_i32[i], b.m128i_i32[i]);
}
return 0;
}
お礼
御礼が遅くなって申し訳ありません。 ソースまで紹介していただき非常に助かりました。 何とか組めそうです。 本当にありがとうございました。