asm_dip/toolchain/fasmg.kl0e/examples/x86/win64avx.asm
2024-11-24 23:13:28 -05:00

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