format PE GUI
entry start

include 'win32a.inc'

section '.text' code readable writable executable

X equ xmm0
Y equ xmm1
u equ xmm2
v equ xmm3


method1:
		mov edx,1000
lp:		mov ecx,40
		movaps xmm0,dqword[esi+16*2]
		movaps xmm1,dqword[esi+16*3]
align 16
	@@:					    ; 0      1      2    3
						    ;----------------------
		movaps	xmm3, dqword[esi]	    ; X      Y           2
		mulpd	xmm3, xmm1		    ; X      Y           2Y
		mulpd	xmm1, xmm1		    ; X      YY          2Y
		mulpd	xmm3, xmm0		    ; X      YY          2XY
		mulpd	xmm0, xmm0		    ; XX     YY          2XY
		movaps	xmm2, xmm0		    ; XX     YY     XX   2XY
		subpd	xmm0, xmm1		    ; XX-YY  YY     XX   2XY
		addpd	xmm1, xmm2		    ; XX-YY  XX+YY  XX   2XY
		addpd	xmm0, dqword[esi+16*2]	    ; newX   XX+YY  XX   2XY
		movaps	dqword[esi+16*1],xmm1	    ; newX   XX+YY  XX   2XY
		movaps	xmm1, dqword[esi+16*3]	    ; newX   y      XX   2XY
		addpd	xmm1, xmm3		    ; newX   newY

		dec ecx
		jnz @b
		dec edx
		jnz lp
		ret


method2:
		mov edx,1000
lp2:		mov ecx,40
		movaps xmm0,dqword[esi+16*2]
		movaps xmm1,dqword[esi+16*3]
align 16
	@@:					    ; 0    1     2      3
						    ;-----------------------
		movaps xmm3,xmm1		    ; X      Y            Y
		mulpd  xmm3,xmm1		    ; X      Y            YY
		addpd  xmm1,xmm1		    ; X      2Y           YY
		mulpd  xmm1,xmm0		    ; X      2XY          YY
		addpd  xmm1,dqword[esi+16*3]	    ; X      newY         YY
		mulpd  xmm0,xmm0		    ; XX     newY         YY
		movaps xmm2,xmm0		    ; XX     newY  XX     YY
		addpd  xmm2,xmm3		    ; XX     newY  XX+YY  YY
		movaps dqword[esi+16*1],xmm2	    ; XX     newY  XX+YY  YY
		subpd  xmm0,xmm3		    ; XX-YY  newY  XX+YY  YY
		addpd  xmm0,dqword[esi+16*2]	    ; newY   newY  XX+YY  YY

		dec ecx
		jnz @b
		dec edx
		jnz lp2
		ret



start:
      invoke QueryPerformanceCounter,Time1
	lea  esi,[twos]
	call method1
      invoke QueryPerformanceCounter,Time2

	mov  eax,[Time2]
	sub  eax,[Time1]

      invoke sprintf,Message,MessageFormat,eax
      invoke MessageBoxA,0,Message,Caption,0
      invoke ExitProcess,0



section '.data' data readable writeable


 MessageFormat db '%i',0
 Message db 64 dup 0
 Caption db 'Timing:',0

align 16
 twos dq 2.0,2.0
 state dq ?,?
 x dq 0.1234234589756,-0.92345458763345
 y dq -0.34234589756,0.565458763345


 Time1 dd ?
 Time2 dd ?


section ',idata' import data readable writable

library kernel,'KERNEL32.DLL',\
	user,'USER32.DLL',\
	msvcrt,'MSVCRT.DLL'

import kernel,\
       ExitProcess,'ExitProcess',\
       QueryPerformanceCounter,'QueryPerformanceCounter'


import user,\
       MessageBoxA,'MessageBoxA'

import msvcrt,\
       sprintf,'sprintf'