.intel_syntax noprefix

.data
two: .int 2

.text
.global my_function

############################################################################
##
## Funkcija:
##
## void my_function(float *x, float *y, int n, float *r);
##
## Argumenti funkcije:
##
## -- float * x -- rdi -- adresa prvog vektora
## -- float * y -- rsi -- adresa drugog vektora
## -- int n -- edx -- dimenzija vektora
## -- float * r -- rcx -- adresa na koju se smesta rezultat.
##
############################################################################
my_function:
                        ## Prolog funkcije.
    enter   0, 0

                        ## U rdi smestamo adresu prvog, a u rsi
                        ## adresu drugog vektora. U r8 je adresa rezultata.
                        ## Dimenziju smestamo privremeno u r9 zbog test
                        ## instrukcije koja menja rcx
    mov r8, rcx
    mov r9d, edx
        
                        ## Proverava se da li procesor podrzava SSE instrukcije.
    mov     rax, 1
    cpuid
    test    rdx, 0x2000000
    jz not_supported

                        ## Cuva se sadrzaj SSE registara i registara koprocesora.
    mov     rdx, rsp
    and     rsp, 0xfffffffffffffff0
    sub     rsp, 512
    fxsave  [rsp]


############################################################
##                          CODE                          ##
############################################################







############################################################
                        
                        ## Vraca se prethodni sadrzaj u registre koprocesora i SSE
                        ## registre.
    fxrstor [rsp]
    mov     rsp, rdx

done:
                        ## Epilog funkcije.
    leave
    ret

not_supported:
                        ## Ako SSE instrukcije nisu podrzane, prekidamo program exit(1)
                        ## pozivom.
    mov rax, 1
    mov rbx, 1
    int 0x80
