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)