Сборник по задачам и примерам Assembler

Сложение и умножение двух упакованных ХММ-значений



Сложение и умножение двух упакованных ХММ-значений

Задача — вычислить скалярное произведение двух векторов, каждый из которых состоит из 4 вещественных чисел в коротком формате. Если в качестве таких векторов взять два вектора А и В, то их произведение вычисляется по формуле: АхВ = aoxbo+aixbi+a2xb2+a3xb3- В программной реализации с использованием ХММ-команд это выглядит так, как показано ниже.

:prg10_02.asm - программа вычисления скалярного произведения двух векторов.

.data

xmm_pack_l dd 1.0. 2.0. 3.0. 4.0

xmm_pack_2 dd 5.0. 6.0. 7.0. 8.0

rez_sum dd 0.0 результат сложения .

.code

movaps rxmmO.xrom_pack_l ;RXMM0= 4.0. 3.0, 2.0, 1.0 mulps rxmm0.xinTi_pack_2 :RXMM0= 4.0x8.0. 3.0x7.0. 2.0x6.0, 1.0x5.0 movaps rxmml. rxmmO :RXMM1= 4.0x8.0, 3.0x7.0. 2.0x6.0. 1.0x5.0

shufps rxmml.rxmml.4eh ;RXMM1= 2.0x6.0, 1.0x5.0. 4.0x8.0. 3.0x7.0 addps rxmmO. rxmml :складываем:

;RXMM0= 4.0x8.0. 3.0x7.0. 2.0x6.0, 1.0x5.0

J +

:RXMM1= 2.0x6.0. 1.0x5.0. 4.0x8.0. 3.0x7.0

:RXMM0- 4.0x8.0+2.0x6.0. 3.0x7.0+1.0x5.0, 2.0x6.0+4.0x8.0. 1.0x5.0+3.0x7.0

:или

;RXMM0= 44.0. 26.0, 44.0. 26.0

movaps rxmml, rxmmO :RXMM1= 44.0, 26.0, 44.0, 26.0

shufps rxmml.rxmml.llh :RXMM1= 26,0. 44.0. 26.0. 44.0

addps rxmmO. rxmml :складываем: ;RXMM0= 44.0. 26.0. 44.0, 26.0

; +

;RXMM1= 26.0, 44.0, 26.0, 44.0

:RXMM0= 70.0. 70.0, 70.0, 70.0 сохраняем результат movss rez_sum.rxmm0



Содержание раздела