Для выполнения арифметических действий над числами с плавающей точкой расширения SSE предоставляет ряд инструкций:
addss и addsd: сложение
subss и subsd: вычитание
mulss и mulsd: умножение
divss и divsd: деление
minss и minsd: вычисляют минимальное значение двух операндов, сохраняя минимальное значение в первом операнде.
maxss и maxsd: вычисляют максимальное значение двух операндов, сохраняя минимальное значение в первом операнде.
sqrtss и sqrtsd: вычисляют квадратный корень второго операнда и сохраняют результат в первый операнд
rcpss и rcpsd: вычисляют обратное значение второго операнда, сохраняя результат в первый операнд
rsqrtss и rsqrtsd: вычисляют обратное значение квадратного корня второго операнда, сохраняя результат в первый операнд
addss xmmn, xmmn addss xmmn, mem32 addsd xmmn, xmmn addsd xmmn, mem64 subss xmmn, xmmn subss xmmn, mem32 subsd xmmn, xmmn subsd xmmn, mem64 mulss xmmn, xmmn mulss xmmn, mem32 mulsd xmmn, xmmn mulsd xmmn, mem64 divss xmmn, xmmn divss xmmn, mem32 divsd xmmn, xmmn divsd xmmn, mem64 minss xmmn, xmmn minss xmmn, mem32 minsd xmmn, xmmn minsd xmmn, mem64 maxss xmmn, xmmn maxss xmmn, mem32 maxsd xmmn, xmmn maxsd xmmn, mem64 sqrtss xmmn, xmmn sqrtss xmmn, mem32 sqrtsd xmmn, xmmn sqrtsd xmmn, mem64 rcpss xmmn, xmmn rcpss xmmn, mem32 rsqrtss xmmn, xmmn rsqrtss xmmn, mem32
Первый операнд всегда должен быть регистром XMM. Например, сложим два числа:
.data double1 real8 3.4 double2 real8 6.6 .code main proc movsd xmm0, double1 ; помещаем в xmm0 число double1 movsd xmm1, double2 ; помещаем в xmm1 число double2 addsd xmm0, xmm1 ; XMM0 - XMM0 + XMM1 cvtsd2si rax, xmm0 ; из xmm0 преобразуем в целое число и помещаем в rax ret main endp end