linasm library

Bare metal programming in PureBasic, for experienced users
User avatar
idle
Always Here
Always Here
Posts: 5049
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

linasm library

Post by idle »

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: Select all

;/*                                                                        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") 

Windows 11, Manjaro, Raspberry Pi OS
Image
User avatar
Rescator
Addict
Addict
Posts: 1769
Joined: Sat Feb 19, 2005 5:05 pm
Location: Norway

Re: linasm library

Post by Rescator »

User avatar
idle
Always Here
Always Here
Posts: 5049
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: linasm library

Post by idle »

Perhaps I could have chosen another example from the library.
The intention was to highlight the libs utility rather than the example.
Windows 11, Manjaro, Raspberry Pi OS
Image
User avatar
Rescator
Addict
Addict
Posts: 1769
Joined: Sat Feb 19, 2005 5:05 pm
Location: Norway

Re: linasm library

Post by Rescator »

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.
User avatar
idle
Always Here
Always Here
Posts: 5049
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: linasm library

Post by idle »

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
Windows 11, Manjaro, Raspberry Pi OS
Image
Post Reply