Update v1.02.0
- ASM and C-backend
Update v1.02.1
- added bswap128
Code: Select all
;-TOP by mk-soft, v1.02.1, 27.08.2022
CompilerIf #PB_Compiler_Version < 600
#PB_Backend_Asm = 0
#PB_Backend_C = 1
#PB_Compiler_Backend = 0
CompilerEndIf
Procedure bswap16(value.u)
CompilerIf #PB_Compiler_Backend = #PB_Backend_C
!return __builtin_bswap16(v_value);
CompilerElse
!xor eax,eax
!mov ax, word [p.v_value]
!rol ax, 8
ProcedureReturn
CompilerEndIf
EndProcedure
Procedure bswap32(value.l)
CompilerIf #PB_Compiler_Backend = #PB_Backend_C
!return __builtin_bswap32(v_value);
CompilerElse
!mov eax, dword [p.v_value]
!bswap eax
ProcedureReturn
CompilerEndIf
EndProcedure
Procedure.q bswap64(value.q)
CompilerIf #PB_Compiler_Backend = #PB_Backend_C
!return __builtin_bswap64(v_value);
CompilerElse
CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
!mov rax, qword [p.v_value]
!bswap rax
CompilerElse
!mov edx, dword [p.v_value]
!mov eax, dword [p.v_value + 4]
!bswap edx
!bswap eax
CompilerEndIf
ProcedureReturn
CompilerEndIf
EndProcedure
Structure int128
l.q
h.q
EndStructure
Procedure bswap128(*value.int128, *result.int128 = 0) ;idle
Protected low.q = *value\l
Protected high.q = *value\h
CompilerIf #PB_Compiler_Backend = #PB_Backend_C
!v_high = __builtin_bswap64(v_high);
!v_low = __builtin_bswap64(v_low);
CompilerElse
CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
!mov rdx,[p.v_high]
!mov rax,[p.v_low]
!bswap rax
!bswap rdx
!mov [p.v_low],rax
!mov [p.v_high],rdx
CompilerElse
!mov edx, dword [p.v_high]
!mov eax, dword [p.v_high + 4]
!bswap edx
!bswap eax
!mov [p.v_high], dword eax
!mov [p.v_high + 4], dword edx
!xor eax,eax
!xor edx,edx
!mov edx, dword [p.v_low]
!mov eax, dword [p.v_low + 4]
!bswap edx
!bswap eax
!mov [p.v_low], dword eax
!mov [p.v_low + 4], dword edx
CompilerEndIf
CompilerEndIf
If *result
*result\h = low
*result\l = high
Else
*value\h = low
*value\l = high
EndIf
EndProcedure
; ----
Macro HexW(_var_)
RSet(Hex(_var_, #PB_Word), 4, "0")
EndMacro
Macro HexL(_var_)
RSet(Hex(_var_, #PB_Long), 8, "0")
EndMacro
Macro HexQ(_var_)
RSet(Hex(_var_, #PB_Quad), 16, "0")
EndMacro
; ****
CompilerIf #PB_Compiler_IsMainFile
Define a1.q, r1.q
Debug "bswap16"
a1 = $1234
r1 = bswap16(a1)
Debug HexW(r1)
Debug "bswap32"
a1 = $01020304
r1 = bswap32(a1)
Debug HexL(r1)
Debug "bswap64"
a1 = $01020304AABBCCDD
r1 = bswap64(a1)
Debug HexQ(r1)
Debug "bswap128"
Define a128.int128, r128.int128
;a128\h = $FFEEDDCCBBAA9988 : a128\l = $7766554433221100
a128\h = $0011223344556677 : a128\l = $8899AABBCCDDEEFF
;ShowMemoryViewer(a128, 16)
bswap128(a128, r128)
Debug HexQ(a128\h) + HexQ(a128\l)
Debug HexQ(r128\h) + HexQ(r128\l)
;ShowMemoryViewer(r128, 16)
CompilerEndIf