1cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky; XzCrc64Opt.asm -- CRC64 calculation : optimized version 2cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky; 2011-06-28 : Igor Pavlov : Public domain 3cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 4cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinclude 7zAsm.asm 5cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 6cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_ASM_START 7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyifdef x64 9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky rD equ r9 11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky rN equ r10 12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky num_VAR equ r8 14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky table_VAR equ r9 15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SRCDAT equ rN + rD 17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCRC_XOR macro dest:req, src:req, t:req 19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky xor dest, QWORD PTR [r5 + src * 8 + 0800h * t] 20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm 21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCRC1b macro 23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x6, BYTE PTR [rD] 24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky inc rD 25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x3, x0_L 26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky xor x6, x3 27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky shr r0, 8 28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC_XOR r0, r6, 0 29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky dec rN 30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm 31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_PROLOG macro crc_end:req 33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky MY_PUSH_4_REGS 34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov r0, r1 36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov rN, num_VAR 37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov r5, table_VAR 38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov rD, r2 39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky test rN, rN 40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jz crc_end 41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky @@: 42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky test rD, 3 43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jz @F 44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC1b 45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jnz @B 46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky @@: 47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky cmp rN, 8 48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jb crc_end 49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky add rN, rD 50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov num_VAR, rN 51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sub rN, 4 52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky and rN, NOT 3 53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sub rD, rN 54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov x1, [SRCDAT] 55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky xor r0, r1 56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky add rN, 4 57cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm 58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 59cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_EPILOG macro crc_end:req 60cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sub rN, 4 61cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov x1, [SRCDAT] 62cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky xor r0, r1 63cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov rD, rN 64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov rN, num_VAR 65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sub rN, rD 66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky crc_end: 67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky test rN, rN 68cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jz @F 69cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC1b 70cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jmp crc_end 71cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky @@: 72cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky MY_POP_4_REGS 73cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm 74cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 75cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_PROC XzCrc64UpdateT4, 4 76cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky MY_PROLOG crc_end_4 77cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky align 16 78cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky main_loop_4: 79cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov x1, [SRCDAT] 80cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x2, x0_L 81cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x3, x0_H 82cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky shr r0, 16 83cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x6, x0_L 84cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x7, x0_H 85cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky shr r0, 16 86cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC_XOR r1, r2, 3 87cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC_XOR r0, r3, 2 88cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC_XOR r1, r6, 1 89cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC_XOR r0, r7, 0 90cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky xor r0, r1 91cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 92cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky add rD, 4 93cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jnz main_loop_4 94cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 95cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky MY_EPILOG crc_end_4 96cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_ENDP 97cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 98cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyelse 99cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 100cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky rD equ r1 101cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky rN equ r7 102cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 103cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky crc_val equ (REG_SIZE * 5) 104cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky crc_table equ (8 + crc_val) 105cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky table_VAR equ [r4 + crc_table] 106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky num_VAR equ table_VAR 107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 108cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 109cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SRCDAT equ rN + rD 110cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 111cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCRC macro op0:req, op1:req, dest0:req, dest1:req, src:req, t:req 112cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky op0 dest0, DWORD PTR [r5 + src * 8 + 0800h * t] 113cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky op1 dest1, DWORD PTR [r5 + src * 8 + 0800h * t + 4] 114cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm 115cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 116cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCRC_XOR macro dest0:req, dest1:req, src:req, t:req 117cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC xor, xor, dest0, dest1, src, t 118cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm 119cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 120cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 121cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCRC1b macro 122cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x6, BYTE PTR [rD] 123cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky inc rD 124cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x3, x0_L 125cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky xor x6, x3 126cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky shrd r0, r2, 8 127cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky shr r2, 8 128cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC_XOR r0, r2, r6, 0 129cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky dec rN 130cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm 131cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 132cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_PROLOG macro crc_end:req 133cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky MY_PUSH_4_REGS 134cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 135cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov rN, r2 136cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 137cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov x0, [r4 + crc_val] 138cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov x2, [r4 + crc_val + 4] 139cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov r5, table_VAR 140cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky test rN, rN 141cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jz crc_end 142cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky @@: 143cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky test rD, 3 144cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jz @F 145cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC1b 146cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jnz @B 147cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky @@: 148cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky cmp rN, 8 149cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jb crc_end 150cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky add rN, rD 151cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 152cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov num_VAR, rN 153cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 154cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sub rN, 4 155cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky and rN, NOT 3 156cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sub rD, rN 157cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky xor r0, [SRCDAT] 158cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky add rN, 4 159cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm 160cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 161cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_EPILOG macro crc_end:req 162cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sub rN, 4 163cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky xor r0, [SRCDAT] 164cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 165cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov rD, rN 166cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov rN, num_VAR 167cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sub rN, rD 168cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky crc_end: 169cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky test rN, rN 170cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jz @F 171cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC1b 172cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jmp crc_end 173cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky @@: 174cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky MY_POP_4_REGS 175cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm 176cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 177cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_PROC XzCrc64UpdateT4, 5 178cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky MY_PROLOG crc_end_4 179cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x6, x0_L 180cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky align 16 181cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky main_loop_4: 182cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov r3, [SRCDAT] 183cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky xor r3, r2 184cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 185cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC xor, mov, r3, r2, r6, 3 186cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x6, x0_H 187cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky shr r0, 16 188cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC_XOR r3, r2, r6, 2 189cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 190cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x6, x0_L 191cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x0, x0_H 192cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC_XOR r3, r2, r6, 1 193cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CRC_XOR r3, r2, r0, 0 194cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky movzx x6, x3_L 195cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky mov r0, r3 196cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 197cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky add rD, 4 198cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky jnz main_loop_4 199cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 200cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky MY_EPILOG crc_end_4 201cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_ENDP 202cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 203cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendif 204cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 205cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyend 206