Witam, mam następujący problem:
chcę dodać do każdej z 4 liczb zapisanych w rejestrze XMM (w formacie float), liczbę zmienno-przecinkową zapisaną jako double w innym rejestrze XMM. Próbowałem różnych konwersji oraz mnemoników MOV z różnymi przyrostkami, jednak nie daje to żadnych efektów.

To kod mojej funkcji w ASMie

.data
       .equ n, 1000000
       dx: .float 0
 
.bss
       .lcomm iteratory, 16
.text
.global calka
.type calka, @function
calka:
pushq %rbp
movq %rsp, %rbp
movsd %xmm0, -8(%rbp) 			#tutaj mam xp

movsd %xmm1, -16(%rbp) 			#a tu xk
movq $n, -24(%rbp) 			#zmienna n
movq $0, -48(%rbp)			#zeruje pamięć na akumulator

fldl -16(%rbp)	 			#wrzucam na st(0) xp
fsubl -8(%rbp)			        #xk - xp, wynik mam na st(0)

fildl -24(%rbp)	 			#st0 <= n, a wynik na st1
fdivr %st(0), %st(1) 			#st(1) / n ,wynik na st(1)

fistpl -16(%rbp) 			#i z powrotrem
fstl -32(%rbp)
fstl -56(%rbp)	 			#kopia zapasowa zmiennej (dx)
fstl dx
xorl %esi, %esi  			#licznik pętli

#######################################################
petla_for: 
movl %esi, %edi 			#kopia rejestru
incl %edi
movl %edi, iteratory

incl %edi
movl %edi, iteratory + 4

incl %edi
movl %edi, iteratory + 8

incl %edi
movl %edi, iteratory + 12

movd iteratory, %xmm0

movd dx, %xmm1

punpckldq %xmm1, %xmm1  		#wypelnianie rejestru stala wartoscia
punpckldq %xmm1, %xmm1

mulps %xmm1, %xmm0    			#wynik mno?enia mam na xmm0

#kolejne propagowanie, tym razem warto?ci xp
movd -8(%rbp), %xmm1

punpckldq %xmm1, %xmm1  		#wypelnianie rejestru stala wartoscia
punpckldq %xmm1, %xmm1

addps %xmm1, %xmm0
#wypelneine jedynkami w celu pozniejszego podzielenia
movl $0x3F800000, %eax
movd %eax, %xmm1
punpckldq %xmm1, %xmm1  		#wypelnianie rejestru stala wartoscia
punpckldq %xmm1, %xmm1

divps %xmm1, %xmm0

addps %xmm0, %xmm3

cmpq -24(%rbp), %rsi

addq $4, %rsi				#zwiększanie wartości o 4
jbe petla_for  				#skacz jeśili licznik <= n
########################################################
haddps %xmm3, %xmm3
haddps %xmm3, %xmm3  			#ostateczny wynik
movdqu %xmm3, iteratory

movl iteratory, %eax

imull -56(%rbp), %eax

movl %eax, iteratory

movdqu iteratory, %xmm0
popq %rbp 	

ret 

A tutaj fragment kodu programu głownego napisanego w C, gdzie powyższa funkcja jest inicjalizowana:

double xp = 0.001, xk = 1000, dx, wynik;      
					
extern double calka(double xp_, double xk_);     //funkcja w ASMie
 

Dodam jeszcze, że zadaniem programu jest obliczanie całki metodą prostokątów, a wartość którą chcę rozpropagować po rejestrze XMM1 to "zmienna" XP która znajduje się pod adresem -8(%rbp) oraz w XMM0 (na początku programu)