Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Из SSE3 в SSE1. Asm

87K
24 декабря 2012 года
3 / / 24.12.2012
Всем привет, имеется программа, умножающая матрицу на вектор:

Код:
{$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.
ассемблерная вставка в ней написана с использованием SSE3 инструкций;
был бы очень признателен если кто-нибудь помог переписать ее под SSE1 инструкции.

как я понимаю, вместо mm0 и mm1 будет хmm0 и хmm1;
потом заменить окончания d на s где это возможно( например, movd на movs );
по поводу phaddd не знаю, скорее всего его нужно заменять несколькими строками кода, но все мои попытки проделать вышесказанное оказались не особо рабочими.
277
25 декабря 2012 года
arrjj
1.7K / / 26.01.2011
это не sse3 а mmx
87K
25 декабря 2012 года
3 / / 24.12.2012
черт, вы правы.. просто препод довольно мутно объяснял эту тему, вот я и запутался(
но вопрос все равно открыт... код выше нужно переделать под SSE1( здесь точно не напутал )
277
25 декабря 2012 года
arrjj
1.7K / / 26.01.2011
sse инструкции умеют работать с mmx регистрами

sse3 тут только одна комманда - phaddd. (точнее она даже не sse3 а SSSE3 ). работа комманды такая на входе A(A0 A1 A2 A3), B(B0 B1 B2 B3) на выходе A(A0+A1 A2+A3 B0+B1 B2+B3)
87K
25 декабря 2012 года
3 / / 24.12.2012
то есть посути, достаточно заменить команду phaddd и получится SSE1 код?

можете подсказать как, хотя бы примерно, могла выглядеть замена?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог