Source code

Revision control

Copy as Markdown

Other Tools

; 7zCrcOpt.asm -- CRC32 calculation : optimized version↩
; 2009-12-12 : Igor Pavlov : Public domain↩
include 7zAsm.asm↩
MY_ASM_START↩
rD equ r2↩
rN equ r7↩
ifdef x64↩
num_VAR equ r8↩
table_VAR equ r9↩
else↩
data_size equ (REG_SIZE * 5)↩
crc_table equ (REG_SIZE + data_size)↩
num_VAR equ [r4 + data_size]↩
table_VAR equ [r4 + crc_table]↩
endif↩
SRCDAT equ rN + rD + 4 *↩
CRC macro op:req, dest:req, src:req, t:req↩
op dest, DWORD PTR [r5 + src * 4 + 0400h * t]↩
endm↩
CRC_XOR macro dest:req, src:req, t:req↩
CRC xor, dest, src, t↩
endm↩
CRC_MOV macro dest:req, src:req, t:req↩
CRC mov, dest, src, t↩
endm↩
CRC1b macro↩
movzx x6, BYTE PTR [rD]↩
inc rD↩
movzx x3, x0_L↩
xor x6, x3↩
shr x0, 8↩
CRC xor, x0, r6, 0↩
dec rN↩
endm↩
MY_PROLOG macro crc_end:req↩
MY_PUSH_4_REGS↩
mov x0, x1↩
mov rN, num_VAR↩
mov r5, table_VAR↩
test rN, rN↩
jz crc_end↩
@@:↩
test rD, 7↩
jz @F↩
CRC1b↩
jnz @B↩
@@:↩
cmp rN, 16↩
jb crc_end↩
add rN, rD↩
mov num_VAR, rN↩
sub rN, 8↩
and rN, NOT 7↩
sub rD, rN↩
xor x0, [SRCDAT 0]↩
endm↩
MY_EPILOG macro crc_end:req↩
xor x0, [SRCDAT 0]↩
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 CrcUpdateT8, 4↩
MY_PROLOG crc_end_8↩
mov x1, [SRCDAT 1]↩
align 16↩
main_loop_8:↩
mov x6, [SRCDAT 2]↩
movzx x3, x1_L↩
CRC_XOR x6, r3, 3↩
movzx x3, x1_H↩
CRC_XOR x6, r3, 2↩
shr x1, 16↩
movzx x3, x1_L↩
movzx x1, x1_H↩
CRC_XOR x6, r3, 1↩
movzx x3, x0_L↩
CRC_XOR x6, r1, 0↩
mov x1, [SRCDAT 3]↩
CRC_XOR x6, r3, 7↩
movzx x3, x0_H↩
shr x0, 16↩
CRC_XOR x6, r3, 6↩
movzx x3, x0_L↩
CRC_XOR x6, r3, 5↩
movzx x3, x0_H↩
CRC_MOV x0, r3, 4↩
xor x0, x6↩
add rD, 8↩
jnz main_loop_8↩
MY_EPILOG crc_end_8↩
MY_ENDP↩
MY_PROC CrcUpdateT4, 4↩
MY_PROLOG crc_end_4↩
align 16↩
main_loop_4:↩
movzx x1, x0_L↩
movzx x3, x0_H↩
shr x0, 16↩
movzx x6, x0_H↩
and x0, 0FFh↩
CRC_MOV x1, r1, 3↩
xor x1, [SRCDAT 1]↩
CRC_XOR x1, r3, 2↩
CRC_XOR x1, r6, 0↩
CRC_XOR x1, r0, 1↩
movzx x0, x1_L↩
movzx x3, x1_H↩
shr x1, 16↩
movzx x6, x1_H↩
and x1, 0FFh↩
CRC_MOV x0, r0, 3↩
xor x0, [SRCDAT 2]↩
CRC_XOR x0, r3, 2↩
CRC_XOR x0, r6, 0↩
CRC_XOR x0, r1, 1↩
add rD, 8↩
jnz main_loop_4↩
MY_EPILOG crc_end_4↩
MY_ENDP↩
end↩