Скачиваний:
50
Добавлен:
15.09.2014
Размер:
815.62 Кб
Скачать

3.2. Арифметические команды

Арифметические команды SIMD выполняют сложение, вычитание, умножение и деление данных одинарной точности с плавающей точкой.

Входной (второй) операнд этих команд может располагаться либо в SIMD‑регистре, либо в памяти. Выходной (первый) операнд должен находиться в SIMD-регистре. Арифметические команды поддерживают как параллельные, так и скалярные операции.

3.2.1. Команды упакованного/скалярного сложения и вычитания

Команды ADDPS (Add packed, single-precision, floating-point) и SUBPS (Subtract packed, single-precision, floating-point) складывают или вычитают четыре пары упакованных операндов одинарной точности с плавающей точкой.

xmm1[31-0] = xmm1[31-0] + xmm2/m128[31-0];

xmm1[63-32] = xmm1[63-32] + xmm2/m128[63-32];

xmm1[95-64] = xmm1[95-64] + xmm2/m128[95-64];

xmm1[127-96] = xmm1[127-96] + xmm2/m128[127-96];

Команды ADDSS (Add scalar single-precision, floating-point) и SUBSS (Subtract scalar single-precision, floating-point) складывают или вычитают младшую пару упакованных операндов одинарной точности с плавающей точкой. Остальные элементы регистра не меняются.

xmm1[31-0] = xmm1[31-0] + xmm2/m32[31-0];

xmm1[63-32] = xmm1[63-32];

xmm1[95-64] = xmm1[95-64];

xmm1[127-96] = xmm1[127-96];

3.2.2. Команды упакованного/скалярного умножения и деления

Команды MULPS (Multiply packed, single-precision, floating-point) и DIVPS (Divide packed, single-precision, floating-point) умножают или делят четыре пары упакованных операндов одинарной точности с плавающей точкой.

xmm1[31-0] = xmm1[31-0] * xmm2/m128[31-0];

xmm1[63-32] = xmm1[63-32] * xmm2/m128[63-32];

xmm1[95-64] = xmm1[95-64] * xmm2/m128[95-64];

xmm1[127-96] = xmm1[127-96] * xmm2/m128[127-96];

Команды MULSS (Multiply scalar single-precision, floating-point) и DIVSS (Multiply scalar single-precision, floating-point) умножают или делят младшую пару упакованных операндов одинарной точности с плавающей точкой. Остальные элементы регистра не меняются.

xmm1[31-0] = xmm1[31-0] * xmm2/m32[31-0];

xmm1[63-32] = xmm1[63-32];

xmm1[95-64] = xmm1[95-64];

xmm1[127-96] =xmm1[127-96];

Команды RCPPS и RCPSS (ReCiProcal Packed/Scalar Single-precision float point) нахождения обратного числа делят единицу на один операнд (четыре упакованных одинарной точности с плавающей точкой или младший упакованный операнд одинарной точности) и записывают результат в другой операнд.

RCPPS:

xmm1[31-0] = approx (1.0 / (xmm2/m128[31-0]));

xmm1[63-32] = approx (1.0 / (xmm2/m128[63-32]));

xmm1[95-64] = approx (1.0 / (xmm2/m128[95-64]));

xmm1[127-96] = approx (1.0 / (xmm2/m128[127-96]));

RCPSS:

xmm1[31-0] = approx (1.0 / (xmm2/m32[31-0]));

xmm1[63-32] = xmm1[63-32];

xmm1[95-64] = xmm1[95-64];

xmm1[127-96] = xmm1[127-96];

3.2.3. Команды упакованного/скалярного вычисления квадратных корней

Команды вычисления квадратных корней SQRTPS (Square root packed, single‑precision, floating-point) и SQRTSS (Square root scalar single-precision, floating‑point) определяют арифметические значения квадратного корня для чисел, упакованных во входной (второй) операнд, и записывают результаты в элементы выходного операнда. Входной операнд для этих команд может располагаться либо в регистре, либо в памяти. Выходной операнд должен обязательно находиться в SIMD-регистре. Команды вычисления квадратных корней поддерживают как параллельные, так и скалярные операции (SQRTPS и SQRTSS).

SQRTPS:

xmm1[31-0] = sqrt( xmm2/m128[31-0] );

xmm1[63-32] = sqrt( xmm2/m128[63-32] );

xmm1[95-64] = sqrt( xmm2/m128[95-64] );

xmm1[127-96] = sqrt( xmm2/m128[127-96] );

SQRTSS:

xmm1[31-0] = sqrt( xmm2/m128[31-0] );

xmm1[63-32] = xmm1[63-32];

xmm1[95-64] = xmm1[95-64];

xmm1[127-96] = xmm1[127-96];

Команды RSQRTPS и RSQRTSS делают то же, но еще и обращают результат (единицу делят на ответ).

RSQRTPS:

xmm1[31-0] = approx (1.0 / sqrt(xmm2/m128[31-0]));

xmm1[63-32] = approx (1.0 / sqrt(xmm2/m128[63-32]));

xmm1[95-64] = approx (1.0 / sqrt(xmm2/m128[95-64]));

xmm1[127-96] = approx (1.0 / sqrt(xmm2/m128[127-96]));

RSQRTSS:

xmm1[31-0] = approx (1.0 / sqrt(xmm2/m32[31-0]));

xmm1[63-32] = xmm1[63-32];

xmm1[95-64] = xmm1[95-64];

xmm1[127-96] = xmm1[127-96];

Соседние файлы в папке Лекции