Конференция "Основная" » Вопрос знатокам asm
 
  • dmk © (15.08.17 18:46) [0]
    С LEA, просо приходится сразу 128 бит писать и выравнивать массив на границу четверного слова. С PINSRD прощеб лишнего не прочитаешь.
    Как будет быстрее с LEA или PINSRD ? Работают оба варианта.


    function Scale(A, B: TVertex; Factor: single): TVertex;
    const
     D: single = 100.0;
     FillXMM: UInt128 = ($0302010003020100, $0302010003020100);

    asm
     .NOFRAME
     movss xmm2, Factor
     divss xmm2, D //F := (Factor / 100.0);
     movdqu xmm3, FillXMM //Маска заполнения регистра
     pshufb xmm2, xmm3 //Размножаем F на весь регистр

     lea rax, [A]
     lea r10, [B]
     movdqu xmm0, [rax]
     movdqu xmm1, [r10]

     //pinsrd xmm0, A.X, 0
     //pinsrd xmm0, A.Y, 1
     //pinsrd xmm0, A.Z, 2
     //pinsrd xmm1, B.X, 0
     //pinsrd xmm1, B.Y, 1
     //pinsrd xmm1, B.Z, 2

     //Вычитаем, умножаем и складываем сразу по 4 значения
     subps xmm1, xmm0 //Вычитаем из вектора B вектор A
     mulps xmm1, xmm2 //Умножаем разницу векторов на фактор
     addps xmm1, xmm0 //к результату добавляем вектор A

     extractps Result.X, xmm1, 0
     extractps Result.Y, xmm1, 1
     extractps Result.Z, xmm1, 2
    end;

  • dmk © (15.08.17 18:58) [1]
    Разница всего 0.5 fps по тесту:
    LEA - 65.7 fps
    PINSRD - 65.2 fps
    Хотя это тоже существенно.
 
Конференция "Основная" » Вопрос знатокам asm
Есть новые Нет новых   [118463   +19][b:0][p:0.001]