Source code
Revision control
Copy as Markdown
Other Tools
; XzCrc64Opt.asm -- CRC64 calculation : optimized version↩
; 2011-06-28 : Igor Pavlov : Public domain↩
↩
include 7zAsm.asm↩
↩
MY_ASM_START↩
↩
ifdef x64↩
↩
rD equ r9↩
rN equ r10↩
↩
num_VAR equ r8↩
table_VAR equ r9↩
↩
SRCDAT equ rN + rD↩
↩
CRC_XOR macro dest:req, src:req, t:req↩
xor dest, QWORD PTR [r5 + src * 8 + 0800h * t]↩
endm↩
↩
CRC1b macro↩
movzx x6, BYTE PTR [rD]↩
inc rD↩
movzx x3, x0_L↩
xor x6, x3↩
shr r0, 8↩
CRC_XOR r0, r6, 0↩
dec rN↩
endm↩
↩
MY_PROLOG macro crc_end:req↩
MY_PUSH_4_REGS↩
↩
mov r0, r1↩
mov rN, num_VAR↩
mov r5, table_VAR↩
mov rD, r2↩
test rN, rN↩
jz crc_end↩
@@:↩
test rD, 3↩
jz @F↩
CRC1b↩
jnz @B↩
@@:↩
cmp rN, 8↩
jb crc_end↩
add rN, rD↩
mov num_VAR, rN↩
sub rN, 4↩
and rN, NOT 3↩
sub rD, rN↩
mov x1, [SRCDAT]↩
xor r0, r1↩
add rN, 4↩
endm↩
↩
MY_EPILOG macro crc_end:req↩
sub rN, 4↩
mov x1, [SRCDAT]↩
xor r0, r1↩
mov rD, rN↩
mov rN, num_VAR↩
sub rN, rD↩
crc_end:↩
test rN, rN↩
jz @F↩
CRC1b↩
jmp crc_end↩
@@:↩
MY_POP_4_REGS↩
endm↩
↩
MY_PROC XzCrc64UpdateT4, 4↩
MY_PROLOG crc_end_4↩
align 16↩
main_loop_4:↩
mov x1, [SRCDAT]↩
movzx x2, x0_L↩
movzx x3, x0_H↩
shr r0, 16↩
movzx x6, x0_L↩
movzx x7, x0_H↩
shr r0, 16↩
CRC_XOR r1, r2, 3↩
CRC_XOR r0, r3, 2↩
CRC_XOR r1, r6, 1↩
CRC_XOR r0, r7, 0↩
xor r0, r1↩
↩
add rD, 4↩
jnz main_loop_4↩
↩
MY_EPILOG crc_end_4↩
MY_ENDP↩
↩
else↩
↩
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↩
↩
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]↩
endm↩
↩
CRC_XOR macro dest0:req, dest1:req, src:req, t:req↩
CRC xor, xor, dest0, dest1, src, t↩
endm↩
↩
↩
CRC1b macro↩
movzx x6, BYTE PTR [rD]↩
inc rD↩
movzx x3, x0_L↩
xor x6, x3↩
shrd r0, r2, 8↩
shr r2, 8↩
CRC_XOR r0, r2, r6, 0↩
dec rN↩
endm↩
↩
MY_PROLOG macro crc_end:req↩
MY_PUSH_4_REGS↩
↩
mov rN, r2↩
↩
mov x0, [r4 + crc_val]↩
mov x2, [r4 + crc_val + 4]↩
mov r5, table_VAR↩
test rN, rN↩
jz crc_end↩
@@:↩
test rD, 3↩
jz @F↩
CRC1b↩
jnz @B↩
@@:↩
cmp rN, 8↩
jb crc_end↩
add rN, rD↩
↩
mov num_VAR, rN↩
↩
sub rN, 4↩
and rN, NOT 3↩
sub rD, rN↩
xor r0, [SRCDAT]↩
add rN, 4↩
endm↩
↩
MY_EPILOG macro crc_end:req↩
sub rN, 4↩
xor r0, [SRCDAT]↩
↩
mov rD, rN↩
mov rN, num_VAR↩
sub rN, rD↩
crc_end:↩
test rN, rN↩
jz @F↩
CRC1b↩
jmp crc_end↩
@@:↩
MY_POP_4_REGS↩
endm↩
↩
MY_PROC XzCrc64UpdateT4, 5↩
MY_PROLOG crc_end_4↩
movzx x6, x0_L↩
align 16↩
main_loop_4:↩
mov r3, [SRCDAT]↩
xor r3, r2↩
↩
CRC xor, mov, r3, r2, r6, 3↩
movzx x6, x0_H↩
shr r0, 16↩
CRC_XOR r3, r2, r6, 2↩
↩
movzx x6, x0_L↩
movzx x0, x0_H↩
CRC_XOR r3, r2, r6, 1↩
CRC_XOR r3, r2, r0, 0↩
movzx x6, x3_L↩
mov r0, r3↩
↩
add rD, 4↩
jnz main_loop_4↩
↩
MY_EPILOG crc_end_4↩
MY_ENDP↩
↩
endif↩
↩
end↩