avx три операнда для sqrt?

Почему инструкция avx sqrt (неупакованная) имеет три операнда?

vsqrtsd xmm1, xmm2, xmm3

Означает ли это что-то вроде xmm1=xmm2=sqrt(xmm3)?

Редактировать: Подробный ответ ниже, но вкратце сборочная линия означает:

xmm1.low  = sqrt(xmm3.low);
xmm1.high = xmm2.high;

person tom    schedule 24.05.2012    source источник


Ответы (1)


Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32, том 2B, стр. 4-407, «SQRTSD — вычисление квадратного корня из скалярного значения с плавающей запятой двойной точности»:

VSQRTSD xmm1, xmm2, xmm3/m64

Вычисляет квадратный корень из младшего значения с плавающей запятой двойной точности в xmm3/m64 и сохраняет результаты в xmm1*. Кроме того, верхнее значение двойной точности с плавающей запятой (биты [127:64]) из xmm2 копируется в xmm1[127:64].

Операция

DEST[63:0] ← SQRT(SRC2[63:0])
DEST[127:64] ← SRC1[127:64]
DEST[VLMAX-1:128] ← 0

Эта инструкция просто следует шаблону других бинарных операций V___SD и V___SS, таких как VSUBSD, которые выполняют

DEST[63:0] ← SRC1[63:0] - SRC2[63:0]
DEST[127:64] ← SRC1[127:64]
DEST[VLMAX-1:128] ← 0

и как VRCPSS xmm1, xmm2, xmm3/32, который выполняет

DEST[31:0] ← APPROXIMATE(1/SRC2[31:0])
DEST[127:32] ← SRC1[127:32]
DEST[VLMAX-1:128] ← 0

Общая форма такая

xmm1.low = f(xmm2.low, xmm3.low);
xmm1.high = xmm2.high,

как описано в Руководстве разработчика программного обеспечения для архитектур Intel® 64 и IA-32, том 1, §11.4.1 «Упакованные и скалярные инструкции с плавающей запятой двойной точности». Для VSQRTSD мы просто определяем f(x, y) = y, игнорируя первый операнд.


*: Примечание. Руководство Intel пишет здесь «xmm2», что является ошибкой.

person kennytm    schedule 24.05.2012
comment
Спасибо за подробное объяснение! Но разве первое предложение не должно быть таким: ... и сохраняет результаты в xmm1? - person tom; 24.05.2012