cp58
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору netfil Цитата: был бы очень признателен если кто-нибудь помог переписать ее под SSE1 инструкции. | Вы уверены что именно SSE1? Цитата: ассемблерная вставка в ней написана с использованием SSE3 инструкций; | Тут и SSSE3 присутствует. Перевести на SSE1 можно несколькими способами. Можно, например, перевести целочисленный тип в тип с плавающей запятой и использовать доступные инструкции, вроде mulps, addps или mulss, addss для скалярных операций; а ниже показан код, использующий операции для целочисленных данных. Работает для матриц с небольшим значением элементов, чтобы работало с большими необходимо произвести считывание поэлементно, вместо операции psadbw, также если размерность вектора будет отличаться от 8, то необходимо добавить второй цикл. Код: __asm__ volatile ( "pinsrw $0, (%1), %%xmm2\n\t" "pinsrw $1, 2(%1), %%xmm2\n\t" "pinsrw $2, 4(%1), %%xmm2\n\t" "pinsrw $3, 6(%1), %%xmm2\n\t" "pinsrw $4, 8(%1), %%xmm2\n\t" "pinsrw $5, 10(%1), %%xmm2\n\t" "pinsrw $6, 12(%1), %%xmm2\n\t" "pinsrw $7, 14(%1), %%xmm2\n\t" "pxor %%xmm1, %%xmm1\n\t" "movl %2, %%ecx\n\t" "b:\n\t" "xorl %%edx, %%edx\n\t" "pxor %%xmm0, %%xmm0\n\t" "pinsrw $0, (%0), %%xmm0\n\t" "pinsrw $1, 2(%0), %%xmm0\n\t" "pinsrw $2, 4(%0), %%xmm0\n\t" "pinsrw $3, 6(%0), %%xmm0\n\t" "pinsrw $4, 8(%0), %%xmm0\n\t" "pinsrw $5, 10(%0), %%xmm0\n\t" "pinsrw $6, 12(%0), %%xmm0\n\t" "pinsrw $7, 14(%0), %%xmm0\n\t" "pmullw %%xmm2, %%xmm0\n\t" "psadbw %%xmm1, %%xmm0\n\t" "pextrw $0, %%xmm0, %%eax\n\t" "addl %%eax, %%edx\n\t" "pextrw $4, %%xmm0, %%eax\n\t" "addl %%eax, %%edx\n\t" "movl %%edx, (%3)\n\t" "addl $0x10, %0\n\t" "addl $4, %3\n\t" "dec %%ecx\n\t" "test %%ecx, %%ecx\n\t" "jne b\n\t" : :"D"(mx),"S"(v),"i"(m),"r"(e) :"eax", "edx", "ecx", "xmm0", "xmm1", "xmm2" ); | P.S. Так все таки матрицу на вектор или вектор на матрицу? ne_viens Это SSE2. |