115 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
 | 
						|
include 'format/format.inc'
 | 
						|
 | 
						|
format PE64 NX GUI 5.0
 | 
						|
entry start
 | 
						|
 | 
						|
include 'ext/avx.inc'
 | 
						|
 | 
						|
section '.data' data readable writeable
 | 
						|
 | 
						|
  _title db 'AVX playground',0
 | 
						|
  _error db 'AVX instructions are not supported.',0
 | 
						|
 | 
						|
  x dq 3.14159265389
 | 
						|
 | 
						|
  vector_output:
 | 
						|
    repeat 16, i:0
 | 
						|
	db 'ymm',`i,': %f,%f,%f,%f',13,10
 | 
						|
    end repeat
 | 
						|
    db 0
 | 
						|
 | 
						|
  buffer db 1000h dup ?
 | 
						|
 | 
						|
section '.text' code readable executable
 | 
						|
 | 
						|
  start:
 | 
						|
 | 
						|
	mov	eax,1
 | 
						|
	cpuid
 | 
						|
	and	ecx,18000000h
 | 
						|
	cmp	ecx,18000000h
 | 
						|
	jne	no_AVX
 | 
						|
	xor	ecx,ecx
 | 
						|
	xgetbv
 | 
						|
	and	eax,110b
 | 
						|
	cmp	eax,110b
 | 
						|
	jne	no_AVX
 | 
						|
 | 
						|
	vbroadcastsd	ymm0, [x]
 | 
						|
	vsqrtpd 	ymm1, ymm0
 | 
						|
 | 
						|
	vsubpd		ymm2, ymm0, ymm1
 | 
						|
	vsubpd		ymm3, ymm1, ymm2
 | 
						|
 | 
						|
	vaddpd		xmm4, xmm2, xmm3
 | 
						|
	vaddpd		ymm5, ymm4, ymm0
 | 
						|
 | 
						|
	vperm2f128	ymm6, ymm4, ymm5, 03h
 | 
						|
	vshufpd 	ymm7, ymm6, ymm5, 10010011b
 | 
						|
 | 
						|
	vroundpd	ymm8, ymm7, 0011b
 | 
						|
	vroundpd	ymm9, ymm7, 0
 | 
						|
 | 
						|
	sub	rsp,418h
 | 
						|
 | 
						|
    repeat 16, i:0
 | 
						|
	vmovups [rsp+10h+i*32],ymm#i
 | 
						|
    end repeat
 | 
						|
 | 
						|
	mov	r8,[rsp+10h]
 | 
						|
	mov	r9,[rsp+18h]
 | 
						|
	lea	rdx,[vector_output]
 | 
						|
	lea	rcx,[buffer]
 | 
						|
	call	[sprintf]
 | 
						|
 | 
						|
	xor	ecx,ecx
 | 
						|
	lea	rdx,[buffer]
 | 
						|
	lea	r8,[_title]
 | 
						|
	xor	r9d,r9d
 | 
						|
	call	[MessageBoxA]
 | 
						|
 | 
						|
	xor	ecx,ecx
 | 
						|
	call	[ExitProcess]
 | 
						|
 | 
						|
  no_AVX:
 | 
						|
 | 
						|
	sub	rsp,28h
 | 
						|
 | 
						|
	xor	ecx,ecx
 | 
						|
	lea	rdx,[_error]
 | 
						|
	lea	r8,[_title]
 | 
						|
	mov	r9d,10h
 | 
						|
	call	[MessageBoxA]
 | 
						|
 | 
						|
	mov	ecx,1
 | 
						|
	call	[ExitProcess]
 | 
						|
 | 
						|
section '.idata' import data readable writeable
 | 
						|
 | 
						|
  dd 0,0,0,RVA kernel_name,RVA kernel_table
 | 
						|
  dd 0,0,0,RVA user_name,RVA user_table
 | 
						|
  dd 0,0,0,RVA msvcrt_name,RVA msvcrt_table
 | 
						|
  dd 0,0,0,0,0
 | 
						|
 | 
						|
  kernel_table:
 | 
						|
    ExitProcess dq RVA _ExitProcess
 | 
						|
    dq 0
 | 
						|
  user_table:
 | 
						|
    MessageBoxA dq RVA _MessageBoxA
 | 
						|
    dq 0
 | 
						|
  msvcrt_table:
 | 
						|
    sprintf dq RVA _sprintf
 | 
						|
    dq 0
 | 
						|
 | 
						|
  kernel_name db 'KERNEL32.DLL',0
 | 
						|
  user_name db 'USER32.DLL',0
 | 
						|
  msvcrt_name db 'MSVCRT.DLL',0
 | 
						|
 | 
						|
  _ExitProcess dw 0
 | 
						|
    db 'ExitProcess',0
 | 
						|
  _MessageBoxA dw 0
 | 
						|
    db 'MessageBoxA',0
 | 
						|
  _sprintf dw 0
 | 
						|
    db 'sprintf',0
 |