From c2bec3ea65ce35b01311d1cc4b314f6b4986b9c8 Mon Sep 17 00:00:00 2001 From: Greg Tucker Date: Wed, 2 Nov 2022 12:16:20 -0700 Subject: [PATCH] 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 --- crc/crc16_t10dif_by16_10.asm | 30 ++++++++++------------- crc/crc32_gzip_refl_by16_10.asm | 42 ++++++++++++--------------------- crc/crc32_ieee_by16_10.asm | 30 ++++++++++------------- crc/crc32_iscsi_by16_10.asm | 42 ++++++++++++--------------------- crc/crc64_iso_norm_by16_10.asm | 30 ++++++++++------------- crc/crc64_iso_refl_by16_10.asm | 42 ++++++++++++--------------------- 6 files changed, 81 insertions(+), 135 deletions(-) diff --git a/crc/crc16_t10dif_by16_10.asm b/crc/crc16_t10dif_by16_10.asm index 27a2e02..49a9095 100644 --- a/crc/crc16_t10dif_by16_10.asm +++ b/crc/crc16_t10dif_by16_10.asm @@ -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 diff --git a/crc/crc32_gzip_refl_by16_10.asm b/crc/crc32_gzip_refl_by16_10.asm index 15280b8..c70881e 100644 --- a/crc/crc32_gzip_refl_by16_10.asm +++ b/crc/crc32_gzip_refl_by16_10.asm @@ -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 diff --git a/crc/crc32_ieee_by16_10.asm b/crc/crc32_ieee_by16_10.asm index 5c3f52a..b563982 100644 --- a/crc/crc32_ieee_by16_10.asm +++ b/crc/crc32_ieee_by16_10.asm @@ -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 diff --git a/crc/crc32_iscsi_by16_10.asm b/crc/crc32_iscsi_by16_10.asm index 4c63bab..775a348 100644 --- a/crc/crc32_iscsi_by16_10.asm +++ b/crc/crc32_iscsi_by16_10.asm @@ -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 diff --git a/crc/crc64_iso_norm_by16_10.asm b/crc/crc64_iso_norm_by16_10.asm index 4eefbd3..30366b1 100644 --- a/crc/crc64_iso_norm_by16_10.asm +++ b/crc/crc64_iso_norm_by16_10.asm @@ -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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/crc/crc64_iso_refl_by16_10.asm b/crc/crc64_iso_refl_by16_10.asm index e5d5a08..fc99886 100644 --- a/crc/crc64_iso_refl_by16_10.asm +++ b/crc/crc64_iso_refl_by16_10.asm @@ -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