Hi, Lo : UInt64
end align 16;
const
CExp : array[3..6] of UInt64 =
( $3fc5555555554855, $3fa5555555553b54,
$3f811112b12b282f, $3f56c16e86e89028 );
C64 : Double = 64.0;
C1of2 : Double= 1/2;
C1of64 : Double = 1/64;
CLogEof2 : UInt64= $3fe62e42fefa39ef; // Ln(2);
CZero : Double = 0.0;
C1 : Double = 1.0;
CSignBitPD: m128 = (Hi:$8000000000000000; Lo:$8000000000000000);
asm
.PARAMS 1
.SAVENV XMM6
.SAVENV XMM7
MOVSD [RBP+050H],XMM0
MOVZX EAX, WORD PTR [RBP+056H]
MOVAPD XMM2, CSignBitPD
MOVAPS XMM4, XMM2
XORPD XMM5, XMM5 // Zero
MOVAPS XMM6, XMM0
ANDNPD XMM2, XMM0 // Abs(X) : XMM2 := (Not XMM2) and XMM0
UCOMISD xmm0, xmm5 // 0.0
JPE @@01
JZ @@Zero
@@01:
AND EAX, 07FF0H // Is X Denormal ?
JZ @@Exit
CMP AX, 07FF0H
JE @@UseEXP
COMISD XMM2, CLogEof2
JC @@ExpMinusOne
@@UseEXP:
MOVSD XMM7, C1
CALL Exp
SUBSD XMM0, XMM7
JMP @@Exit
@@Zero:
MOVAPS XMM0, XMM5 // 0.0
JMP @@Exit
@@ExpMinusOne:
ANDPD XMM4, XMM6 // XMM4 has sign bit.
MOVSD XMM7, C1of2
ORPD XMM7, XMM4
MULSD XMM6, C64
ADDSD XMM6, XMM7
CVTTSD2SI EAX, XMM6
LEA RDX, [CExp]
CVTSI2SD XMM7, EAX
MOVSXD RAX, EAX
ADD RAX, RAX
LEA RCX, [ExpM1Iof64 + 400H]
LEA RCX, [RCX + RAX * 8]
MULSD XMM7, C1of64
MOVSD XMM4, QWORD PTR [rdx]
MOVSD XMM5, QWORD PTR [rdx + 08H]
SUBSD XMM0, XMM7
MOVAPS XMM1, XMM0
MULSD XMM0, XMM0
MOVSD XMM6, QWORD PTR [rdx + 10H]
MOVSD XMM7, QWORD PTR [rdx + 18H]
MOVSD XMM2,[C1of2]
MULSD XMM7, XMM0
MULSD XMM6, XMM0
ADDSD XMM7, XMM5
ADDSD XMM6, XMM4
MOVSD XMM3, [RCX]
MOVSD xmm5, [RCX+08h]
MULSD XMM7, XMM0
MULSD XMM6, XMM1
ADDSD XMM7, XMM6
ADDSD XMM7, XMM2
MULSD XMM7, XMM0
ADDSD XMM5, XMM7
MOVAPS XMM2, XMM1
ADDSD XMM2, XMM7
MOVAPS XMM0, XMM3
MULSD XMM0, XMM2
ADDSD XMM0, XMM5
ADDSD XMM0, XMM1
ADDSD XMM0, XMM3
@@Exit:
end;
что-то вы меня путаете, господа :) MULSD — Multiply Scalar Double-Precision Floating-Point Value
SSE-операции используются для обслуживания младшего числа: Single или Double. SIMD - когда ты обрабатываешь несколько значений.
Ну ты уж SSE совсем от SIMD не отделяй. Есть векторные SSE операции, есть скалярные.
Если векторную операцию применить над регистром, который вычитал одно значение, а результат сохранился тоже в одно значение - не всё ли равно: векторная операция или скалярная? Это детали.
Обсуждают сегодня