PureBasic Forum
http://forums.purebasic.com/english/

linasm library
http://forums.purebasic.com/english/viewtopic.php?f=35&t=59702
Page 1 of 1

Author:  idle [ Sun Jun 22, 2014 9:19 am ]
Post subject:  linasm library

Here's an interesting asm library.
http://linasm.sourceforge.net/index.php

I almost felt like posting kcc animated gifs when I looked at it not just for the functions and structs
but the way it's written, which for us is shamelessly cut and paste. :mrgreen:
For linux x64 but some suitable routines for windows x64

short sample of Bitscan Reverse 64 and 32

Code:
;/*                                                                        Math.h
;################################################################################
;# Encoding: UTF-8                                                  Tab size: 4 #
;#                                                                              #
;#                             FAST MATH FUNCTIONS                              #
;#                                                                              #
;# License: LGPLv3+                               Copyleft (?) 2014, Jack Black #
;################################################################################

!Macro   BYTE_SWAP   result, value, scale
!{
!      MOV      result, value
!If scale = 1
!      ROL      ax, 8
!Else If scale > 1
!      BSWAP   result
!End If
!}
!ByteSwap8:   BYTE_SWAP   al, dil, 0
!ByteSwap16:   BYTE_SWAP   ax, di, 1
!ByteSwap32:   BYTE_SWAP   eax, edi, 2
!ByteSwap64:   BYTE_SWAP   rax, rdi, 3

! Macro   BIT_REVERSE      result, value, temp1, temp2, scale
! {
! ;---[Internal variables]-------------------
! If scale = 0
! const11   = 0x55                        ; const #1 For first stage
! const12   = 0x33                        ; const #1 For second stage
! const13   = 0x0F                        ; const #1 For third stage
! const21   = 0xAA                        ; const #2 For first stage
! const22   = 0xCC                        ; const #2 For second stage
! const23   = 0xF0                        ; const #2 For third stage
! Else If scale = 1
! const11   = 0x5555                     ; const #1 For first stage
! const12   = 0x3333                     ; const #1 For second stage
! const13   = 0x0F0F                     ; const #1 For third stage
! const21   = 0xAAAA                     ; const #2 For first stage
! const22   = 0xCCCC                     ; const #2 For second stage
! const23   = 0xF0F0                     ; const #2 For third stage
! Else If scale = 2
! const11   = 0x55555555                  ; const #1 For first stage
! const12   = 0x33333333                  ; const #1 For second stage
! const13   = 0x0F0F0F0F                  ; const #1 For third stage
! const21   = 0xAAAAAAAA                  ; const #2 For first stage
! const22   = 0xCCCCCCCC                  ; const #2 For second stage
! const23   = 0xF0F0F0F0                  ; const #2 For third stage
! Else If scale = 3
! const11   = 0x5555555555555555            ; const #1 For first stage
! const12   = 0x3333333333333333            ; const #1 For second stage
! const13   = 0x0F0F0F0F0F0F0F0F            ; const #1 For third stage
! const21   = 0xAAAAAAAAAAAAAAAA            ; const #2 For first stage
! const22   = 0xCCCCCCCCCCCCCCCC            ; const #2 For second stage
! const23   = 0xF0F0F0F0F0F0F0F0            ; const #2 For third stage
! End If
! ;---[First stage]--------------------------
!       MOV      temp1, const11            ; temp1 = const11
!       MOV      temp2, const21            ; temp2 = const21
!       AND      temp1, value
!       AND      temp2, value
!       SHL      temp1, 1               ; temp1 = (value & temp1) << 1
!       SHR      temp2, 1               ; temp2 = (value & temp2) >> 1
!       MOV      value, temp1
!       OR      value, temp2            ; value = temp1 | temp2
! ;---[Second stage]-------------------------
!       MOV      temp1, const12            ; temp1 = const12
!       MOV      temp2, const22            ; temp2 = const22
!       AND      temp1, value
!       AND      temp2, value
!       SHL      temp1, 2               ; temp1 = (value & temp1) << 2
!       SHR      temp2, 2               ; temp2 = (value & temp2) >> 2
!       MOV      value, temp1
!       OR      value, temp2            ; value = temp1 | temp2
! ;---[Third stage]--------------------------
!       MOV      temp1, const13            ; temp1 = const13
!       MOV      temp2, const23            ; temp2 = const23
!       AND      temp1, value
!       AND      temp2, value
!       SHL      temp1, 4               ; temp1 = (value & temp1) << 4
!       SHR      temp2, 4               ; temp2 = (value & temp2) >> 4
!       MOV      value, temp1
!       OR      value, temp2            ; value = temp1 | temp2
! ;---[Swap bytes If required]---------------
!    BYTE_SWAP   result, value, scale      ; Return ByteSwap (value)
! }
! BitReverse8:     BIT_REVERSE      al, dil, dl, cl, 0
! BitReverse16:   BIT_REVERSE      ax, di, dx, cx, 1
! BitReverse32:   BIT_REVERSE      eax, edi, edx, ecx, 2
! BitReverse64:   BIT_REVERSE      rax, rdi, rdx, rcx, 3

Macro _BitReverse64(value)
   EnableASM
   MOV rdi, value
   !BIT_REVERSE      rax, rdi, rdx, rcx, 3
   MOV value, rax
   DisableASM
EndMacro

Macro _BitReverse32(value)
   EnableASM
   MOV edi, value
   !BIT_REVERSE      eax, edi, edx, ecx, 2
   MOV value, eax
   DisableASM
EndMacro   

Global a.i,b.l 
a.i = %1110000000000000000000000000000000000000000000000000000000000000
b.l = %11100000000000000000000000000000

ProcedureCDLL.i BitReverse64(val.i)
   _BitReverse64(val)
   ProcedureReturn val
EndProcedure

ProcedureCDLL.l BitReverse32(val.l)
   _BitReverse32(val)
   ProcedureReturn val
EndProcedure


;call procedure
a = BitReverse64(a)
Debug RSet(Bin(a,#PB_Quad),64,"0")
b = BitReverse32(b)
Debug RSet(Bin(b,#PB_Long ),32,"0")

;use the macro
_BitReverse64(a)
Debug RSet(Bin(a,#PB_Quad),64,"0")
_BitReverse32(b)
Debug RSet(Bin(b,#PB_Long),32,"0")


Author:  Rescator [ Sat Aug 09, 2014 9:06 pm ]
Post subject:  Re: linasm library

viewtopic.php?f=35&t=47524
:wink:

Author:  idle [ Sun Aug 10, 2014 12:59 am ]
Post subject:  Re: linasm library

Rescator wrote:
http://www.purebasic.fr/english/viewtopic.php?f=35&t=47524
:wink:


Perhaps I could have chosen another example from the library.
The intention was to highlight the libs utility rather than the example.

Author:  Rescator [ Sun Aug 10, 2014 5:37 pm ]
Post subject:  Re: linasm library

The example is still interesting (hence me referencing the other thread), in that thread the solution I post near the end is one of the fastest asm implementations like that.
And the example you showed is very similar which hopefully reflect the rest of the stuff as being equally well optimized.

Author:  idle [ Sun Aug 10, 2014 10:22 pm ]
Post subject:  Re: linasm library

Yes I noticed the similarity reading through the thread. :D

I thought the library is a good example to learn from, it's architecture lends it self well
to integrating asm with PB

Page 1 of 1 All times are UTC + 1 hour
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/