Skip to content

Instantly share code, notes, and snippets.

@Idorobots
Created June 15, 2012 19:32
Show Gist options
  • Save Idorobots/2938338 to your computer and use it in GitHub Desktop.
Save Idorobots/2938338 to your computer and use it in GitHub Desktop.
Pearson corelation in assembly
# Params:
.equ x, 8
.equ y, 12
.equ n, 16
# Data:
.data
xm: .double 0.0
ym: .double 0.0
# Function
.text
.type pear,@function
.global pear
pear:
pushl %ebp
movl %esp, %ebp
movl x(%ebp), %esi
movl y(%ebp), %edi
finit
fldz
fstpl xm # xm = 0
fldz
fstpl ym # ym = 0
movl n(%ebp), %ecx
fldl xm # xm
fldl ym # ym | xm
mean_loop:
fldl -8(%esi, %ecx, 8) # x | ym | xm
faddp %st(2) # ym | xm + x
fldl -8(%edi, %ecx, 8) # y | ym | xm + x
faddp %st(1) # ym + y | xm + x
loop mean_loop
fidiv n(%ebp) # ym/n | xm
fstpl ym # xm
fidiv n(%ebp) # xm/n
fstpl xm #
movl n(%ebp), %ecx
fldz # sum
sum_loop:
fldl -8(%esi, %ecx, 8) # x | sum
fldl xm # xm | x | sum
fsubp # x - xm | sum
fldl -8(%edi, %ecx, 8) # y | x - xm | sum
fldl ym # ym | y | x - xm | sum
fsubp # y - ym | x - xm | sum
fmulp # (y - ym)(x - xm) | sum
faddp # sum + (x - xm)(y - ym)
loop sum_loop
movl n(%ebp), %ecx
fldz # xsq | sum
square_loop1:
fldl -8(%esi, %ecx, 8) # x | xsq | sum
fldl xm # xm | x | xsq | sum
fsubp # x - xm | xsq | sum
fmul %st # (x - xm)^2 | xsq | sum
faddp # xsq + (x - xm)^2 | sum
loop square_loop1
fsqrt # xsq | sum
movl n(%ebp), %ecx
fldz # ysq | xsq | sum
square_loop2:
fldl -8(%edi, %ecx, 8) # y | ysq | xsq | sum
fldl ym # ym | y | ysq | xsq | sum
fsubp # y - ym | ysq | xsq | sum
fmul %st # (y - ym)^2 | ysq | xsq | sum
faddp # ysq + (y - ym)^2 | xsq | sum
loop square_loop2
fsqrt # ysq | xsq | sum
fmulp # ysq * xsq | sum
fdivrp # sum / (yqs * xsq)
end:
leave
ret
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment