Home | History | Annotate | Download | only in x86
      1 ; 7zCrcOpt.asm -- CRC32 calculation : optimized version
      2 ; 2009-12-12 : Igor Pavlov : Public domain
      3 
      4 include 7zAsm.asm
      5 
      6 MY_ASM_START
      7 
      8 rD   equ  r2
      9 rN   equ  r7
     10 
     11 ifdef x64
     12     num_VAR     equ r8
     13     table_VAR   equ r9
     14 else
     15     data_size   equ (REG_SIZE * 5)
     16     crc_table   equ (REG_SIZE + data_size)
     17     num_VAR     equ [r4 + data_size]
     18     table_VAR   equ [r4 + crc_table]
     19 endif
     20 
     21 SRCDAT  equ  rN + rD + 4 *
     22 
     23 CRC macro op:req, dest:req, src:req, t:req
     24     op      dest, DWORD PTR [r5 + src * 4 + 0400h * t]
     25 endm
     26 
     27 CRC_XOR macro dest:req, src:req, t:req
     28     CRC xor, dest, src, t
     29 endm
     30 
     31 CRC_MOV macro dest:req, src:req, t:req
     32     CRC mov, dest, src, t
     33 endm
     34 
     35 CRC1b macro
     36     movzx   x6, BYTE PTR [rD]
     37     inc     rD
     38     movzx   x3, x0_L
     39     xor     x6, x3
     40     shr     x0, 8
     41     CRC     xor, x0, r6, 0
     42     dec     rN
     43 endm
     44 
     45 MY_PROLOG macro crc_end:req
     46     MY_PUSH_4_REGS
     47     
     48     mov     x0, x1
     49     mov     rN, num_VAR
     50     mov     r5, table_VAR
     51     test    rN, rN
     52     jz      crc_end
     53   @@:
     54     test    rD, 7
     55     jz      @F
     56     CRC1b
     57     jnz     @B
     58   @@:
     59     cmp     rN, 16
     60     jb      crc_end
     61     add     rN, rD
     62     mov     num_VAR, rN
     63     sub     rN, 8
     64     and     rN, NOT 7
     65     sub     rD, rN
     66     xor     x0, [SRCDAT 0]
     67 endm
     68 
     69 MY_EPILOG macro crc_end:req
     70     xor     x0, [SRCDAT 0]
     71     mov     rD, rN
     72     mov     rN, num_VAR
     73     sub     rN, rD
     74   crc_end:
     75     test    rN, rN
     76     jz      @F
     77     CRC1b
     78     jmp     crc_end
     79   @@:
     80     MY_POP_4_REGS
     81 endm
     82 
     83 MY_PROC CrcUpdateT8, 4
     84     MY_PROLOG crc_end_8
     85     mov     x1, [SRCDAT 1]
     86     align 16
     87   main_loop_8:
     88     mov     x6, [SRCDAT 2]
     89     movzx   x3, x1_L
     90     CRC_XOR x6, r3, 3
     91     movzx   x3, x1_H
     92     CRC_XOR x6, r3, 2
     93     shr     x1, 16
     94     movzx   x3, x1_L
     95     movzx   x1, x1_H
     96     CRC_XOR x6, r3, 1
     97     movzx   x3, x0_L
     98     CRC_XOR x6, r1, 0
     99 
    100     mov     x1, [SRCDAT 3]
    101     CRC_XOR x6, r3, 7
    102     movzx   x3, x0_H
    103     shr     x0, 16
    104     CRC_XOR x6, r3, 6
    105     movzx   x3, x0_L
    106     CRC_XOR x6, r3, 5
    107     movzx   x3, x0_H
    108     CRC_MOV x0, r3, 4
    109     xor     x0, x6
    110     add     rD, 8
    111     jnz     main_loop_8
    112 
    113     MY_EPILOG crc_end_8
    114 MY_ENDP
    115 
    116 MY_PROC CrcUpdateT4, 4
    117     MY_PROLOG crc_end_4
    118     align 16
    119   main_loop_4:
    120     movzx   x1, x0_L
    121     movzx   x3, x0_H
    122     shr     x0, 16
    123     movzx   x6, x0_H
    124     and     x0, 0FFh
    125     CRC_MOV x1, r1, 3
    126     xor     x1, [SRCDAT 1]
    127     CRC_XOR x1, r3, 2
    128     CRC_XOR x1, r6, 0
    129     CRC_XOR x1, r0, 1
    130  
    131     movzx   x0, x1_L
    132     movzx   x3, x1_H
    133     shr     x1, 16
    134     movzx   x6, x1_H
    135     and     x1, 0FFh
    136     CRC_MOV x0, r0, 3
    137     xor     x0, [SRCDAT 2]
    138     CRC_XOR x0, r3, 2
    139     CRC_XOR x0, r6, 0
    140     CRC_XOR x0, r1, 1
    141     add     rD, 8
    142     jnz     main_loop_4
    143 
    144     MY_EPILOG crc_end_4
    145 MY_ENDP
    146 
    147 end
    148