summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/lzma/Asm/x86/XzCrc64Opt.asm
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/lzma/Asm/x86/XzCrc64Opt.asm')
-rw-r--r--3rdparty/lzma/Asm/x86/XzCrc64Opt.asm108
1 files changed, 71 insertions, 37 deletions
diff --git a/3rdparty/lzma/Asm/x86/XzCrc64Opt.asm b/3rdparty/lzma/Asm/x86/XzCrc64Opt.asm
index 734ca5c45f4..ad22cc2fce0 100644
--- a/3rdparty/lzma/Asm/x86/XzCrc64Opt.asm
+++ b/3rdparty/lzma/Asm/x86/XzCrc64Opt.asm
@@ -1,5 +1,5 @@
; XzCrc64Opt.asm -- CRC64 calculation : optimized version
-; 2011-06-28 : Igor Pavlov : Public domain
+; 2021-02-06 : Igor Pavlov : Public domain
include 7zAsm.asm
@@ -7,16 +7,15 @@ MY_ASM_START
ifdef x64
- rD equ r9
- rN equ r10
-
- num_VAR equ r8
- table_VAR equ r9
-
- SRCDAT equ rN + rD
+rD equ r9
+rN equ r10
+rT equ r5
+num_VAR equ r8
+SRCDAT4 equ dword ptr [rD + rN * 1]
+
CRC_XOR macro dest:req, src:req, t:req
- xor dest, QWORD PTR [r5 + src * 8 + 0800h * t]
+ xor dest, QWORD PTR [rT + src * 8 + 0800h * t]
endm
CRC1b macro
@@ -30,12 +29,15 @@ CRC1b macro
endm
MY_PROLOG macro crc_end:req
+ ifdef ABI_LINUX
+ MY_PUSH_2_REGS
+ else
MY_PUSH_4_REGS
-
- mov r0, r1
- mov rN, num_VAR
- mov r5, table_VAR
- mov rD, r2
+ endif
+ mov r0, REG_ABI_PARAM_0
+ mov rN, REG_ABI_PARAM_2
+ mov rT, REG_ABI_PARAM_3
+ mov rD, REG_ABI_PARAM_1
test rN, rN
jz crc_end
@@:
@@ -51,14 +53,14 @@ MY_PROLOG macro crc_end:req
sub rN, 4
and rN, NOT 3
sub rD, rN
- mov x1, [SRCDAT]
+ mov x1, SRCDAT4
xor r0, r1
add rN, 4
endm
MY_EPILOG macro crc_end:req
sub rN, 4
- mov x1, [SRCDAT]
+ mov x1, SRCDAT4
xor r0, r1
mov rD, rN
mov rN, num_VAR
@@ -69,14 +71,18 @@ MY_EPILOG macro crc_end:req
CRC1b
jmp crc_end
@@:
+ ifdef ABI_LINUX
+ MY_POP_2_REGS
+ else
MY_POP_4_REGS
+ endif
endm
MY_PROC XzCrc64UpdateT4, 4
MY_PROLOG crc_end_4
align 16
main_loop_4:
- mov x1, [SRCDAT]
+ mov x1, SRCDAT4
movzx x2, x0_L
movzx x3, x0_H
shr r0, 16
@@ -96,21 +102,43 @@ MY_PROC XzCrc64UpdateT4, 4
MY_ENDP
else
+; x86 (32-bit)
+
+rD equ r1
+rN equ r7
+rT equ r5
+
+crc_OFFS equ (REG_SIZE * 5)
+
+if (IS_CDECL gt 0) or (IS_LINUX gt 0)
+ ; cdecl or (GNU fastcall) stack:
+ ; (UInt32 *) table
+ ; size_t size
+ ; void * data
+ ; (UInt64) crc
+ ; ret-ip <-(r4)
+ data_OFFS equ (8 + crc_OFFS)
+ size_OFFS equ (REG_SIZE + data_OFFS)
+ table_OFFS equ (REG_SIZE + size_OFFS)
+ num_VAR equ [r4 + size_OFFS]
+ table_VAR equ [r4 + table_OFFS]
+else
+ ; Windows fastcall:
+ ; r1 = data, r2 = size
+ ; stack:
+ ; (UInt32 *) table
+ ; (UInt64) crc
+ ; ret-ip <-(r4)
+ table_OFFS equ (8 + crc_OFFS)
+ table_VAR equ [r4 + table_OFFS]
+ num_VAR equ table_VAR
+endif
- rD equ r1
- rN equ r7
-
- crc_val equ (REG_SIZE * 5)
- crc_table equ (8 + crc_val)
- table_VAR equ [r4 + crc_table]
- num_VAR equ table_VAR
-
-
- SRCDAT equ rN + rD
+SRCDAT4 equ dword ptr [rD + rN * 1]
CRC macro op0:req, op1:req, dest0:req, dest1:req, src:req, t:req
- op0 dest0, DWORD PTR [r5 + src * 8 + 0800h * t]
- op1 dest1, DWORD PTR [r5 + src * 8 + 0800h * t + 4]
+ op0 dest0, DWORD PTR [rT + src * 8 + 0800h * t]
+ op1 dest1, DWORD PTR [rT + src * 8 + 0800h * t + 4]
endm
CRC_XOR macro dest0:req, dest1:req, src:req, t:req
@@ -131,12 +159,18 @@ endm
MY_PROLOG macro crc_end:req
MY_PUSH_4_REGS
-
+
+ if (IS_CDECL gt 0) or (IS_LINUX gt 0)
+ proc_numParams = proc_numParams + 2 ; for ABI_LINUX
+ mov rN, [r4 + size_OFFS]
+ mov rD, [r4 + data_OFFS]
+ else
mov rN, r2
+ endif
- mov x0, [r4 + crc_val]
- mov x2, [r4 + crc_val + 4]
- mov r5, table_VAR
+ mov x0, [r4 + crc_OFFS]
+ mov x2, [r4 + crc_OFFS + 4]
+ mov rT, table_VAR
test rN, rN
jz crc_end
@@:
@@ -154,13 +188,13 @@ MY_PROLOG macro crc_end:req
sub rN, 4
and rN, NOT 3
sub rD, rN
- xor r0, [SRCDAT]
+ xor r0, SRCDAT4
add rN, 4
endm
MY_EPILOG macro crc_end:req
sub rN, 4
- xor r0, [SRCDAT]
+ xor r0, SRCDAT4
mov rD, rN
mov rN, num_VAR
@@ -179,7 +213,7 @@ MY_PROC XzCrc64UpdateT4, 5
movzx x6, x0_L
align 16
main_loop_4:
- mov r3, [SRCDAT]
+ mov r3, SRCDAT4
xor r3, r2
CRC xor, mov, r3, r2, r6, 3
@@ -200,6 +234,6 @@ MY_PROC XzCrc64UpdateT4, 5
MY_EPILOG crc_end_4
MY_ENDP
-endif
+endif ; ! x64
end