crc: Use ternlog in by16 avx512 loop

Ternlog has additional benefit in by16 crc main loop in both reflected
and non-reflected polynomial crcs. Some arch see 4-7% improvement.
Revisited on suggestion by Nicola Torracca.

Change-Id: I806266a7080168cf33409634983e254a291a0795
Signed-off-by: Greg Tucker <greg.b.tucker@intel.com>
This commit is contained in:
Greg Tucker 2022-11-02 12:16:20 -07:00
parent fec429e1b9
commit c2bec3ea65
6 changed files with 81 additions and 135 deletions

View File

@ -144,30 +144,26 @@ FUNCTION_NAME:
vmovdqu8 zmm3, [arg2+16*0]
vpshufb zmm3, zmm3, zmm18
vpclmulqdq zmm1, zmm0, zmm16, 0x00
vpclmulqdq zmm2, zmm0, zmm16, 0x11
vpxorq zmm0, zmm1, zmm2
vpxorq zmm0, zmm0, zmm3
vpclmulqdq zmm0, zmm0, zmm16, 0x11
vpternlogq zmm0, zmm1, zmm3, 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpshufb zmm9, zmm9, zmm18
vpclmulqdq zmm5, zmm4, zmm16, 0x00
vpclmulqdq zmm6, zmm4, zmm16, 0x11
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm4, zmm4, zmm16, 0x11
vpternlogq zmm4, zmm5, zmm9, 0x96
vmovdqu8 zmm11, [arg2+16*8]
vpshufb zmm11, zmm11, zmm18
vpclmulqdq zmm12, zmm7, zmm16, 0x00
vpclmulqdq zmm13, zmm7, zmm16, 0x11
vpxorq zmm7, zmm12, zmm13
vpxorq zmm7, zmm7, zmm11
vpclmulqdq zmm7, zmm7, zmm16, 0x11
vpternlogq zmm7, zmm12, zmm11, 0x96
vmovdqu8 zmm17, [arg2+16*12]
vpshufb zmm17, zmm17, zmm18
vpclmulqdq zmm14, zmm8, zmm16, 0x00
vpclmulqdq zmm15, zmm8, zmm16, 0x11
vpxorq zmm8, zmm14, zmm15
vpxorq zmm8, zmm8, zmm17
vpclmulqdq zmm8, zmm8, zmm16, 0x11
vpternlogq zmm8, zmm14, zmm17, 0x96
sub arg3, 256
jge .fold_256_B_loop
@ -199,16 +195,14 @@ FUNCTION_NAME:
vmovdqu8 zmm8, [arg2+16*0]
vpshufb zmm8, zmm8, zmm18
vpclmulqdq zmm2, zmm0, zmm10, 0x00
vpclmulqdq zmm1, zmm0, zmm10, 0x11
vpxorq zmm0, zmm2, zmm1
vpxorq zmm0, zmm0, zmm8
vpclmulqdq zmm0, zmm0, zmm10, 0x11
vpternlogq zmm0, zmm2, zmm8, 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpshufb zmm9, zmm9, zmm18
vpclmulqdq zmm5, zmm4, zmm10, 0x00
vpclmulqdq zmm6, zmm4, zmm10, 0x11
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm4, zmm4, zmm10, 0x11
vpternlogq zmm4, zmm5, zmm9, 0x96
sub arg3, 128
jge .fold_128_B_loop

View File

