Hello SARG looks like you are more familiar with 64-bit ASM on Windows and Linux as I'm.
Can you look at the comemnts and may be fix it if I made an mistake ?
And one more question on 64-bit (if you don't have to return a floating point) it's OK using the old FPU assembler commands also ?
I would translate my software OpenGL shader stuff to assembler
but I will wait that someone can confirm my current knowledge of 64-bit inline assembler.
Thank you.
Josh
Code: Select all
' ##################
' # x86 32-bit ASM #
' ##################
' all args on stack
' return integer in: eax
' return floating point in: st0
' ##################
' # Windows x86_64 #
' ##################
' first 4 integer or pointer args in:
' rcx, rdx, r8, r9
' first 4 floating point args in:
' xmm0, xmm1, xmm2, xmm3
' none volatile
' rbp, rbx, rsi, rsp, rdi, r12, r13, r14, r15
' return integer in: rax
' return floating point in: xmm0
' ################
' # Linux x86_64 #
' ################
' first 6 integer or pointer args in:
' rdi, rsi, rdx, rcx, r8, r9
' first 8 floating point args in:
' xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
' return integer in: rax
' return floating point in: xmm0
' none volatile
' rbp, rbx, rsp, r12, r13, r14, r15
#if (__FB_ASM__ = "att") or _
defined(__FB_DOS__) or _
defined(__FB_ARM__) or _
defined(__FB_ARCH64__) or _
defined(__FB_DARWIN__)
#define ASM_OFF
#undef naked
#define naked
#else
#ifndef __FB_64BIT__
#define ASM_32
#elseif defined(__FB_WIN32__)
#define ASM_64_WIN
#else
#define ASM_64_LIN
#endif
#endif
sub sub_min naked cdecl(byref result as single, byval x as single, byval y as single)
#if defined(ASM_OFF)
result = iif(x<y,x,y)
#else
asm
#if defined(ASM_32)
mov eax ,dword ptr [esp+ 4] ' @result
movss xmm0,dword ptr [esp+ 8] ' x
movss xmm1,dword ptr [esp+12] ' y
minss xmm0,xmm1 ' xmm0 = min(x,y)
movss dword ptr [eax],xmm0 '*result = xmm0
#elseif defined(ASM_64_WIN)
minss xmm1,xmm2 ' xmm1 = min(x,y)
movss dword ptr [rcx],xmm1 '*result=xmm1
#elseif defined(ASM_64_LIN)
minss xmm0,xmm1 ' xmm0=min(x,y)
movss dword ptr [rdi],xmm0 '*result=xmm0
#else
#error 666: unknow inline assembler mode !
#endif
ret
end asm
#endif
end sub
function func_min naked cdecl(byval x as single, byval y as single) as single
#if defined(ASM_OFF)
return iif(x<y,x,y)
#else
asm
#if defined(ASM_32)
sub esp,4 ' dim as single temp=any
movss xmm0,dword ptr [esp+ 8] ' x
movss xmm1,dword ptr [esp+12] ' y
minss xmm0,xmm1 ' xmm0 = min(x,y)
movss dword ptr [esp],xmm0 ' *tmp = xmm0
fld dword ptr [esp] ' return tmp
add esp,4
#elseif defined(ASM_64_WIN) or defined(ASM_64_LIN)
minss xmm0, xmm1 ' xmm0 = min(x,y)
#else
#error 666: unknow inline assembler mode !
#endif
ret
end asm
#endif
end function
'
' main
'
dim as single result
sub_min(result,6.0f,5.2f)
print "sub_min(result,6.0f,5.2f) = " & result
print "func_min(2.2f,1.7f) = " & func_min(2.2f,1.7f)
sleep