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

View File

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

View File

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

View File

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

View File

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

View File

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