@ -138,29 +138,21 @@ FUNCTION_NAME:
.fold_256_B_loop:
add arg2, 256
vmovdqu8 zmm3, [arg2+16*0]
vpclmulqdq zmm1, zmm0, zmm16, 0x10
vpclmulqdq zmm2, zmm0, zmm16, 0x01
vpxorq zmm0, zmm1, zmm2
vpxorq zmm0, zmm0, zmm3
vpclmulqdq zmm0, zmm0, zmm16, 0x01
vpternlogq zmm0, zmm1, [arg2+16*0], 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpclmulqdq zmm5, zmm4, zmm16, 0x10
vpclmulqdq zmm6, zmm4, zmm16, 0x01
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm2, zmm4, zmm16, 0x10
vpclmulqdq zmm4, zmm4, zmm16, 0x01
vpternlogq zmm4, zmm2, [arg2+16*4], 0x96
vmovdqu8 zmm11, [arg2+16*8]
vpclmulqdq zmm12, zmm7, zmm16, 0x10
vpclmulqdq zmm13, zmm7, zmm16, 0x01
vpxorq zmm7, zmm12, zmm13
vpxorq zmm7, zmm7, zmm11
vpclmulqdq zmm3, zmm7, zmm16, 0x10
vpclmulqdq zmm7, zmm7, zmm16, 0x01
vpternlogq zmm7, zmm3, [arg2+16*8], 0x96
vmovdqu8 zmm17, [arg2+16*12]
vpclmulqdq zmm14, zmm8, zmm16, 0x10
vpclmulqdq zmm15, zmm8, zmm16, 0x01
vpxorq zmm8, zmm14, zmm15
vpxorq zmm8, zmm8, zmm17
vpclmulqdq zmm5, zmm8, zmm16, 0x10
vpclmulqdq zmm8, zmm8, zmm16, 0x01
vpternlogq zmm8, zmm5, [arg2+16*12], 0x96
sub arg3, 256
jge .fold_256_B_loop
@ -189,17 +181,13 @@ FUNCTION_NAME:
; fold 128B at a time. This section of the code folds 8 xmm registers in parallel
.fold_128_B_loop:
add arg2, 128
vmovdqu8 zmm8, [arg2+16*0]
vpclmulqdq zmm2, zmm0, zmm10, 0x10
vpclmulqdq zmm1, zmm0, zmm10, 0x01
vpxorq zmm0, zmm2, zmm1
vpxorq zmm0, zmm0, zmm8
vpclmulqdq zmm0, zmm0, zmm10, 0x01
vpternlogq zmm0, zmm2, [arg2+16*0], 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpclmulqdq zmm5, zmm4, zmm10, 0x10
vpclmulqdq zmm6, zmm4, zmm10, 0x01
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm4, zmm4, zmm10, 0x01
vpternlogq zmm4, zmm5, [arg2+16*4], 0x96
sub arg3, 128
jge .fold_128_B_loop

View File

@ -139,30 +139,26 @@ FUNCTION_NAME:
vmovdqu8 zmm3, [arg2+16*0]
vpshufb zmm3, zmm3, zmm18
vpclmulqdq zmm1, zmm0, zmm16, 0x00
vpclmulqdq zmm2, zmm0, zmm16, 0x11
vpxorq zmm0, zmm1, zmm2
vpxorq zmm0, zmm0, zmm3
vpclmulqdq zmm0, zmm0, zmm16, 0x11
vpternlogq zmm0, zmm1, zmm3, 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpshufb zmm9, zmm9, zmm18
vpclmulqdq zmm5, zmm4, zmm16, 0x00
vpclmulqdq zmm6, zmm4, zmm16, 0x11
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm4, zmm4, zmm16, 0x11
vpternlogq zmm4, zmm5, zmm9, 0x96
vmovdqu8 zmm11, [arg2+16*8]
vpshufb zmm11, zmm11, zmm18
vpclmulqdq zmm12, zmm7, zmm16, 0x00
vpclmulqdq zmm13, zmm7, zmm16, 0x11
vpxorq zmm7, zmm12, zmm13
vpxorq zmm7, zmm7, zmm11
vpclmulqdq zmm7, zmm7, zmm16, 0x11
vpternlogq zmm7, zmm12, zmm11, 0x96
vmovdqu8 zmm17, [arg2+16*12]
vpshufb zmm17, zmm17, zmm18
vpclmulqdq zmm14, zmm8, zmm16, 0x00
vpclmulqdq zmm15, zmm8, zmm16, 0x11
vpxorq zmm8, zmm14, zmm15
vpxorq zmm8, zmm8, zmm17
vpclmulqdq zmm8, zmm8, zmm16, 0x11
vpternlogq zmm8, zmm14, zmm17, 0x96
sub arg3, 256
jge .fold_256_B_loop
@ -194,16 +190,14 @@ FUNCTION_NAME:
vmovdqu8 zmm8, [arg2+16*0]
vpshufb zmm8, zmm8, zmm18
vpclmulqdq zmm2, zmm0, zmm10, 0x00
vpclmulqdq zmm1, zmm0, zmm10, 0x11
vpxorq zmm0, zmm2, zmm1
vpxorq zmm0, zmm0, zmm8
vpclmulqdq zmm0, zmm0, zmm10, 0x11
vpternlogq zmm0, zmm2, zmm8, 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpshufb zmm9, zmm9, zmm18
vpclmulqdq zmm5, zmm4, zmm10, 0x00
vpclmulqdq zmm6, zmm4, zmm10, 0x11
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm4, zmm4, zmm10, 0x11
vpternlogq zmm4, zmm5, zmm9, 0x96
sub arg3, 128
jge .fold_128_B_loop

