I tried writing a naked version of this function
Code: Select all
Function BytSwap8( Byval qw As Ulongint ) As Ulongint
Dim Swap8Mask As Const Ulongint = &H0607040502030001
Asm
movq mm1, [Swap8Mask]
movq mm0, [qw]
pshufb mm0, mm1 ' Swap8Mask
movq [Function], mm0
emms
End Asm
End Function
'my naked version
Sub BytSwap8n Naked Cdecl( Byref result As Ulongint, Byref qw As Ulongint, Byref Swap8Mask As Ulongint = &H0607040502030001ull )
Asm
mov eax,[esp+12]
movq mm1, [eax]
mov eax,[esp+8]
movq mm0, [eax]
pshufb mm0, mm1 ' Swap8Mask
mov eax,[esp+4]
movq [eax], mm0
emms
ret
End Asm
End Sub
'simple benchmark
Dim As Ulongint i, r
Dim As Double t, sum
Print"starting"
sum=0
t=Timer
For i=1 To 80000000
sum-=BytSwap8(i)
sum+=BytSwap8(i+1)
Next
t=timer-t
Print sum
Print t
Print"starting"
sum=0
t=Timer
For i=1 To 80000000
BytSwap8n(r, i)
sum-=r
BytSwap8n(r,i+1)
sum+=r
Next
t=timer-t
Print sum
Print t
Sleep
what is wrong here?