cpu     x64
bits    64

;// Reader (chunk, size, loops);


global  Reader
;global Time_Offset
extern data

; Note:
; Unix ABI says integer param are put in these registers in this order:
;       rdi, rsi, rdx, rcx, r8, r9

        section .text
;------------------------------------------------------------------------------
; Name:         has_sse2
;
;has_sse2:
;_has_sse2:
;        push    rbx
;        push    rcx
;        push    rdx
;        mov     rax, 1
;        cpuid
;        test    rdx, 0x4000000
;        setnz   al
;        pop     rdx
;        pop     rcx
;        pop     rbx
;        ret

;
;Estimage cycles for non-read
;   rdi = low rsi = hi
;

;Time_Offset:
;	push r10
;	push r11
;        rdtsc
;        mov r10, rax
;        mov r11, rdx
;nop
;        rdtsc
;        sub rax, r10
;        sub rdx, r11
;        mov [rdi], rax
;        mov [rsi], rdx
;        pop     r10
;        pop     r11
;        ret



;------------------------------------------------------------------------------
; Name:         Reader
; Purpose:      Reads 64-bit values sequentially from an area of memory.
; Params:       rdi = ptr to memory area
;               rsi = length in bytes
;               rdx = loops
;               rcx = indx of 1 byte
;               r8 = first cycles
;				r9 = second cycles
;rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, and r15.
;Reader(data, (uint64_t)set_m[num1], (uint64_t)loop_t[num1], (uint64_t )eleven, &low, &hi);
;------------------------------------------------------------------------------

Reader:
        push r10
		push r11
		push r12
		push r13
		push r14
		push r15
		mov r13, rdx
        add     rsi, rdi       ; rsi now points to end.

        rdtsc
        mov r14, rax
        mov r15, rdx
        rdtsc
        sub rax, r14
        sub rdx, r15
        mov r14, rax
        mov r15, rdx

		mov rdx, r13
		mov r13, rcx

.L1:
        mov     r10, rdi

.L2:
        mov     ax, word[r10]
;		mov     rax, word[r10]
;		mov     rax, word[r10]
;		mov     rax, word[r10]
;		mov     rax, word[r10]
;		mov     rax, word[r10]
;		mov     rax, word[r10]
;		mov     rax, word[r10]
;		mov     rax, word[r10]

        add     r10, 1
        cmp     r10, rsi
        jb      .L2

        dec     rdx
        jnz     .L1

		mov     r10, rdi
		add     r10, rcx

		;rcx
		rdtsc
		mov r11, rax
		mov r12, rdx

		mov bx, word[r10]
		;mov bx, word[rdi+rcx+8]
		;mov bx, word[rdi+r13]
		;mov bx, word[rdi+r13]
		;mov bx, word[rdi+r13]
		;mov bx, word[rdi+r13]
		;mov bx, word[rdi+r13]
		;mov bx, word[rdi+r13]
		;mov bx, word[rdi+r13]
		;mov bx, word[rdi+r13]
		;mov bx, word[rdi+r13]

		rdtsc
		sub rax, r11
		sub rdx, r12
		sub rax, r14
		sub rdx, r15
		mov [r8], rax
		mov [r9], rdx

        pop     r10
		pop     r11
		pop     r12
		pop     r13
		pop     r14
		pop     r15
        ret
