X64 only but was worth a crack, i tried a branchless version which took quite a bit of effort but it was slower and fasm couldn't handle the macro
Code: Select all
CompilerIf #PB_Compiler_Debugger
CompilerError "Disable debugger to time measurements!"
CompilerEndIf
Global azaz.q = $3FFFFFF03FFFFFF ;AZaz
Global azazu.q = $3FFFFFF43FFFFFF ;AZaz_
Procedure IsAZazu(val)
If (val >= 65 And val <= 127)
ProcedureReturn (azazu & (1<<(val - 65)))
EndIf
EndProcedure
Macro _IsAZazu(val)
(azazu & ((1 << (val-65)) & ~(((val-65) >> 63) | ~((val-65)- 64) >> 63)))
EndMacro
Structure AsciiArray
a.a[0]
EndStructure
Procedure IsLetter(val)
Protected *IsLetter.AsciiArray = ?IsLetter
If val <= 127
ProcedureReturn *IsLetter\a[val]
Else
ProcedureReturn #False
EndIf
EndProcedure
DataSection
IsLetter:
Data.a 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.a 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.a 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.a 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.a 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
Data.a 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1
Data.a 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
Data.a 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
EndDataSection
Define a,b,x,ra,rb,st,et,et1
x = 1<<21
ra = 0
rb = 0
st = ElapsedMilliseconds()
For a = 0 To x
For b = 0 To 255
If IsLetter(b)
ra + b
EndIf
Next
Next
et = ElapsedMilliseconds()
For a = 0 To x
For b = 0 To 255
If IsAZazu(b)
rb+b
EndIf
Next
Next
et1 = ElapsedMilliseconds()
out.s = "Isletter: " + Str(et-st) + #CRLF$ + "IsAZazu: " + Str(et1-et) + " " + Str(ra) + " " + Str(rb)
MessageRequester("test AZaz_",out)