View File

@ -126,29 +126,21 @@ FUNCTION_NAME:
.fold_256_B_loop:
add arg2, 256
vmovdqu8 zmm3, [arg2+16*0]
vpclmulqdq zmm1, zmm0, zmm16, 0x10
vpclmulqdq zmm2, zmm0, zmm16, 0x01
vpxorq zmm0, zmm1, zmm2
vpxorq zmm0, zmm0, zmm3
vpclmulqdq zmm0, zmm0, zmm16, 0x01
vpternlogq zmm0, zmm1, [arg2+16*0], 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpclmulqdq zmm5, zmm4, zmm16, 0x10
vpclmulqdq zmm6, zmm4, zmm16, 0x01
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm2, zmm4, zmm16, 0x10
vpclmulqdq zmm4, zmm4, zmm16, 0x01
vpternlogq zmm4, zmm2, [arg2+16*4], 0x96
vmovdqu8 zmm11, [arg2+16*8]
vpclmulqdq zmm12, zmm7, zmm16, 0x10
vpclmulqdq zmm13, zmm7, zmm16, 0x01
vpxorq zmm7, zmm12, zmm13
vpxorq zmm7, zmm7, zmm11
vpclmulqdq zmm3, zmm7, zmm16, 0x10
vpclmulqdq zmm7, zmm7, zmm16, 0x01
vpternlogq zmm7, zmm3, [arg2+16*8], 0x96
vmovdqu8 zmm17, [arg2+16*12]
vpclmulqdq zmm14, zmm8, zmm16, 0x10
vpclmulqdq zmm15, zmm8, zmm16, 0x01
vpxorq zmm8, zmm14, zmm15
vpxorq zmm8, zmm8, zmm17
vpclmulqdq zmm5, zmm8, zmm16, 0x10
vpclmulqdq zmm8, zmm8, zmm16, 0x01
vpternlogq zmm8, zmm5, [arg2+16*12], 0x96
sub arg3, 256
jge .fold_256_B_loop
@ -177,17 +169,13 @@ FUNCTION_NAME:
; fold 128B at a time. This section of the code folds 8 xmm registers in parallel
.fold_128_B_loop:
add arg2, 128
vmovdqu8 zmm8, [arg2+16*0]
vpclmulqdq zmm2, zmm0, zmm10, 0x10
vpclmulqdq zmm1, zmm0, zmm10, 0x01
vpxorq zmm0, zmm2, zmm1
vpxorq zmm0, zmm0, zmm8
vpclmulqdq zmm0, zmm0, zmm10, 0x01
vpternlogq zmm0, zmm2, [arg2+16*0], 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpclmulqdq zmm5, zmm4, zmm10, 0x10
vpclmulqdq zmm6, zmm4, zmm10, 0x01
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm4, zmm4, zmm10, 0x01
vpternlogq zmm4, zmm5, [arg2+16*4], 0x96
sub arg3, 128
jge .fold_128_B_loop

View File

