Из SSE3 в SSE1. Asm
Код:
{$APPTYPE CONSOLE}
const
n = 8; // столбцов
m = 8; // строк
var
a: array[1..n,1..m] of smallint; // матрица
c: array[1..m] of smallint; // вектор
d,e: array[1..m] of integer; // результат
i,j: integer;
begin
for i:=1 to n do
for j:=1 to m do
a[i,j]:=random(128);
for i:=1 to m do
c[i]:=random(128);
for i:=1 to n do
begin
d[i]:=0;
for j:=1 to m do
inc(d[i],a[i,j]*c[j]);
end;
asm
mov eax,(m*n-m)*2
mov ecx,n
@1:pxor mm0,mm0
mov edx,m*2
@2:movq mm1,qword[a+eax+edx-8]
pmaddwd mm1,qword[c+edx-8]
paddd mm0,mm1
sub edx,8
jnz @2
phaddd mm0,mm0
movd dword[e+ecx*4-4],mm0
sub eax,m*2
loop @1
end;
writeln('delphi':6,' ','asm':6);
for i:=1 to m do
writeln(d[i]:6,' : ',e[i]:6);
readln;
end.
const
n = 8; // столбцов
m = 8; // строк
var
a: array[1..n,1..m] of smallint; // матрица
c: array[1..m] of smallint; // вектор
d,e: array[1..m] of integer; // результат
i,j: integer;
begin
for i:=1 to n do
for j:=1 to m do
a[i,j]:=random(128);
for i:=1 to m do
c[i]:=random(128);
for i:=1 to n do
begin
d[i]:=0;
for j:=1 to m do
inc(d[i],a[i,j]*c[j]);
end;
asm
mov eax,(m*n-m)*2
mov ecx,n
@1:pxor mm0,mm0
mov edx,m*2
@2:movq mm1,qword[a+eax+edx-8]
pmaddwd mm1,qword[c+edx-8]
paddd mm0,mm1
sub edx,8
jnz @2
phaddd mm0,mm0
movd dword[e+ecx*4-4],mm0
sub eax,m*2
loop @1
end;
writeln('delphi':6,' ','asm':6);
for i:=1 to m do
writeln(d[i]:6,' : ',e[i]:6);
readln;
end.
был бы очень признателен если кто-нибудь помог переписать ее под SSE1 инструкции.
как я понимаю, вместо mm0 и mm1 будет хmm0 и хmm1;
потом заменить окончания d на s где это возможно( например, movd на movs );
по поводу phaddd не знаю, скорее всего его нужно заменять несколькими строками кода, но все мои попытки проделать вышесказанное оказались не особо рабочими.
это не sse3 а mmx
но вопрос все равно открыт... код выше нужно переделать под SSE1( здесь точно не напутал )
sse3 тут только одна комманда - phaddd. (точнее она даже не sse3 а SSSE3 ). работа комманды такая на входе A(A0 A1 A2 A3), B(B0 B1 B2 B3) на выходе A(A0+A1 A2+A3 B0+B1 B2+B3)
можете подсказать как, хотя бы примерно, могла выглядеть замена?