@ -123,30 +123,26 @@ _fold_256_B_loop:
vmovdqu8 zmm3, [arg2+16*0]
vpshufb zmm3, zmm3, zmm18
vpclmulqdq zmm1, zmm0, zmm16, 0x00
vpclmulqdq zmm2, zmm0, zmm16, 0x11
vpxorq zmm0, zmm1, zmm2
vpxorq zmm0, zmm0, zmm3
vpclmulqdq zmm0, zmm0, zmm16, 0x11
vpternlogq zmm0, zmm1, zmm3, 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpshufb zmm9, zmm9, zmm18
vpclmulqdq zmm5, zmm4, zmm16, 0x00
vpclmulqdq zmm6, zmm4, zmm16, 0x11
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm4, zmm4, zmm16, 0x11
vpternlogq zmm4, zmm5, zmm9, 0x96
vmovdqu8 zmm11, [arg2+16*8]
vpshufb zmm11, zmm11, zmm18
vpclmulqdq zmm12, zmm7, zmm16, 0x00
vpclmulqdq zmm13, zmm7, zmm16, 0x11
vpxorq zmm7, zmm12, zmm13
vpxorq zmm7, zmm7, zmm11
vpclmulqdq zmm7, zmm7, zmm16, 0x11
vpternlogq zmm7, zmm12, zmm11, 0x96
vmovdqu8 zmm17, [arg2+16*12]
vpshufb zmm17, zmm17, zmm18
vpclmulqdq zmm14, zmm8, zmm16, 0x00
vpclmulqdq zmm15, zmm8, zmm16, 0x11
vpxorq zmm8, zmm14, zmm15
vpxorq zmm8, zmm8, zmm17
vpclmulqdq zmm8, zmm8, zmm16, 0x11
vpternlogq zmm8, zmm14, zmm17, 0x96
sub arg3, 256
jge _fold_256_B_loop
@ -173,16 +169,14 @@ _fold_128_B_loop:
vmovdqu8 zmm8, [arg2+16*0]
vpshufb zmm8, zmm8, zmm18
vpclmulqdq zmm1, zmm0, zmm10, 0x00
vpclmulqdq zmm2, zmm0, zmm10, 0x11
vpxorq zmm0, zmm1, zmm2
vpxorq zmm0, zmm0, zmm8
vpclmulqdq zmm0, zmm0, zmm10, 0x11
vpternlogq zmm0, zmm1, zmm8, 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpshufb zmm9, zmm9, zmm18
vpclmulqdq zmm5, zmm4, zmm10, 0x00
vpclmulqdq zmm6, zmm4, zmm10, 0x11
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm4, zmm4, zmm10, 0x11
vpternlogq zmm4, zmm5, zmm9, 0x96
sub arg3, 128
jge _fold_128_B_loop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@ -114,29 +114,21 @@ FUNCTION_NAME:
_fold_256_B_loop:
add arg2, 256
vmovdqu8 zmm3, [arg2+16*0]
vpclmulqdq zmm1, zmm0, zmm16, 0x10
vpclmulqdq zmm2, zmm0, zmm16, 0x01
vpxorq zmm0, zmm1, zmm2
vpxorq zmm0, zmm0, zmm3
vpclmulqdq zmm0, zmm0, zmm16, 0x01
vpternlogq zmm0, zmm1, [arg2+16*0], 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpclmulqdq zmm5, zmm4, zmm16, 0x10
vpclmulqdq zmm6, zmm4, zmm16, 0x01
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm2, zmm4, zmm16, 0x10
vpclmulqdq zmm4, zmm4, zmm16, 0x01
vpternlogq zmm4, zmm2, [arg2+16*4], 0x96
vmovdqu8 zmm11, [arg2+16*8]
vpclmulqdq zmm12, zmm7, zmm16, 0x10
vpclmulqdq zmm13, zmm7, zmm16, 0x01
vpxorq zmm7, zmm12, zmm13
vpxorq zmm7, zmm7, zmm11
vpclmulqdq zmm3, zmm7, zmm16, 0x10
vpclmulqdq zmm7, zmm7, zmm16, 0x01
vpternlogq zmm7, zmm3, [arg2+16*8], 0x96
vmovdqu8 zmm17, [arg2+16*12]
vpclmulqdq zmm14, zmm8, zmm16, 0x10
vpclmulqdq zmm15, zmm8, zmm16, 0x01
vpxorq zmm8, zmm14, zmm15
vpxorq zmm8, zmm8, zmm17
vpclmulqdq zmm5, zmm8, zmm16, 0x10
vpclmulqdq zmm8, zmm8, zmm16, 0x01
vpternlogq zmm8, zmm5, [arg2+16*12], 0x96
sub arg3, 256
jge _fold_256_B_loop
@ -160,17 +152,13 @@ _fold_256_B_loop:
; fold 128B at a time. This section of the code folds 2 zmm registers in parallel
_fold_128_B_loop:
add arg2, 128 ; update the buffer pointer
vmovdqu8 zmm8, [arg2+16*0]
vpclmulqdq zmm1, zmm0, zmm10, 0x10
vpclmulqdq zmm2, zmm0, zmm10, 0x01
vpxorq zmm0, zmm1, zmm2
vpxorq zmm0, zmm0, zmm8
vpclmulqdq zmm0, zmm0, zmm10, 0x01
vpternlogq zmm0, zmm1, [arg2+16*0], 0x96
vmovdqu8 zmm9, [arg2+16*4]
vpclmulqdq zmm5, zmm4, zmm10, 0x10
vpclmulqdq zmm6, zmm4, zmm10, 0x01
vpxorq zmm4, zmm5, zmm6
vpxorq zmm4, zmm4, zmm9
vpclmulqdq zmm4, zmm4, zmm10, 0x01
vpternlogq zmm4, zmm5, [arg2+16*4], 0x96
sub arg3, 128
jge _fold_128_B_loop