From aeb299bffc0050bd884a4066b67bf33c1788be20 Mon Sep 17 00:00:00 2001 From: Nicola Torracca Date: Sat, 6 Apr 2024 00:34:26 +0200 Subject: [PATCH 1/3] Signed-off-by: Nicola Torracca Use embedded broadcast for constants & VPTERNLOG for 3-way bitwise logical operations. --- mh_sha1/mh_sha1_block_avx2.asm | 16 +- mh_sha1/mh_sha1_block_avx512.asm | 57 +- .../mh_sha1_murmur3_x64_128_block_avx2.asm | 27 +- .../mh_sha1_murmur3_x64_128_block_avx512.asm | 57 +- mh_sha256/mh_sha256_block_avx512.asm | 330 +++-------- sha1_mb/sha1_mb_x16_avx512.asm | 88 ++- sha1_mb/sha1_mb_x8_avx2.asm | 24 +- sha256_mb/sha256_mb_x16_avx512.asm | 441 ++++----------- sha512_mb/sha512_mb_x8_avx512.asm | 243 ++++---- sm3_mb/sm3_mb_x16_avx512.asm | 521 ++++++------------ 10 files changed, 552 insertions(+), 1252 deletions(-) diff --git a/mh_sha1/mh_sha1_block_avx2.asm b/mh_sha1/mh_sha1_block_avx2.asm index fed35d83..ccdaf45c 100644 --- a/mh_sha1/mh_sha1_block_avx2.asm +++ b/mh_sha1/mh_sha1_block_avx2.asm @@ -406,7 +406,7 @@ func(mh_sha1_block_avx2) ;; ;; perform 0-79 steps ;; - vpbroadcastq K, [K00_19] + vpbroadcastd K, [K00_19] ;; do rounds 0...15 %assign I 0 %rep 16 @@ -426,14 +426,14 @@ func(mh_sha1_block_avx2) PREFETCH_X [mh_in_p + pref+128*0] PREFETCH_X [mh_in_p + pref+128*1] ;; do rounds 20...39 - vpbroadcastq K, [K20_39] + vpbroadcastd K, [K20_39] %rep 20 SHA1_STEP_16_79 A,B,C,D,E, TMP,FUN, I, K, MAGIC_F1, mh_data_p ROTATE_ARGS %assign I (I+1) %endrep ;; do rounds 40...59 - vpbroadcastq K, [K40_59] + vpbroadcastd K, [K40_59] %rep 20 SHA1_STEP_16_79 A,B,C,D,E, TMP,FUN, I, K, MAGIC_F2, mh_data_p ROTATE_ARGS @@ -442,7 +442,7 @@ func(mh_sha1_block_avx2) PREFETCH_X [mh_in_p + pref+128*2] PREFETCH_X [mh_in_p + pref+128*3] ;; do rounds 60...79 - vpbroadcastq K, [K60_79] + vpbroadcastd K, [K60_79] %rep 20 SHA1_STEP_16_79 A,B,C,D,E, TMP,FUN, I, K, MAGIC_F3, mh_data_p ROTATE_ARGS @@ -502,7 +502,7 @@ section .rodata align=32 align 32 PSHUFFLE_BYTE_FLIP_MASK: dq 0x0405060700010203, 0x0c0d0e0f08090a0b -K00_19: dq 0x5A8279995A827999 -K20_39: dq 0x6ED9EBA16ED9EBA1 -K40_59: dq 0x8F1BBCDC8F1BBCDC -K60_79: dq 0xCA62C1D6CA62C1D6 +K00_19: dq 0x5A827999 +K20_39: dq 0x6ED9EBA1 +K40_59: dq 0x8F1BBCDC +K60_79: dq 0xCA62C1D6 diff --git a/mh_sha1/mh_sha1_block_avx512.asm b/mh_sha1/mh_sha1_block_avx512.asm index a72c2166..e77a0212 100644 --- a/mh_sha1/mh_sha1_block_avx512.asm +++ b/mh_sha1/mh_sha1_block_avx512.asm @@ -258,7 +258,7 @@ func(mh_sha1_block_avx512) ; save rsp mov RSP_SAVE, rsp - cmp loops, 0 + test loops, loops jle .return ; align rsp to 64 Bytes needed by avx512 @@ -271,7 +271,7 @@ func(mh_sha1_block_avx512) VMOVPS HH3, [mh_digests_p + 64*3] VMOVPS HH4, [mh_digests_p + 64*4] ;a mask used to transform to big-endian data - vmovdqa64 SHUF_MASK, [PSHUFFLE_BYTE_FLIP_MASK] + vbroadcasti32x4 SHUF_MASK, [PSHUFFLE_BYTE_FLIP_MASK] .block_loop: ;transform to big-endian data and store on aligned_frame @@ -293,7 +293,7 @@ func(mh_sha1_block_avx512) vmovdqa64 D, HH3 vmovdqa64 E, HH4 - vmovdqa32 KT, [K00_19] + vpbroadcastd KT, [K00_19] %assign I 0xCA %assign J 0 %assign K 2 @@ -306,13 +306,13 @@ func(mh_sha1_block_avx512) MSG_SCHED_ROUND_16_79 APPEND(W,J), APPEND(W,K), APPEND(W,L), APPEND(W,M) %endif %if N = 19 - vmovdqa32 KT, [K20_39] + vpbroadcastd KT, [K20_39] %assign I 0x96 %elif N = 39 - vmovdqa32 KT, [K40_59] + vpbroadcastd KT, [K40_59] %assign I 0xE8 %elif N = 59 - vmovdqa32 KT, [K60_79] + vpbroadcastd KT, [K60_79] %assign I 0x96 %endif %if N % 10 = 9 @@ -355,48 +355,11 @@ section .data align=64 align 64 PSHUFFLE_BYTE_FLIP_MASK: dq 0x0405060700010203 dq 0x0c0d0e0f08090a0b - dq 0x0405060700010203 - dq 0x0c0d0e0f08090a0b - dq 0x0405060700010203 - dq 0x0c0d0e0f08090a0b - dq 0x0405060700010203 - dq 0x0c0d0e0f08090a0b -K00_19: dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - -K20_39: dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - -K40_59: dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - -K60_79: dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 +K00_19: dq 0x5A827999 +K20_39: dq 0x6ED9EBA1 +K40_59: dq 0x8F1BBCDC +K60_79: dq 0xCA62C1D6 %else %ifidn __OUTPUT_FORMAT__, win64 diff --git a/mh_sha1_murmur3_x64_128/mh_sha1_murmur3_x64_128_block_avx2.asm b/mh_sha1_murmur3_x64_128/mh_sha1_murmur3_x64_128_block_avx2.asm index 3fb440bf..0c6bc0a7 100644 --- a/mh_sha1_murmur3_x64_128/mh_sha1_murmur3_x64_128_block_avx2.asm +++ b/mh_sha1_murmur3_x64_128/mh_sha1_murmur3_x64_128_block_avx2.asm @@ -473,7 +473,7 @@ func(mh_sha1_murmur3_x64_128_block_avx2) ; save rsp mov RSP_SAVE, rsp - cmp loops, 0 + test loops, loops jle .return ; leave enough space to store segs_digests @@ -507,7 +507,7 @@ func(mh_sha1_murmur3_x64_128_block_avx2) .block_loop: ;transform to big-endian data and store on aligned_frame - vmovdqa F, [PSHUFFLE_BYTE_FLIP_MASK] + vbroadcasti128 F, [PSHUFFLE_BYTE_FLIP_MASK] ;transform input data from DWORD*16_SEGS*5 to DWORD*8_SEGS*5*2 %assign I 0 %rep 16 @@ -521,7 +521,7 @@ func(mh_sha1_murmur3_x64_128_block_avx2) %assign I (I+1) %endrep - mov mh_segs, 0 ;start from the first 8 segments + xor mh_segs, mh_segs ;start from the first 8 segments mov pref, 1024 ;avoid prefetch repeadtedly .segs_loop: ;; Initialize digests @@ -539,7 +539,7 @@ func(mh_sha1_murmur3_x64_128_block_avx2) ;; ;; perform 0-79 steps ;; - vmovdqa K, [K00_19] + vpbroadcastd K, [K00_19] ;; do rounds 0...15 %assign I 0 %rep 16 @@ -560,7 +560,7 @@ func(mh_sha1_murmur3_x64_128_block_avx2) PREFETCH_X [mh_in_p + pref+128*0] PREFETCH_X [mh_in_p + pref+128*1] ;; do rounds 20...39 - vmovdqa K, [K20_39] + vpbroadcastd K, [K20_39] %rep 20 %assign J (I % 2) SHA1_STEP_16_79(J) A,B,C,D,E, TMP,FUN, I, K, MAGIC_F1, mh_data_p @@ -568,7 +568,7 @@ func(mh_sha1_murmur3_x64_128_block_avx2) %assign I (I+1) %endrep ;; do rounds 40...59 - vmovdqa K, [K40_59] + vpbroadcastd K, [K40_59] %rep 20 %assign J (I % 2) SHA1_STEP_16_79(J) A,B,C,D,E, TMP,FUN, I, K, MAGIC_F2, mh_data_p @@ -578,7 +578,7 @@ func(mh_sha1_murmur3_x64_128_block_avx2) PREFETCH_X [mh_in_p + pref+128*2] PREFETCH_X [mh_in_p + pref+128*3] ;; do rounds 60...79 - vmovdqa K, [K60_79] + vpbroadcastd K, [K60_79] %rep 20 %assign J (I % 2) SHA1_STEP_16_79(J) A,B,C,D,E, TMP,FUN, I, K, MAGIC_F3, mh_data_p @@ -642,12 +642,7 @@ section .data align=32 align 32 PSHUFFLE_BYTE_FLIP_MASK: dq 0x0405060700010203, 0x0c0d0e0f08090a0b - dq 0x0405060700010203, 0x0c0d0e0f08090a0b -K00_19: dq 0x5A8279995A827999, 0x5A8279995A827999 - dq 0x5A8279995A827999, 0x5A8279995A827999 -K20_39: dq 0x6ED9EBA16ED9EBA1, 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1, 0x6ED9EBA16ED9EBA1 -K40_59: dq 0x8F1BBCDC8F1BBCDC, 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC, 0x8F1BBCDC8F1BBCDC -K60_79: dq 0xCA62C1D6CA62C1D6, 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6, 0xCA62C1D6CA62C1D6 +K00_19: dq 0x5A827999 +K20_39: dq 0x6ED9EBA1 +K40_59: dq 0x8F1BBCDC +K60_79: dq 0xCA62C1D6 diff --git a/mh_sha1_murmur3_x64_128/mh_sha1_murmur3_x64_128_block_avx512.asm b/mh_sha1_murmur3_x64_128/mh_sha1_murmur3_x64_128_block_avx512.asm index a5c15707..7230f459 100644 --- a/mh_sha1_murmur3_x64_128/mh_sha1_murmur3_x64_128_block_avx512.asm +++ b/mh_sha1_murmur3_x64_128/mh_sha1_murmur3_x64_128_block_avx512.asm @@ -341,7 +341,7 @@ func(mh_sha1_murmur3_x64_128_block_avx512) ; save rsp mov RSP_SAVE, rsp - cmp loops, 0 + test loops, loops jle .return ; align rsp to 64 Bytes needed by avx512 @@ -354,7 +354,7 @@ func(mh_sha1_murmur3_x64_128_block_avx512) VMOVPS HH3, [mh_digests_p + 64*3] VMOVPS HH4, [mh_digests_p + 64*4] ;a mask used to transform to big-endian data - vmovdqa64 SHUF_MASK, [PSHUFFLE_BYTE_FLIP_MASK] + vbroadcasti32x4 SHUF_MASK, [PSHUFFLE_BYTE_FLIP_MASK] ;init murmur variables mov mur_in_p, mh_in_p ;different steps between murmur and mh_sha1 @@ -384,7 +384,7 @@ func(mh_sha1_murmur3_x64_128_block_avx512) vmovdqa64 D, HH3 vmovdqa64 E, HH4 - vmovdqa32 KT, [K00_19] + vpbroadcastd KT, [K00_19] %assign I 0xCA %assign J 0 %assign K 2 @@ -399,13 +399,13 @@ func(mh_sha1_murmur3_x64_128_block_avx512) PROCESS_LOOP APPEND(W,J), I %endif %if N = 19 - vmovdqa32 KT, [K20_39] + vpbroadcastd KT, [K20_39] %assign I 0x96 %elif N = 39 - vmovdqa32 KT, [K40_59] + vpbroadcastd KT, [K40_59] %assign I 0xE8 %elif N = 59 - vmovdqa32 KT, [K60_79] + vpbroadcastd KT, [K60_79] %assign I 0x96 %endif %if N % 20 = 19 @@ -453,48 +453,11 @@ section .data align=64 align 64 PSHUFFLE_BYTE_FLIP_MASK: dq 0x0405060700010203 dq 0x0c0d0e0f08090a0b - dq 0x0405060700010203 - dq 0x0c0d0e0f08090a0b - dq 0x0405060700010203 - dq 0x0c0d0e0f08090a0b - dq 0x0405060700010203 - dq 0x0c0d0e0f08090a0b -K00_19: dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - dq 0x5A8279995A827999 - -K20_39: dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1 - -K40_59: dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC - -K60_79: dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6 +K00_19: dq 0x5A827999 +K20_39: dq 0x6ED9EBA1 +K40_59: dq 0x8F1BBCDC +K60_79: dq 0xCA62C1D6 %else %ifidn __OUTPUT_FORMAT__, win64 diff --git a/mh_sha256/mh_sha256_block_avx512.asm b/mh_sha256/mh_sha256_block_avx512.asm index 1ee76ddf..8376bbff 100644 --- a/mh_sha256/mh_sha256_block_avx512.asm +++ b/mh_sha256/mh_sha256_block_avx512.asm @@ -219,7 +219,7 @@ section .text ;; H becomes T2, then add T1 for A ;; D becomes D + T1 for E - vpaddd T1, H, TMP3 ; T1 = H + Kt + vpaddd T1, H, [TBL + ((%%ROUND)*4)]{1to16} ; T1 = H + Kt vmovdqa32 TMP0, E vprord TMP1, E, 6 ; ROR_6(E) vprord TMP2, E, 11 ; ROR_11(E) @@ -240,7 +240,6 @@ section .text vpaddd H, H, TMP0 ; H(T2) = SIGMA0(A) + MAJ(A,B,C) vpaddd H, H, T1 ; H(A) = H(T2) + T1 - vmovdqa32 TMP3, [TBL + ((%%ROUND+1)*64)] ; Next Kt ;; Rotate the args A-H (rotation of names associated with regs) ROTATE_ARGS @@ -303,7 +302,7 @@ func(mh_sha256_block_avx512) ; save rsp mov RSP_SAVE, rsp - cmp loops, 0 + test loops, loops jle .return ; leave enough space to store segs_digests @@ -335,7 +334,7 @@ func(mh_sha256_block_avx512) vmovdqa32 TMP3, [TBL] ; First K ;transform to big-endian data and store on aligned_frame - vmovdqa32 TMP2, [PSHUFFLE_BYTE_FLIP_MASK] + vbroadcasti32x4 TMP2, [PSHUFFLE_BYTE_FLIP_MASK] ;using extra 16 ZMM registers instead of heap %assign I 0 %rep 8 @@ -410,268 +409,73 @@ endproc_frame section .data align 64 TABLE: - dq 0x428a2f98428a2f98, 0x428a2f98428a2f98 - dq 0x428a2f98428a2f98, 0x428a2f98428a2f98 - dq 0x428a2f98428a2f98, 0x428a2f98428a2f98 - dq 0x428a2f98428a2f98, 0x428a2f98428a2f98 - dq 0x7137449171374491, 0x7137449171374491 - dq 0x7137449171374491, 0x7137449171374491 - dq 0x7137449171374491, 0x7137449171374491 - dq 0x7137449171374491, 0x7137449171374491 - dq 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf - dq 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf - dq 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf - dq 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf - dq 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5 - dq 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5 - dq 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5 - dq 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5 - dq 0x3956c25b3956c25b, 0x3956c25b3956c25b - dq 0x3956c25b3956c25b, 0x3956c25b3956c25b - dq 0x3956c25b3956c25b, 0x3956c25b3956c25b - dq 0x3956c25b3956c25b, 0x3956c25b3956c25b - dq 0x59f111f159f111f1, 0x59f111f159f111f1 - dq 0x59f111f159f111f1, 0x59f111f159f111f1 - dq 0x59f111f159f111f1, 0x59f111f159f111f1 - dq 0x59f111f159f111f1, 0x59f111f159f111f1 - dq 0x923f82a4923f82a4, 0x923f82a4923f82a4 - dq 0x923f82a4923f82a4, 0x923f82a4923f82a4 - dq 0x923f82a4923f82a4, 0x923f82a4923f82a4 - dq 0x923f82a4923f82a4, 0x923f82a4923f82a4 - dq 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5 - dq 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5 - dq 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5 - dq 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5 - dq 0xd807aa98d807aa98, 0xd807aa98d807aa98 - dq 0xd807aa98d807aa98, 0xd807aa98d807aa98 - dq 0xd807aa98d807aa98, 0xd807aa98d807aa98 - dq 0xd807aa98d807aa98, 0xd807aa98d807aa98 - dq 0x12835b0112835b01, 0x12835b0112835b01 - dq 0x12835b0112835b01, 0x12835b0112835b01 - dq 0x12835b0112835b01, 0x12835b0112835b01 - dq 0x12835b0112835b01, 0x12835b0112835b01 - dq 0x243185be243185be, 0x243185be243185be - dq 0x243185be243185be, 0x243185be243185be - dq 0x243185be243185be, 0x243185be243185be - dq 0x243185be243185be, 0x243185be243185be - dq 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3 - dq 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3 - dq 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3 - dq 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3 - dq 0x72be5d7472be5d74, 0x72be5d7472be5d74 - dq 0x72be5d7472be5d74, 0x72be5d7472be5d74 - dq 0x72be5d7472be5d74, 0x72be5d7472be5d74 - dq 0x72be5d7472be5d74, 0x72be5d7472be5d74 - dq 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe - dq 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe - dq 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe - dq 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe - dq 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7 - dq 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7 - dq 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7 - dq 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7 - dq 0xc19bf174c19bf174, 0xc19bf174c19bf174 - dq 0xc19bf174c19bf174, 0xc19bf174c19bf174 - dq 0xc19bf174c19bf174, 0xc19bf174c19bf174 - dq 0xc19bf174c19bf174, 0xc19bf174c19bf174 - dq 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1 - dq 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1 - dq 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1 - dq 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1 - dq 0xefbe4786efbe4786, 0xefbe4786efbe4786 - dq 0xefbe4786efbe4786, 0xefbe4786efbe4786 - dq 0xefbe4786efbe4786, 0xefbe4786efbe4786 - dq 0xefbe4786efbe4786, 0xefbe4786efbe4786 - dq 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6 - dq 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6 - dq 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6 - dq 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6 - dq 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc - dq 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc - dq 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc - dq 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc - dq 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f - dq 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f - dq 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f - dq 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f - dq 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa - dq 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa - dq 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa - dq 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa - dq 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc - dq 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc - dq 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc - dq 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc - dq 0x76f988da76f988da, 0x76f988da76f988da - dq 0x76f988da76f988da, 0x76f988da76f988da - dq 0x76f988da76f988da, 0x76f988da76f988da - dq 0x76f988da76f988da, 0x76f988da76f988da - dq 0x983e5152983e5152, 0x983e5152983e5152 - dq 0x983e5152983e5152, 0x983e5152983e5152 - dq 0x983e5152983e5152, 0x983e5152983e5152 - dq 0x983e5152983e5152, 0x983e5152983e5152 - dq 0xa831c66da831c66d, 0xa831c66da831c66d - dq 0xa831c66da831c66d, 0xa831c66da831c66d - dq 0xa831c66da831c66d, 0xa831c66da831c66d - dq 0xa831c66da831c66d, 0xa831c66da831c66d - dq 0xb00327c8b00327c8, 0xb00327c8b00327c8 - dq 0xb00327c8b00327c8, 0xb00327c8b00327c8 - dq 0xb00327c8b00327c8, 0xb00327c8b00327c8 - dq 0xb00327c8b00327c8, 0xb00327c8b00327c8 - dq 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7 - dq 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7 - dq 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7 - dq 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7 - dq 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3 - dq 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3 - dq 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3 - dq 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3 - dq 0xd5a79147d5a79147, 0xd5a79147d5a79147 - dq 0xd5a79147d5a79147, 0xd5a79147d5a79147 - dq 0xd5a79147d5a79147, 0xd5a79147d5a79147 - dq 0xd5a79147d5a79147, 0xd5a79147d5a79147 - dq 0x06ca635106ca6351, 0x06ca635106ca6351 - dq 0x06ca635106ca6351, 0x06ca635106ca6351 - dq 0x06ca635106ca6351, 0x06ca635106ca6351 - dq 0x06ca635106ca6351, 0x06ca635106ca6351 - dq 0x1429296714292967, 0x1429296714292967 - dq 0x1429296714292967, 0x1429296714292967 - dq 0x1429296714292967, 0x1429296714292967 - dq 0x1429296714292967, 0x1429296714292967 - dq 0x27b70a8527b70a85, 0x27b70a8527b70a85 - dq 0x27b70a8527b70a85, 0x27b70a8527b70a85 - dq 0x27b70a8527b70a85, 0x27b70a8527b70a85 - dq 0x27b70a8527b70a85, 0x27b70a8527b70a85 - dq 0x2e1b21382e1b2138, 0x2e1b21382e1b2138 - dq 0x2e1b21382e1b2138, 0x2e1b21382e1b2138 - dq 0x2e1b21382e1b2138, 0x2e1b21382e1b2138 - dq 0x2e1b21382e1b2138, 0x2e1b21382e1b2138 - dq 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc - dq 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc - dq 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc - dq 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc - dq 0x53380d1353380d13, 0x53380d1353380d13 - dq 0x53380d1353380d13, 0x53380d1353380d13 - dq 0x53380d1353380d13, 0x53380d1353380d13 - dq 0x53380d1353380d13, 0x53380d1353380d13 - dq 0x650a7354650a7354, 0x650a7354650a7354 - dq 0x650a7354650a7354, 0x650a7354650a7354 - dq 0x650a7354650a7354, 0x650a7354650a7354 - dq 0x650a7354650a7354, 0x650a7354650a7354 - dq 0x766a0abb766a0abb, 0x766a0abb766a0abb - dq 0x766a0abb766a0abb, 0x766a0abb766a0abb - dq 0x766a0abb766a0abb, 0x766a0abb766a0abb - dq 0x766a0abb766a0abb, 0x766a0abb766a0abb - dq 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e - dq 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e - dq 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e - dq 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e - dq 0x92722c8592722c85, 0x92722c8592722c85 - dq 0x92722c8592722c85, 0x92722c8592722c85 - dq 0x92722c8592722c85, 0x92722c8592722c85 - dq 0x92722c8592722c85, 0x92722c8592722c85 - dq 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1 - dq 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1 - dq 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1 - dq 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1 - dq 0xa81a664ba81a664b, 0xa81a664ba81a664b - dq 0xa81a664ba81a664b, 0xa81a664ba81a664b - dq 0xa81a664ba81a664b, 0xa81a664ba81a664b - dq 0xa81a664ba81a664b, 0xa81a664ba81a664b - dq 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70 - dq 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70 - dq 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70 - dq 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70 - dq 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3 - dq 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3 - dq 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3 - dq 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3 - dq 0xd192e819d192e819, 0xd192e819d192e819 - dq 0xd192e819d192e819, 0xd192e819d192e819 - dq 0xd192e819d192e819, 0xd192e819d192e819 - dq 0xd192e819d192e819, 0xd192e819d192e819 - dq 0xd6990624d6990624, 0xd6990624d6990624 - dq 0xd6990624d6990624, 0xd6990624d6990624 - dq 0xd6990624d6990624, 0xd6990624d6990624 - dq 0xd6990624d6990624, 0xd6990624d6990624 - dq 0xf40e3585f40e3585, 0xf40e3585f40e3585 - dq 0xf40e3585f40e3585, 0xf40e3585f40e3585 - dq 0xf40e3585f40e3585, 0xf40e3585f40e3585 - dq 0xf40e3585f40e3585, 0xf40e3585f40e3585 - dq 0x106aa070106aa070, 0x106aa070106aa070 - dq 0x106aa070106aa070, 0x106aa070106aa070 - dq 0x106aa070106aa070, 0x106aa070106aa070 - dq 0x106aa070106aa070, 0x106aa070106aa070 - dq 0x19a4c11619a4c116, 0x19a4c11619a4c116 - dq 0x19a4c11619a4c116, 0x19a4c11619a4c116 - dq 0x19a4c11619a4c116, 0x19a4c11619a4c116 - dq 0x19a4c11619a4c116, 0x19a4c11619a4c116 - dq 0x1e376c081e376c08, 0x1e376c081e376c08 - dq 0x1e376c081e376c08, 0x1e376c081e376c08 - dq 0x1e376c081e376c08, 0x1e376c081e376c08 - dq 0x1e376c081e376c08, 0x1e376c081e376c08 - dq 0x2748774c2748774c, 0x2748774c2748774c - dq 0x2748774c2748774c, 0x2748774c2748774c - dq 0x2748774c2748774c, 0x2748774c2748774c - dq 0x2748774c2748774c, 0x2748774c2748774c - dq 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5 - dq 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5 - dq 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5 - dq 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5 - dq 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3 - dq 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3 - dq 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3 - dq 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3 - dq 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a - dq 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a - dq 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a - dq 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a - dq 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f - dq 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f - dq 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f - dq 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f - dq 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3 - dq 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3 - dq 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3 - dq 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3 - dq 0x748f82ee748f82ee, 0x748f82ee748f82ee - dq 0x748f82ee748f82ee, 0x748f82ee748f82ee - dq 0x748f82ee748f82ee, 0x748f82ee748f82ee - dq 0x748f82ee748f82ee, 0x748f82ee748f82ee - dq 0x78a5636f78a5636f, 0x78a5636f78a5636f - dq 0x78a5636f78a5636f, 0x78a5636f78a5636f - dq 0x78a5636f78a5636f, 0x78a5636f78a5636f - dq 0x78a5636f78a5636f, 0x78a5636f78a5636f - dq 0x84c8781484c87814, 0x84c8781484c87814 - dq 0x84c8781484c87814, 0x84c8781484c87814 - dq 0x84c8781484c87814, 0x84c8781484c87814 - dq 0x84c8781484c87814, 0x84c8781484c87814 - dq 0x8cc702088cc70208, 0x8cc702088cc70208 - dq 0x8cc702088cc70208, 0x8cc702088cc70208 - dq 0x8cc702088cc70208, 0x8cc702088cc70208 - dq 0x8cc702088cc70208, 0x8cc702088cc70208 - dq 0x90befffa90befffa, 0x90befffa90befffa - dq 0x90befffa90befffa, 0x90befffa90befffa - dq 0x90befffa90befffa, 0x90befffa90befffa - dq 0x90befffa90befffa, 0x90befffa90befffa - dq 0xa4506ceba4506ceb, 0xa4506ceba4506ceb - dq 0xa4506ceba4506ceb, 0xa4506ceba4506ceb - dq 0xa4506ceba4506ceb, 0xa4506ceba4506ceb - dq 0xa4506ceba4506ceb, 0xa4506ceba4506ceb - dq 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7 - dq 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7 - dq 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7 - dq 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7 - dq 0xc67178f2c67178f2, 0xc67178f2c67178f2 - dq 0xc67178f2c67178f2, 0xc67178f2c67178f2 - dq 0xc67178f2c67178f2, 0xc67178f2c67178f2 - dq 0xc67178f2c67178f2, 0xc67178f2c67178f2 + dd 0x428a2f98 + dd 0x71374491 + dd 0xb5c0fbcf + dd 0xe9b5dba5 + dd 0x3956c25b + dd 0x59f111f1 + dd 0x923f82a4 + dd 0xab1c5ed5 + dd 0xd807aa98 + dd 0x12835b01 + dd 0x243185be + dd 0x550c7dc3 + dd 0x72be5d74 + dd 0x80deb1fe + dd 0x9bdc06a7 + dd 0xc19bf174 + dd 0xe49b69c1 + dd 0xefbe4786 + dd 0x0fc19dc6 + dd 0x240ca1cc + dd 0x2de92c6f + dd 0x4a7484aa + dd 0x5cb0a9dc + dd 0x76f988da + dd 0x983e5152 + dd 0xa831c66d + dd 0xb00327c8 + dd 0xbf597fc7 + dd 0xc6e00bf3 + dd 0xd5a79147 + dd 0x06ca6351 + dd 0x14292967 + dd 0x27b70a85 + dd 0x2e1b2138 + dd 0x4d2c6dfc + dd 0x53380d13 + dd 0x650a7354 + dd 0x766a0abb + dd 0x81c2c92e + dd 0x92722c85 + dd 0xa2bfe8a1 + dd 0xa81a664b + dd 0xc24b8b70 + dd 0xc76c51a3 + dd 0xd192e819 + dd 0xd6990624 + dd 0xf40e3585 + dd 0x106aa070 + dd 0x19a4c116 + dd 0x1e376c08 + dd 0x2748774c + dd 0x34b0bcb5 + dd 0x391c0cb3 + dd 0x4ed8aa4a + dd 0x5b9cca4f + dd 0x682e6ff3 + dd 0x748f82ee + dd 0x78a5636f + dd 0x84c87814 + dd 0x8cc70208 + dd 0x90befffa + dd 0xa4506ceb + dd 0xbef9a3f7 + dd 0xc67178f2 PSHUFFLE_BYTE_FLIP_MASK: dq 0x0405060700010203, 0x0c0d0e0f08090a0b - dq 0x0405060700010203, 0x0c0d0e0f08090a0b - dq 0x0405060700010203, 0x0c0d0e0f08090a0b - dq 0x0405060700010203, 0x0c0d0e0f08090a0b %else %ifidn __OUTPUT_FORMAT__, win64 diff --git a/sha1_mb/sha1_mb_x16_avx512.asm b/sha1_mb/sha1_mb_x16_avx512.asm index d64ffe2b..00bbf94f 100644 --- a/sha1_mb/sha1_mb_x16_avx512.asm +++ b/sha1_mb/sha1_mb_x16_avx512.asm @@ -341,7 +341,7 @@ section .text %define %%WT %1 %define %%OFFSET %2 mov inp0, [IN + (%%OFFSET*8)] - vmovups %%WT, [inp0+IDX] + vmovdqu64 %%WT, [inp0+IDX] %endmacro align 64 @@ -354,11 +354,11 @@ sha1_mb_x16_avx512: endbranch ;; Initialize digests - vmovups A, [DIGEST + 0*64] - vmovups B, [DIGEST + 1*64] - vmovups C, [DIGEST + 2*64] - vmovups D, [DIGEST + 3*64] - vmovups E, [DIGEST + 4*64] + vmovdqu64 A, [DIGEST + 0*64] + vmovdqu64 B, [DIGEST + 1*64] + vmovdqu64 C, [DIGEST + 2*64] + vmovdqu64 D, [DIGEST + 3*64] + vmovdqu64 E, [DIGEST + 4*64] xor IDX, IDX @@ -372,14 +372,14 @@ sha1_mb_x16_avx512: mov inp6, [IN + 6*8] mov inp7, [IN + 7*8] - vmovups W0,[inp0+IDX] - vmovups W1,[inp1+IDX] - vmovups W2,[inp2+IDX] - vmovups W3,[inp3+IDX] - vmovups W4,[inp4+IDX] - vmovups W5,[inp5+IDX] - vmovups W6,[inp6+IDX] - vmovups W7,[inp7+IDX] + vmovdqu64 W0,[inp0] + vmovdqu64 W1,[inp1] + vmovdqu64 W2,[inp2] + vmovdqu64 W3,[inp3] + vmovdqu64 W4,[inp4] + vmovdqu64 W5,[inp5] + vmovdqu64 W6,[inp6] + vmovdqu64 W7,[inp7] mov inp0, [IN + 8*8] mov inp1, [IN + 9*8] @@ -390,17 +390,17 @@ sha1_mb_x16_avx512: mov inp6, [IN +14*8] mov inp7, [IN +15*8] - vmovups W8, [inp0+IDX] - vmovups W9, [inp1+IDX] - vmovups W10,[inp2+IDX] - vmovups W11,[inp3+IDX] - vmovups W12,[inp4+IDX] - vmovups W13,[inp5+IDX] - vmovups W14,[inp6+IDX] - vmovups W15,[inp7+IDX] + vmovdqu64 W8, [inp0] + vmovdqu64 W9, [inp1] + vmovdqu64 W10,[inp2] + vmovdqu64 W11,[inp3] + vmovdqu64 W12,[inp4] + vmovdqu64 W13,[inp5] + vmovdqu64 W14,[inp6] + vmovdqu64 W15,[inp7] lloop: - vmovdqa32 TMP2, [PSHUFFLE_BYTE_FLIP_MASK] + vbroadcasti32x4 TMP2, [PSHUFFLE_BYTE_FLIP_MASK] add IDX, 64 @@ -419,7 +419,7 @@ lloop: vmovdqa32 DD, D vmovdqa32 EE, E - vmovdqa32 KT, [K00_19] + vpbroadcastd KT, [K00_19] %assign I 0xCA %assign J 0 %assign K 2 @@ -430,13 +430,13 @@ lloop: PROCESS_LOOP APPEND(W,J), I MSG_SCHED_ROUND_16_79 APPEND(W,J), APPEND(W,K), APPEND(W,L), APPEND(W,M) %if N = 19 - vmovdqa32 KT, [K20_39] + vpbroadcastd KT, [K20_39] %assign I 0x96 %elif N = 39 - vmovdqa32 KT, [K40_59] + vpbroadcastd KT, [K40_59] %assign I 0xE8 %elif N = 59 - vmovdqa32 KT, [K60_79] + vpbroadcastd KT, [K60_79] %assign I 0x96 %endif %assign J ((J+1)% 16) @@ -505,38 +505,24 @@ lastLoop: ; Write out digest ; Do we need to untranspose digests??? - vmovups [DIGEST + 0*64], A - vmovups [DIGEST + 1*64], B - vmovups [DIGEST + 2*64], C - vmovups [DIGEST + 3*64], D - vmovups [DIGEST + 4*64], E + vmovdqu64 [DIGEST + 0*64], A + vmovdqu64 [DIGEST + 1*64], B + vmovdqu64 [DIGEST + 2*64], C + vmovdqu64 [DIGEST + 3*64], D + vmovdqu64 [DIGEST + 4*64], E ret section .data align 64 -K00_19: dq 0x5A8279995A827999, 0x5A8279995A827999 - dq 0x5A8279995A827999, 0x5A8279995A827999 - dq 0x5A8279995A827999, 0x5A8279995A827999 - dq 0x5A8279995A827999, 0x5A8279995A827999 -K20_39: dq 0x6ED9EBA16ED9EBA1, 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1, 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1, 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1, 0x6ED9EBA16ED9EBA1 -K40_59: dq 0x8F1BBCDC8F1BBCDC, 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC, 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC, 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC, 0x8F1BBCDC8F1BBCDC -K60_79: dq 0xCA62C1D6CA62C1D6, 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6, 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6, 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6, 0xCA62C1D6CA62C1D6 +K00_19: dd 0x5A827999 +K20_39: dd 0x6ED9EBA1 +K40_59: dd 0x8F1BBCDC +K60_79: dd 0xCA62C1D6 PSHUFFLE_BYTE_FLIP_MASK: dq 0x0405060700010203, 0x0c0d0e0f08090a0b - dq 0x0405060700010203, 0x0c0d0e0f08090a0b - dq 0x0405060700010203, 0x0c0d0e0f08090a0b - dq 0x0405060700010203, 0x0c0d0e0f08090a0b +align 64 PSHUFFLE_TRANSPOSE16_MASK1: dq 0x0000000000000000 dq 0x0000000000000001 dq 0x0000000000000008 diff --git a/sha1_mb/sha1_mb_x8_avx2.asm b/sha1_mb/sha1_mb_x8_avx2.asm index edcba6d3..c56fb661 100644 --- a/sha1_mb/sha1_mb_x8_avx2.asm +++ b/sha1_mb/sha1_mb_x8_avx2.asm @@ -373,7 +373,7 @@ sha1_mb_x8_avx2: xor IDX, IDX lloop: - vmovdqu F, [PSHUFFLE_BYTE_FLIP_MASK] + vbroadcasti128 F, [PSHUFFLE_BYTE_FLIP_MASK] %assign I 0 %rep 2 VMOVPS T0,[inp0+IDX] @@ -416,7 +416,7 @@ lloop: ;; ;; perform 0-79 steps ;; - vmovdqu K, [K00_19] + vpbroadcastd K, [K00_19] ;; do rounds 0...15 %assign I 0 %rep 16 @@ -435,7 +435,7 @@ lloop: %endrep ;; do rounds 20...39 - vmovdqu K, [K20_39] + vpbroadcastd K, [K20_39] %rep 20 SHA1_STEP_16_79 A,B,C,D,E, TMP,FUN, I, K, MAGIC_F1 ROTATE_ARGS @@ -443,7 +443,7 @@ lloop: %endrep ;; do rounds 40...59 - vmovdqu K, [K40_59] + vpbroadcastd K, [K40_59] %rep 20 SHA1_STEP_16_79 A,B,C,D,E, TMP,FUN, I, K, MAGIC_F2 ROTATE_ARGS @@ -451,7 +451,7 @@ lloop: %endrep ;; do rounds 60...79 - vmovdqu K, [K60_79] + vpbroadcastd K, [K60_79] %rep 20 SHA1_STEP_16_79 A,B,C,D,E, TMP,FUN, I, K, MAGIC_F3 ROTATE_ARGS @@ -505,14 +505,10 @@ lloop: section .data align=32 align 32 -K00_19: dq 0x5A8279995A827999, 0x5A8279995A827999 - dq 0x5A8279995A827999, 0x5A8279995A827999 -K20_39: dq 0x6ED9EBA16ED9EBA1, 0x6ED9EBA16ED9EBA1 - dq 0x6ED9EBA16ED9EBA1, 0x6ED9EBA16ED9EBA1 -K40_59: dq 0x8F1BBCDC8F1BBCDC, 0x8F1BBCDC8F1BBCDC - dq 0x8F1BBCDC8F1BBCDC, 0x8F1BBCDC8F1BBCDC -K60_79: dq 0xCA62C1D6CA62C1D6, 0xCA62C1D6CA62C1D6 - dq 0xCA62C1D6CA62C1D6, 0xCA62C1D6CA62C1D6 +K00_19: dd 0x5A827999 +K20_39: dd 0x6ED9EBA1 +K40_59: dd 0x8F1BBCDC +K60_79: dd 0xCA62C1D6 +align 32 PSHUFFLE_BYTE_FLIP_MASK: dq 0x0405060700010203, 0x0c0d0e0f08090a0b - dq 0x0405060700010203, 0x0c0d0e0f08090a0b diff --git a/sha256_mb/sha256_mb_x16_avx512.asm b/sha256_mb/sha256_mb_x16_avx512.asm index 89a977bb..276c0568 100644 --- a/sha256_mb/sha256_mb_x16_avx512.asm +++ b/sha256_mb/sha256_mb_x16_avx512.asm @@ -331,7 +331,7 @@ FIELD _rsp, 8, 8 ;; H becomes T2, then add T1 for A ;; D becomes D + T1 for E - vpaddd T1, H, TMP3 ; T1 = H + Kt + vpaddd T1, H, [TBL+ ((%%ROUND)*4)]{1to16} ; T1 = H + Kt vmovdqa32 TMP0, E vprord TMP1, E, 6 ; ROR_6(E) vprord TMP2, E, 11 ; ROR_11(E) @@ -352,8 +352,6 @@ FIELD _rsp, 8, 8 vpaddd H, H, TMP0 ; H(T2) = SIGMA0(A) + MAJ(A,B,C) vpaddd H, H, T1 ; H(A) = H(T2) + T1 - vmovdqa32 TMP3, [TBL + ((%%ROUND+1)*64)] ; Next Kt - ;; Rotate the args A-H (rotation of names associated with regs) ROTATE_ARGS %endmacro @@ -388,7 +386,7 @@ FIELD _rsp, 8, 8 vpternlogd TMP0, F, G, 0xCA ; TMP0 = CH(E,F,G) vpaddd T1, H, %%WT ; T1 = H + Wt vpternlogd TMP1, TMP2, TMP3, 0x96 ; TMP1 = SIGMA1(E) - vpaddd T1, T1, TMP6 ; T1 = T1 + Kt + vpaddd T1, T1, [TBL+ %%ROUND*4]{1to16} ; T1 = T1 + Kt vprord H, A, 2 ; ROR_2(A) vpaddd T1, T1, TMP0 ; T1 = T1 + CH(E,F,G) vprord TMP2, A, 13 ; ROR_13(A) @@ -413,7 +411,6 @@ FIELD _rsp, 8, 8 vpaddd %%WT, %%WT, TMP4 ; Wt = Wt-16 + sigma1(Wt-2) + ; Wt-7 + sigma0(Wt-15) + - vmovdqa32 TMP6, [TBL + ((%%ROUND+1)*64)] ; Next Kt ;; Rotate the args A-H (rotation of names associated with regs) ROTATE_ARGS @@ -447,7 +444,7 @@ FIELD _rsp, 8, 8 %define %%WT %1 %define %%OFFSET %2 mov inp0, [IN + (%%OFFSET*8)] - vmovups %%WT, [inp0+IDX] + vmovdqu64 %%WT, [inp0+IDX] %endmacro align 64 @@ -465,63 +462,63 @@ sha256_mb_x16_avx512: lea TBL, [TABLE] ;; Initialize digests - vmovups A, [DIGEST + 0*64] - vmovups B, [DIGEST + 1*64] - vmovups C, [DIGEST + 2*64] - vmovups D, [DIGEST + 3*64] - vmovups E, [DIGEST + 4*64] - vmovups F, [DIGEST + 5*64] - vmovups G, [DIGEST + 6*64] - vmovups H, [DIGEST + 7*64] + vmovdqu64 A, [DIGEST + 0*64] + vmovdqu64 B, [DIGEST + 1*64] + vmovdqu64 C, [DIGEST + 2*64] + vmovdqu64 D, [DIGEST + 3*64] + vmovdqu64 E, [DIGEST + 4*64] + vmovdqu64 F, [DIGEST + 5*64] + vmovdqu64 G, [DIGEST + 6*64] + vmovdqu64 H, [DIGEST + 7*64] ; Do we need to transpose digests??? ; SHA1 does not, but SHA256 has been - xor IDX, IDX ;; Read in first block of input data ;; Transpose input data - mov inp0, [IN + 0*8] - mov inp1, [IN + 1*8] - mov inp2, [IN + 2*8] - mov inp3, [IN + 3*8] - mov inp4, [IN + 4*8] - mov inp5, [IN + 5*8] - mov inp6, [IN + 6*8] - mov inp7, [IN + 7*8] - - vmovups W0,[inp0+IDX] - vmovups W1,[inp1+IDX] - vmovups W2,[inp2+IDX] - vmovups W3,[inp3+IDX] - vmovups W4,[inp4+IDX] - vmovups W5,[inp5+IDX] - vmovups W6,[inp6+IDX] - vmovups W7,[inp7+IDX] - - mov inp0, [IN + 8*8] - mov inp1, [IN + 9*8] - mov inp2, [IN +10*8] - mov inp3, [IN +11*8] - mov inp4, [IN +12*8] - mov inp5, [IN +13*8] - mov inp6, [IN +14*8] - mov inp7, [IN +15*8] - - vmovups W8, [inp0+IDX] - vmovups W9, [inp1+IDX] - vmovups W10,[inp2+IDX] - vmovups W11,[inp3+IDX] - vmovups W12,[inp4+IDX] - vmovups W13,[inp5+IDX] - vmovups W14,[inp6+IDX] - vmovups W15,[inp7+IDX] + lea IDX, [IN] ;; save the base address so the next load have 8bits offset + mov inp0, [IDX + 0*8] + mov inp1, [IDX + 1*8] + mov inp2, [IDX + 2*8] + mov inp3, [IDX + 3*8] + mov inp4, [IDX + 4*8] + mov inp5, [IDX + 5*8] + mov inp6, [IDX + 6*8] + mov inp7, [IDX + 7*8] + + vmovdqu64 W0,[inp0] + vmovdqu64 W1,[inp1] + vmovdqu64 W2,[inp2] + vmovdqu64 W3,[inp3] + vmovdqu64 W4,[inp4] + vmovdqu64 W5,[inp5] + vmovdqu64 W6,[inp6] + vmovdqu64 W7,[inp7] + + mov inp0, [IDX + 8*8] + mov inp1, [IDX + 9*8] + mov inp2, [IDX +10*8] + mov inp3, [IDX +11*8] + mov inp4, [IDX +12*8] + mov inp5, [IDX +13*8] + mov inp6, [IDX +14*8] + mov inp7, [IDX +15*8] + + xor IDX, IDX + vmovdqu64 W8, [inp0] + vmovdqu64 W9, [inp1] + vmovdqu64 W10,[inp2] + vmovdqu64 W11,[inp3] + vmovdqu64 W12,[inp4] + vmovdqu64 W13,[inp5] + vmovdqu64 W14,[inp6] + vmovdqu64 W15,[inp7] lloop: - vmovdqa32 TMP2, [PSHUFFLE_BYTE_FLIP_MASK] + vbroadcasti32x4 TMP2, [PSHUFFLE_BYTE_FLIP_MASK] - vmovdqa32 TMP3, [TBL] ; First K ; Save digests for later addition vmovdqa32 [rsp + _DIGEST_SAVE + 64*0], A @@ -625,14 +622,14 @@ lastLoop: ; Write out digest ; Do we need to untranspose digests??? - vmovups [DIGEST + 0*64], A - vmovups [DIGEST + 1*64], B - vmovups [DIGEST + 2*64], C - vmovups [DIGEST + 3*64], D - vmovups [DIGEST + 4*64], E - vmovups [DIGEST + 5*64], F - vmovups [DIGEST + 6*64], G - vmovups [DIGEST + 7*64], H + vmovdqu64 [DIGEST + 0*64], A + vmovdqu64 [DIGEST + 1*64], B + vmovdqu64 [DIGEST + 2*64], C + vmovdqu64 [DIGEST + 3*64], D + vmovdqu64 [DIGEST + 4*64], E + vmovdqu64 [DIGEST + 5*64], F + vmovdqu64 [DIGEST + 6*64], G + vmovdqu64 [DIGEST + 7*64], H mov rsp, [rsp + _rsp] @@ -641,269 +638,75 @@ lastLoop: section .data align 64 TABLE: - dq 0x428a2f98428a2f98, 0x428a2f98428a2f98 - dq 0x428a2f98428a2f98, 0x428a2f98428a2f98 - dq 0x428a2f98428a2f98, 0x428a2f98428a2f98 - dq 0x428a2f98428a2f98, 0x428a2f98428a2f98 - dq 0x7137449171374491, 0x7137449171374491 - dq 0x7137449171374491, 0x7137449171374491 - dq 0x7137449171374491, 0x7137449171374491 - dq 0x7137449171374491, 0x7137449171374491 - dq 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf - dq 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf - dq 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf - dq 0xb5c0fbcfb5c0fbcf, 0xb5c0fbcfb5c0fbcf - dq 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5 - dq 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5 - dq 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5 - dq 0xe9b5dba5e9b5dba5, 0xe9b5dba5e9b5dba5 - dq 0x3956c25b3956c25b, 0x3956c25b3956c25b - dq 0x3956c25b3956c25b, 0x3956c25b3956c25b - dq 0x3956c25b3956c25b, 0x3956c25b3956c25b - dq 0x3956c25b3956c25b, 0x3956c25b3956c25b - dq 0x59f111f159f111f1, 0x59f111f159f111f1 - dq 0x59f111f159f111f1, 0x59f111f159f111f1 - dq 0x59f111f159f111f1, 0x59f111f159f111f1 - dq 0x59f111f159f111f1, 0x59f111f159f111f1 - dq 0x923f82a4923f82a4, 0x923f82a4923f82a4 - dq 0x923f82a4923f82a4, 0x923f82a4923f82a4 - dq 0x923f82a4923f82a4, 0x923f82a4923f82a4 - dq 0x923f82a4923f82a4, 0x923f82a4923f82a4 - dq 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5 - dq 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5 - dq 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5 - dq 0xab1c5ed5ab1c5ed5, 0xab1c5ed5ab1c5ed5 - dq 0xd807aa98d807aa98, 0xd807aa98d807aa98 - dq 0xd807aa98d807aa98, 0xd807aa98d807aa98 - dq 0xd807aa98d807aa98, 0xd807aa98d807aa98 - dq 0xd807aa98d807aa98, 0xd807aa98d807aa98 - dq 0x12835b0112835b01, 0x12835b0112835b01 - dq 0x12835b0112835b01, 0x12835b0112835b01 - dq 0x12835b0112835b01, 0x12835b0112835b01 - dq 0x12835b0112835b01, 0x12835b0112835b01 - dq 0x243185be243185be, 0x243185be243185be - dq 0x243185be243185be, 0x243185be243185be - dq 0x243185be243185be, 0x243185be243185be - dq 0x243185be243185be, 0x243185be243185be - dq 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3 - dq 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3 - dq 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3 - dq 0x550c7dc3550c7dc3, 0x550c7dc3550c7dc3 - dq 0x72be5d7472be5d74, 0x72be5d7472be5d74 - dq 0x72be5d7472be5d74, 0x72be5d7472be5d74 - dq 0x72be5d7472be5d74, 0x72be5d7472be5d74 - dq 0x72be5d7472be5d74, 0x72be5d7472be5d74 - dq 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe - dq 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe - dq 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe - dq 0x80deb1fe80deb1fe, 0x80deb1fe80deb1fe - dq 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7 - dq 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7 - dq 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7 - dq 0x9bdc06a79bdc06a7, 0x9bdc06a79bdc06a7 - dq 0xc19bf174c19bf174, 0xc19bf174c19bf174 - dq 0xc19bf174c19bf174, 0xc19bf174c19bf174 - dq 0xc19bf174c19bf174, 0xc19bf174c19bf174 - dq 0xc19bf174c19bf174, 0xc19bf174c19bf174 - dq 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1 - dq 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1 - dq 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1 - dq 0xe49b69c1e49b69c1, 0xe49b69c1e49b69c1 - dq 0xefbe4786efbe4786, 0xefbe4786efbe4786 - dq 0xefbe4786efbe4786, 0xefbe4786efbe4786 - dq 0xefbe4786efbe4786, 0xefbe4786efbe4786 - dq 0xefbe4786efbe4786, 0xefbe4786efbe4786 - dq 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6 - dq 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6 - dq 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6 - dq 0x0fc19dc60fc19dc6, 0x0fc19dc60fc19dc6 - dq 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc - dq 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc - dq 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc - dq 0x240ca1cc240ca1cc, 0x240ca1cc240ca1cc - dq 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f - dq 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f - dq 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f - dq 0x2de92c6f2de92c6f, 0x2de92c6f2de92c6f - dq 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa - dq 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa - dq 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa - dq 0x4a7484aa4a7484aa, 0x4a7484aa4a7484aa - dq 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc - dq 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc - dq 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc - dq 0x5cb0a9dc5cb0a9dc, 0x5cb0a9dc5cb0a9dc - dq 0x76f988da76f988da, 0x76f988da76f988da - dq 0x76f988da76f988da, 0x76f988da76f988da - dq 0x76f988da76f988da, 0x76f988da76f988da - dq 0x76f988da76f988da, 0x76f988da76f988da - dq 0x983e5152983e5152, 0x983e5152983e5152 - dq 0x983e5152983e5152, 0x983e5152983e5152 - dq 0x983e5152983e5152, 0x983e5152983e5152 - dq 0x983e5152983e5152, 0x983e5152983e5152 - dq 0xa831c66da831c66d, 0xa831c66da831c66d - dq 0xa831c66da831c66d, 0xa831c66da831c66d - dq 0xa831c66da831c66d, 0xa831c66da831c66d - dq 0xa831c66da831c66d, 0xa831c66da831c66d - dq 0xb00327c8b00327c8, 0xb00327c8b00327c8 - dq 0xb00327c8b00327c8, 0xb00327c8b00327c8 - dq 0xb00327c8b00327c8, 0xb00327c8b00327c8 - dq 0xb00327c8b00327c8, 0xb00327c8b00327c8 - dq 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7 - dq 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7 - dq 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7 - dq 0xbf597fc7bf597fc7, 0xbf597fc7bf597fc7 - dq 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3 - dq 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3 - dq 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3 - dq 0xc6e00bf3c6e00bf3, 0xc6e00bf3c6e00bf3 - dq 0xd5a79147d5a79147, 0xd5a79147d5a79147 - dq 0xd5a79147d5a79147, 0xd5a79147d5a79147 - dq 0xd5a79147d5a79147, 0xd5a79147d5a79147 - dq 0xd5a79147d5a79147, 0xd5a79147d5a79147 - dq 0x06ca635106ca6351, 0x06ca635106ca6351 - dq 0x06ca635106ca6351, 0x06ca635106ca6351 - dq 0x06ca635106ca6351, 0x06ca635106ca6351 - dq 0x06ca635106ca6351, 0x06ca635106ca6351 - dq 0x1429296714292967, 0x1429296714292967 - dq 0x1429296714292967, 0x1429296714292967 - dq 0x1429296714292967, 0x1429296714292967 - dq 0x1429296714292967, 0x1429296714292967 - dq 0x27b70a8527b70a85, 0x27b70a8527b70a85 - dq 0x27b70a8527b70a85, 0x27b70a8527b70a85 - dq 0x27b70a8527b70a85, 0x27b70a8527b70a85 - dq 0x27b70a8527b70a85, 0x27b70a8527b70a85 - dq 0x2e1b21382e1b2138, 0x2e1b21382e1b2138 - dq 0x2e1b21382e1b2138, 0x2e1b21382e1b2138 - dq 0x2e1b21382e1b2138, 0x2e1b21382e1b2138 - dq 0x2e1b21382e1b2138, 0x2e1b21382e1b2138 - dq 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc - dq 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc - dq 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc - dq 0x4d2c6dfc4d2c6dfc, 0x4d2c6dfc4d2c6dfc - dq 0x53380d1353380d13, 0x53380d1353380d13 - dq 0x53380d1353380d13, 0x53380d1353380d13 - dq 0x53380d1353380d13, 0x53380d1353380d13 - dq 0x53380d1353380d13, 0x53380d1353380d13 - dq 0x650a7354650a7354, 0x650a7354650a7354 - dq 0x650a7354650a7354, 0x650a7354650a7354 - dq 0x650a7354650a7354, 0x650a7354650a7354 - dq 0x650a7354650a7354, 0x650a7354650a7354 - dq 0x766a0abb766a0abb, 0x766a0abb766a0abb - dq 0x766a0abb766a0abb, 0x766a0abb766a0abb - dq 0x766a0abb766a0abb, 0x766a0abb766a0abb - dq 0x766a0abb766a0abb, 0x766a0abb766a0abb - dq 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e - dq 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e - dq 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e - dq 0x81c2c92e81c2c92e, 0x81c2c92e81c2c92e - dq 0x92722c8592722c85, 0x92722c8592722c85 - dq 0x92722c8592722c85, 0x92722c8592722c85 - dq 0x92722c8592722c85, 0x92722c8592722c85 - dq 0x92722c8592722c85, 0x92722c8592722c85 - dq 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1 - dq 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1 - dq 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1 - dq 0xa2bfe8a1a2bfe8a1, 0xa2bfe8a1a2bfe8a1 - dq 0xa81a664ba81a664b, 0xa81a664ba81a664b - dq 0xa81a664ba81a664b, 0xa81a664ba81a664b - dq 0xa81a664ba81a664b, 0xa81a664ba81a664b - dq 0xa81a664ba81a664b, 0xa81a664ba81a664b - dq 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70 - dq 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70 - dq 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70 - dq 0xc24b8b70c24b8b70, 0xc24b8b70c24b8b70 - dq 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3 - dq 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3 - dq 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3 - dq 0xc76c51a3c76c51a3, 0xc76c51a3c76c51a3 - dq 0xd192e819d192e819, 0xd192e819d192e819 - dq 0xd192e819d192e819, 0xd192e819d192e819 - dq 0xd192e819d192e819, 0xd192e819d192e819 - dq 0xd192e819d192e819, 0xd192e819d192e819 - dq 0xd6990624d6990624, 0xd6990624d6990624 - dq 0xd6990624d6990624, 0xd6990624d6990624 - dq 0xd6990624d6990624, 0xd6990624d6990624 - dq 0xd6990624d6990624, 0xd6990624d6990624 - dq 0xf40e3585f40e3585, 0xf40e3585f40e3585 - dq 0xf40e3585f40e3585, 0xf40e3585f40e3585 - dq 0xf40e3585f40e3585, 0xf40e3585f40e3585 - dq 0xf40e3585f40e3585, 0xf40e3585f40e3585 - dq 0x106aa070106aa070, 0x106aa070106aa070 - dq 0x106aa070106aa070, 0x106aa070106aa070 - dq 0x106aa070106aa070, 0x106aa070106aa070 - dq 0x106aa070106aa070, 0x106aa070106aa070 - dq 0x19a4c11619a4c116, 0x19a4c11619a4c116 - dq 0x19a4c11619a4c116, 0x19a4c11619a4c116 - dq 0x19a4c11619a4c116, 0x19a4c11619a4c116 - dq 0x19a4c11619a4c116, 0x19a4c11619a4c116 - dq 0x1e376c081e376c08, 0x1e376c081e376c08 - dq 0x1e376c081e376c08, 0x1e376c081e376c08 - dq 0x1e376c081e376c08, 0x1e376c081e376c08 - dq 0x1e376c081e376c08, 0x1e376c081e376c08 - dq 0x2748774c2748774c, 0x2748774c2748774c - dq 0x2748774c2748774c, 0x2748774c2748774c - dq 0x2748774c2748774c, 0x2748774c2748774c - dq 0x2748774c2748774c, 0x2748774c2748774c - dq 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5 - dq 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5 - dq 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5 - dq 0x34b0bcb534b0bcb5, 0x34b0bcb534b0bcb5 - dq 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3 - dq 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3 - dq 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3 - dq 0x391c0cb3391c0cb3, 0x391c0cb3391c0cb3 - dq 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a - dq 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a - dq 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a - dq 0x4ed8aa4a4ed8aa4a, 0x4ed8aa4a4ed8aa4a - dq 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f - dq 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f - dq 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f - dq 0x5b9cca4f5b9cca4f, 0x5b9cca4f5b9cca4f - dq 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3 - dq 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3 - dq 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3 - dq 0x682e6ff3682e6ff3, 0x682e6ff3682e6ff3 - dq 0x748f82ee748f82ee, 0x748f82ee748f82ee - dq 0x748f82ee748f82ee, 0x748f82ee748f82ee - dq 0x748f82ee748f82ee, 0x748f82ee748f82ee - dq 0x748f82ee748f82ee, 0x748f82ee748f82ee - dq 0x78a5636f78a5636f, 0x78a5636f78a5636f - dq 0x78a5636f78a5636f, 0x78a5636f78a5636f - dq 0x78a5636f78a5636f, 0x78a5636f78a5636f - dq 0x78a5636f78a5636f, 0x78a5636f78a5636f - dq 0x84c8781484c87814, 0x84c8781484c87814 - dq 0x84c8781484c87814, 0x84c8781484c87814 - dq 0x84c8781484c87814, 0x84c8781484c87814 - dq 0x84c8781484c87814, 0x84c8781484c87814 - dq 0x8cc702088cc70208, 0x8cc702088cc70208 - dq 0x8cc702088cc70208, 0x8cc702088cc70208 - dq 0x8cc702088cc70208, 0x8cc702088cc70208 - dq 0x8cc702088cc70208, 0x8cc702088cc70208 - dq 0x90befffa90befffa, 0x90befffa90befffa - dq 0x90befffa90befffa, 0x90befffa90befffa - dq 0x90befffa90befffa, 0x90befffa90befffa - dq 0x90befffa90befffa, 0x90befffa90befffa - dq 0xa4506ceba4506ceb, 0xa4506ceba4506ceb - dq 0xa4506ceba4506ceb, 0xa4506ceba4506ceb - dq 0xa4506ceba4506ceb, 0xa4506ceba4506ceb - dq 0xa4506ceba4506ceb, 0xa4506ceba4506ceb - dq 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7 - dq 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7 - dq 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7 - dq 0xbef9a3f7bef9a3f7, 0xbef9a3f7bef9a3f7 - dq 0xc67178f2c67178f2, 0xc67178f2c67178f2 - dq 0xc67178f2c67178f2, 0xc67178f2c67178f2 - dq 0xc67178f2c67178f2, 0xc67178f2c67178f2 - dq 0xc67178f2c67178f2, 0xc67178f2c67178f2 + dd 0x428a2f98 + dd 0x71374491 + dd 0xb5c0fbcf + dd 0xe9b5dba5 + dd 0x3956c25b + dd 0x59f111f1 + dd 0x923f82a4 + dd 0xab1c5ed5 + dd 0xd807aa98 + dd 0x12835b01 + dd 0x243185be + dd 0x550c7dc3 + dd 0x72be5d74 + dd 0x80deb1fe + dd 0x9bdc06a7 + dd 0xc19bf174 + dd 0xe49b69c1 + dd 0xefbe4786 + dd 0x0fc19dc6 + dd 0x240ca1cc + dd 0x2de92c6f + dd 0x4a7484aa + dd 0x5cb0a9dc + dd 0x76f988da + dd 0x983e5152 + dd 0xa831c66d + dd 0xb00327c8 + dd 0xbf597fc7 + dd 0xc6e00bf3 + dd 0xd5a79147 + dd 0x06ca6351 + dd 0x14292967 + dd 0x27b70a85 + dd 0x2e1b2138 + dd 0x4d2c6dfc + dd 0x53380d13 + dd 0x650a7354 + dd 0x766a0abb + dd 0x81c2c92e + dd 0x92722c85 + dd 0xa2bfe8a1 + dd 0xa81a664b + dd 0xc24b8b70 + dd 0xc76c51a3 + dd 0xd192e819 + dd 0xd6990624 + dd 0xf40e3585 + dd 0x106aa070 + dd 0x19a4c116 + dd 0x1e376c08 + dd 0x2748774c + dd 0x34b0bcb5 + dd 0x391c0cb3 + dd 0x4ed8aa4a + dd 0x5b9cca4f + dd 0x682e6ff3 + dd 0x748f82ee + dd 0x78a5636f + dd 0x84c87814 + dd 0x8cc70208 + dd 0x90befffa + dd 0xa4506ceb + dd 0xbef9a3f7 + dd 0xc67178f2 PSHUFFLE_BYTE_FLIP_MASK: dq 0x0405060700010203, 0x0c0d0e0f08090a0b - dq 0x0405060700010203, 0x0c0d0e0f08090a0b - dq 0x0405060700010203, 0x0c0d0e0f08090a0b - dq 0x0405060700010203, 0x0c0d0e0f08090a0b +align 64 PSHUFFLE_TRANSPOSE16_MASK1: dq 0x0000000000000000 dq 0x0000000000000001 dq 0x0000000000000008 diff --git a/sha512_mb/sha512_mb_x8_avx512.asm b/sha512_mb/sha512_mb_x8_avx512.asm index a93fecb1..2dfae692 100644 --- a/sha512_mb/sha512_mb_x8_avx512.asm +++ b/sha512_mb/sha512_mb_x8_avx512.asm @@ -287,7 +287,7 @@ FIELD _RSP, 8, 8 ;; H becomes T2, then add T1 for A ;; D becomes D + T1 for E - vpaddq T1, H, TMP3 ; T1 = H + Kt + vpaddq T1, H, [TBL + %%ROUND*8] {1to8} ; T1 = H + Kt vmovdqa32 TMP0, E ;; compute BIG_SIGMA_1(E) vprorq TMP1, E, BIG_SIGMA_1_0 ; ROR_14(E) @@ -307,7 +307,6 @@ FIELD _RSP, 8, 8 vpternlogq H, TMP2, TMP3, 0x96 ; H(T2) = BIG_SIGMA_0(A) vpaddq H, H, TMP0 ; H(T2) = BIG_SIGMA_0(A) + MAJ(A,B,C) vpaddq H, H, T1 ; H(A) = H(T2) + T1 - vmovdqa32 TMP3, [TBL + ((%%ROUND+1)*64)] ; Next Kt ;; Rotate the args A-H (rotation of names associated with regs) ROTATE_ARGS @@ -351,53 +350,53 @@ sha512_mb_x8_avx512: lea TBL,[TABLE] ;; Initialize digests - vmovups A, [DIGEST + 0*8*8] - vmovups B, [DIGEST + 1*8*8] - vmovups C, [DIGEST + 2*8*8] - vmovups D, [DIGEST + 3*8*8] - vmovups E, [DIGEST + 4*8*8] - vmovups F, [DIGEST + 5*8*8] - vmovups G, [DIGEST + 6*8*8] - vmovups H, [DIGEST + 7*8*8] - - xor IDX, IDX + vmovdqu64 A, [DIGEST + 0*8*8] + vmovdqu64 B, [DIGEST + 1*8*8] + vmovdqu64 C, [DIGEST + 2*8*8] + vmovdqu64 D, [DIGEST + 3*8*8] + vmovdqu64 E, [DIGEST + 4*8*8] + vmovdqu64 F, [DIGEST + 5*8*8] + vmovdqu64 G, [DIGEST + 6*8*8] + vmovdqu64 H, [DIGEST + 7*8*8] + ;; Read in input data address, saving them in registers because ;; they will serve as variables, which we shall keep incrementing - mov inp0, [IN + 0*8] - mov inp1, [IN + 1*8] - mov inp2, [IN + 2*8] - mov inp3, [IN + 3*8] - mov inp4, [IN + 4*8] - mov inp5, [IN + 5*8] - mov inp6, [IN + 6*8] - mov inp7, [IN + 7*8] + lea IDX, [IN] ; save the base address so the next loads use 8bits offset + mov inp0, [IDX + 0*8] + mov inp1, [IDX + 1*8] + mov inp2, [IDX + 2*8] + mov inp3, [IDX + 3*8] + mov inp4, [IDX + 4*8] + mov inp5, [IDX + 5*8] + mov inp6, [IDX + 6*8] + mov inp7, [IDX + 7*8] + xor DWORD(IDX), DWORD(IDX) lloop: ;; first half of 1024 (need to transpose before use) - vmovups W0,[inp0 + IDX ] - vmovups W1,[inp1 + IDX ] - vmovups W2,[inp2 + IDX ] - vmovups W3,[inp3 + IDX ] - vmovups W4,[inp4 + IDX ] - vmovups W5,[inp5 + IDX ] - vmovups W6,[inp6 + IDX ] - vmovups TMP0,[inp7 + IDX ] + vmovdqu64 W0,[inp0 + IDX ] + vmovdqu64 W1,[inp1 + IDX ] + vmovdqu64 W2,[inp2 + IDX ] + vmovdqu64 W3,[inp3 + IDX ] + vmovdqu64 W4,[inp4 + IDX ] + vmovdqu64 W5,[inp5 + IDX ] + vmovdqu64 W6,[inp6 + IDX ] + vmovdqu64 TMP0,[inp7 + IDX ] TRANSPOSE8 W0, W1, W2, W3, W4, W5, W6, TMP0, W7, TMP1, TMP2, TMP3 ;; second half of 1024 (need to transpose before use) - vmovups W8,[inp0 + SZ8 + IDX ] - vmovups W9,[inp1 + SZ8 + IDX ] - vmovups W10,[inp2 + SZ8 + IDX ] - vmovups W11,[inp3 + SZ8 + IDX ] - vmovups W12,[inp4 + SZ8 + IDX ] - vmovups W13,[inp5 + SZ8 + IDX ] - vmovups W14,[inp6 + SZ8 + IDX ] - vmovups TMP0,[inp7 + SZ8 + IDX ] + vmovdqu64 W8,[inp0 + SZ8 + IDX ] + vmovdqu64 W9,[inp1 + SZ8 + IDX ] + vmovdqu64 W10,[inp2 + SZ8 + IDX ] + vmovdqu64 W11,[inp3 + SZ8 + IDX ] + vmovdqu64 W12,[inp4 + SZ8 + IDX ] + vmovdqu64 W13,[inp5 + SZ8 + IDX ] + vmovdqu64 W14,[inp6 + SZ8 + IDX ] + vmovdqu64 TMP0,[inp7 + SZ8 + IDX ] TRANSPOSE8 W8, W9, W10, W11, W12, W13, W14, TMP0, W15, TMP1, TMP2, TMP3 - vmovdqa32 TMP2, [PSHUFFLE_BYTE_FLIP_MASK] + vbroadcasti32x4 TMP2, [PSHUFFLE_BYTE_FLIP_MASK] - vmovdqa32 TMP3, [TBL] ; First K ; Save digests for later addition vmovdqa32 [rsp + _DIGEST_SAVE + 64*0], A @@ -523,99 +522,93 @@ lastLoop: section .data align 64 -; 80 constants for SHA512 -; replicating for each lane, thus 8*80 -; to aid in SIMD .. space tradeoff for time! -; local to asm file, used nowhere else +; constants for SHA512 TABLE: - dq 0x428a2f98d728ae22, 0x428a2f98d728ae22, 0x428a2f98d728ae22, 0x428a2f98d728ae22, 0x428a2f98d728ae22, 0x428a2f98d728ae22, 0x428a2f98d728ae22, 0x428a2f98d728ae22 - dq 0x7137449123ef65cd, 0x7137449123ef65cd, 0x7137449123ef65cd, 0x7137449123ef65cd, 0x7137449123ef65cd, 0x7137449123ef65cd, 0x7137449123ef65cd, 0x7137449123ef65cd - dq 0xb5c0fbcfec4d3b2f, 0xb5c0fbcfec4d3b2f, 0xb5c0fbcfec4d3b2f, 0xb5c0fbcfec4d3b2f, 0xb5c0fbcfec4d3b2f, 0xb5c0fbcfec4d3b2f, 0xb5c0fbcfec4d3b2f, 0xb5c0fbcfec4d3b2f - dq 0xe9b5dba58189dbbc, 0xe9b5dba58189dbbc, 0xe9b5dba58189dbbc, 0xe9b5dba58189dbbc, 0xe9b5dba58189dbbc, 0xe9b5dba58189dbbc, 0xe9b5dba58189dbbc, 0xe9b5dba58189dbbc - dq 0x3956c25bf348b538, 0x3956c25bf348b538, 0x3956c25bf348b538, 0x3956c25bf348b538, 0x3956c25bf348b538, 0x3956c25bf348b538, 0x3956c25bf348b538, 0x3956c25bf348b538 - dq 0x59f111f1b605d019, 0x59f111f1b605d019, 0x59f111f1b605d019, 0x59f111f1b605d019, 0x59f111f1b605d019, 0x59f111f1b605d019, 0x59f111f1b605d019, 0x59f111f1b605d019 - dq 0x923f82a4af194f9b, 0x923f82a4af194f9b, 0x923f82a4af194f9b, 0x923f82a4af194f9b, 0x923f82a4af194f9b, 0x923f82a4af194f9b, 0x923f82a4af194f9b, 0x923f82a4af194f9b - dq 0xab1c5ed5da6d8118, 0xab1c5ed5da6d8118, 0xab1c5ed5da6d8118, 0xab1c5ed5da6d8118, 0xab1c5ed5da6d8118, 0xab1c5ed5da6d8118, 0xab1c5ed5da6d8118, 0xab1c5ed5da6d8118 - dq 0xd807aa98a3030242, 0xd807aa98a3030242, 0xd807aa98a3030242, 0xd807aa98a3030242, 0xd807aa98a3030242, 0xd807aa98a3030242, 0xd807aa98a3030242, 0xd807aa98a3030242 - dq 0x12835b0145706fbe, 0x12835b0145706fbe, 0x12835b0145706fbe, 0x12835b0145706fbe, 0x12835b0145706fbe, 0x12835b0145706fbe, 0x12835b0145706fbe, 0x12835b0145706fbe - dq 0x243185be4ee4b28c, 0x243185be4ee4b28c, 0x243185be4ee4b28c, 0x243185be4ee4b28c, 0x243185be4ee4b28c, 0x243185be4ee4b28c, 0x243185be4ee4b28c, 0x243185be4ee4b28c - dq 0x550c7dc3d5ffb4e2, 0x550c7dc3d5ffb4e2, 0x550c7dc3d5ffb4e2, 0x550c7dc3d5ffb4e2, 0x550c7dc3d5ffb4e2, 0x550c7dc3d5ffb4e2, 0x550c7dc3d5ffb4e2, 0x550c7dc3d5ffb4e2 - dq 0x72be5d74f27b896f, 0x72be5d74f27b896f, 0x72be5d74f27b896f, 0x72be5d74f27b896f, 0x72be5d74f27b896f, 0x72be5d74f27b896f, 0x72be5d74f27b896f, 0x72be5d74f27b896f - dq 0x80deb1fe3b1696b1, 0x80deb1fe3b1696b1, 0x80deb1fe3b1696b1, 0x80deb1fe3b1696b1, 0x80deb1fe3b1696b1, 0x80deb1fe3b1696b1, 0x80deb1fe3b1696b1, 0x80deb1fe3b1696b1 - dq 0x9bdc06a725c71235, 0x9bdc06a725c71235, 0x9bdc06a725c71235, 0x9bdc06a725c71235, 0x9bdc06a725c71235, 0x9bdc06a725c71235, 0x9bdc06a725c71235, 0x9bdc06a725c71235 - dq 0xc19bf174cf692694, 0xc19bf174cf692694, 0xc19bf174cf692694, 0xc19bf174cf692694, 0xc19bf174cf692694, 0xc19bf174cf692694, 0xc19bf174cf692694, 0xc19bf174cf692694 - dq 0xe49b69c19ef14ad2, 0xe49b69c19ef14ad2, 0xe49b69c19ef14ad2, 0xe49b69c19ef14ad2, 0xe49b69c19ef14ad2, 0xe49b69c19ef14ad2, 0xe49b69c19ef14ad2, 0xe49b69c19ef14ad2 - dq 0xefbe4786384f25e3, 0xefbe4786384f25e3, 0xefbe4786384f25e3, 0xefbe4786384f25e3, 0xefbe4786384f25e3, 0xefbe4786384f25e3, 0xefbe4786384f25e3, 0xefbe4786384f25e3 - dq 0x0fc19dc68b8cd5b5, 0x0fc19dc68b8cd5b5, 0x0fc19dc68b8cd5b5, 0x0fc19dc68b8cd5b5, 0x0fc19dc68b8cd5b5, 0x0fc19dc68b8cd5b5, 0x0fc19dc68b8cd5b5, 0x0fc19dc68b8cd5b5 - dq 0x240ca1cc77ac9c65, 0x240ca1cc77ac9c65, 0x240ca1cc77ac9c65, 0x240ca1cc77ac9c65, 0x240ca1cc77ac9c65, 0x240ca1cc77ac9c65, 0x240ca1cc77ac9c65, 0x240ca1cc77ac9c65 - dq 0x2de92c6f592b0275, 0x2de92c6f592b0275, 0x2de92c6f592b0275, 0x2de92c6f592b0275, 0x2de92c6f592b0275, 0x2de92c6f592b0275, 0x2de92c6f592b0275, 0x2de92c6f592b0275 - dq 0x4a7484aa6ea6e483, 0x4a7484aa6ea6e483, 0x4a7484aa6ea6e483, 0x4a7484aa6ea6e483, 0x4a7484aa6ea6e483, 0x4a7484aa6ea6e483, 0x4a7484aa6ea6e483, 0x4a7484aa6ea6e483 - dq 0x5cb0a9dcbd41fbd4, 0x5cb0a9dcbd41fbd4, 0x5cb0a9dcbd41fbd4, 0x5cb0a9dcbd41fbd4, 0x5cb0a9dcbd41fbd4, 0x5cb0a9dcbd41fbd4, 0x5cb0a9dcbd41fbd4, 0x5cb0a9dcbd41fbd4 - dq 0x76f988da831153b5, 0x76f988da831153b5, 0x76f988da831153b5, 0x76f988da831153b5, 0x76f988da831153b5, 0x76f988da831153b5, 0x76f988da831153b5, 0x76f988da831153b5 - dq 0x983e5152ee66dfab, 0x983e5152ee66dfab, 0x983e5152ee66dfab, 0x983e5152ee66dfab, 0x983e5152ee66dfab, 0x983e5152ee66dfab, 0x983e5152ee66dfab, 0x983e5152ee66dfab - dq 0xa831c66d2db43210, 0xa831c66d2db43210, 0xa831c66d2db43210, 0xa831c66d2db43210, 0xa831c66d2db43210, 0xa831c66d2db43210, 0xa831c66d2db43210, 0xa831c66d2db43210 - dq 0xb00327c898fb213f, 0xb00327c898fb213f, 0xb00327c898fb213f, 0xb00327c898fb213f, 0xb00327c898fb213f, 0xb00327c898fb213f, 0xb00327c898fb213f, 0xb00327c898fb213f - dq 0xbf597fc7beef0ee4, 0xbf597fc7beef0ee4, 0xbf597fc7beef0ee4, 0xbf597fc7beef0ee4, 0xbf597fc7beef0ee4, 0xbf597fc7beef0ee4, 0xbf597fc7beef0ee4, 0xbf597fc7beef0ee4 - dq 0xc6e00bf33da88fc2, 0xc6e00bf33da88fc2, 0xc6e00bf33da88fc2, 0xc6e00bf33da88fc2, 0xc6e00bf33da88fc2, 0xc6e00bf33da88fc2, 0xc6e00bf33da88fc2, 0xc6e00bf33da88fc2 - dq 0xd5a79147930aa725, 0xd5a79147930aa725, 0xd5a79147930aa725, 0xd5a79147930aa725, 0xd5a79147930aa725, 0xd5a79147930aa725, 0xd5a79147930aa725, 0xd5a79147930aa725 - dq 0x06ca6351e003826f, 0x06ca6351e003826f, 0x06ca6351e003826f, 0x06ca6351e003826f, 0x06ca6351e003826f, 0x06ca6351e003826f, 0x06ca6351e003826f, 0x06ca6351e003826f - dq 0x142929670a0e6e70, 0x142929670a0e6e70, 0x142929670a0e6e70, 0x142929670a0e6e70, 0x142929670a0e6e70, 0x142929670a0e6e70, 0x142929670a0e6e70, 0x142929670a0e6e70 - dq 0x27b70a8546d22ffc, 0x27b70a8546d22ffc, 0x27b70a8546d22ffc, 0x27b70a8546d22ffc, 0x27b70a8546d22ffc, 0x27b70a8546d22ffc, 0x27b70a8546d22ffc, 0x27b70a8546d22ffc - dq 0x2e1b21385c26c926, 0x2e1b21385c26c926, 0x2e1b21385c26c926, 0x2e1b21385c26c926, 0x2e1b21385c26c926, 0x2e1b21385c26c926, 0x2e1b21385c26c926, 0x2e1b21385c26c926 - dq 0x4d2c6dfc5ac42aed, 0x4d2c6dfc5ac42aed, 0x4d2c6dfc5ac42aed, 0x4d2c6dfc5ac42aed, 0x4d2c6dfc5ac42aed, 0x4d2c6dfc5ac42aed, 0x4d2c6dfc5ac42aed, 0x4d2c6dfc5ac42aed - dq 0x53380d139d95b3df, 0x53380d139d95b3df, 0x53380d139d95b3df, 0x53380d139d95b3df, 0x53380d139d95b3df, 0x53380d139d95b3df, 0x53380d139d95b3df, 0x53380d139d95b3df - dq 0x650a73548baf63de, 0x650a73548baf63de, 0x650a73548baf63de, 0x650a73548baf63de, 0x650a73548baf63de, 0x650a73548baf63de, 0x650a73548baf63de, 0x650a73548baf63de - dq 0x766a0abb3c77b2a8, 0x766a0abb3c77b2a8, 0x766a0abb3c77b2a8, 0x766a0abb3c77b2a8, 0x766a0abb3c77b2a8, 0x766a0abb3c77b2a8, 0x766a0abb3c77b2a8, 0x766a0abb3c77b2a8 - dq 0x81c2c92e47edaee6, 0x81c2c92e47edaee6, 0x81c2c92e47edaee6, 0x81c2c92e47edaee6, 0x81c2c92e47edaee6, 0x81c2c92e47edaee6, 0x81c2c92e47edaee6, 0x81c2c92e47edaee6 - dq 0x92722c851482353b, 0x92722c851482353b, 0x92722c851482353b, 0x92722c851482353b, 0x92722c851482353b, 0x92722c851482353b, 0x92722c851482353b, 0x92722c851482353b - dq 0xa2bfe8a14cf10364, 0xa2bfe8a14cf10364, 0xa2bfe8a14cf10364, 0xa2bfe8a14cf10364, 0xa2bfe8a14cf10364, 0xa2bfe8a14cf10364, 0xa2bfe8a14cf10364, 0xa2bfe8a14cf10364 - dq 0xa81a664bbc423001, 0xa81a664bbc423001, 0xa81a664bbc423001, 0xa81a664bbc423001, 0xa81a664bbc423001, 0xa81a664bbc423001, 0xa81a664bbc423001, 0xa81a664bbc423001 - dq 0xc24b8b70d0f89791, 0xc24b8b70d0f89791, 0xc24b8b70d0f89791, 0xc24b8b70d0f89791, 0xc24b8b70d0f89791, 0xc24b8b70d0f89791, 0xc24b8b70d0f89791, 0xc24b8b70d0f89791 - dq 0xc76c51a30654be30, 0xc76c51a30654be30, 0xc76c51a30654be30, 0xc76c51a30654be30, 0xc76c51a30654be30, 0xc76c51a30654be30, 0xc76c51a30654be30, 0xc76c51a30654be30 - dq 0xd192e819d6ef5218, 0xd192e819d6ef5218, 0xd192e819d6ef5218, 0xd192e819d6ef5218, 0xd192e819d6ef5218, 0xd192e819d6ef5218, 0xd192e819d6ef5218, 0xd192e819d6ef5218 - dq 0xd69906245565a910, 0xd69906245565a910, 0xd69906245565a910, 0xd69906245565a910, 0xd69906245565a910, 0xd69906245565a910, 0xd69906245565a910, 0xd69906245565a910 - dq 0xf40e35855771202a, 0xf40e35855771202a, 0xf40e35855771202a, 0xf40e35855771202a, 0xf40e35855771202a, 0xf40e35855771202a, 0xf40e35855771202a, 0xf40e35855771202a - dq 0x106aa07032bbd1b8, 0x106aa07032bbd1b8, 0x106aa07032bbd1b8, 0x106aa07032bbd1b8, 0x106aa07032bbd1b8, 0x106aa07032bbd1b8, 0x106aa07032bbd1b8, 0x106aa07032bbd1b8 - dq 0x19a4c116b8d2d0c8, 0x19a4c116b8d2d0c8, 0x19a4c116b8d2d0c8, 0x19a4c116b8d2d0c8, 0x19a4c116b8d2d0c8, 0x19a4c116b8d2d0c8, 0x19a4c116b8d2d0c8, 0x19a4c116b8d2d0c8 - dq 0x1e376c085141ab53, 0x1e376c085141ab53, 0x1e376c085141ab53, 0x1e376c085141ab53, 0x1e376c085141ab53, 0x1e376c085141ab53, 0x1e376c085141ab53, 0x1e376c085141ab53 - dq 0x2748774cdf8eeb99, 0x2748774cdf8eeb99, 0x2748774cdf8eeb99, 0x2748774cdf8eeb99, 0x2748774cdf8eeb99, 0x2748774cdf8eeb99, 0x2748774cdf8eeb99, 0x2748774cdf8eeb99 - dq 0x34b0bcb5e19b48a8, 0x34b0bcb5e19b48a8, 0x34b0bcb5e19b48a8, 0x34b0bcb5e19b48a8, 0x34b0bcb5e19b48a8, 0x34b0bcb5e19b48a8, 0x34b0bcb5e19b48a8, 0x34b0bcb5e19b48a8 - dq 0x391c0cb3c5c95a63, 0x391c0cb3c5c95a63, 0x391c0cb3c5c95a63, 0x391c0cb3c5c95a63, 0x391c0cb3c5c95a63, 0x391c0cb3c5c95a63, 0x391c0cb3c5c95a63, 0x391c0cb3c5c95a63 - dq 0x4ed8aa4ae3418acb, 0x4ed8aa4ae3418acb, 0x4ed8aa4ae3418acb, 0x4ed8aa4ae3418acb, 0x4ed8aa4ae3418acb, 0x4ed8aa4ae3418acb, 0x4ed8aa4ae3418acb, 0x4ed8aa4ae3418acb - dq 0x5b9cca4f7763e373, 0x5b9cca4f7763e373, 0x5b9cca4f7763e373, 0x5b9cca4f7763e373, 0x5b9cca4f7763e373, 0x5b9cca4f7763e373, 0x5b9cca4f7763e373, 0x5b9cca4f7763e373 - dq 0x682e6ff3d6b2b8a3, 0x682e6ff3d6b2b8a3, 0x682e6ff3d6b2b8a3, 0x682e6ff3d6b2b8a3, 0x682e6ff3d6b2b8a3, 0x682e6ff3d6b2b8a3, 0x682e6ff3d6b2b8a3, 0x682e6ff3d6b2b8a3 - dq 0x748f82ee5defb2fc, 0x748f82ee5defb2fc, 0x748f82ee5defb2fc, 0x748f82ee5defb2fc, 0x748f82ee5defb2fc, 0x748f82ee5defb2fc, 0x748f82ee5defb2fc, 0x748f82ee5defb2fc - dq 0x78a5636f43172f60, 0x78a5636f43172f60, 0x78a5636f43172f60, 0x78a5636f43172f60, 0x78a5636f43172f60, 0x78a5636f43172f60, 0x78a5636f43172f60, 0x78a5636f43172f60 - dq 0x84c87814a1f0ab72, 0x84c87814a1f0ab72, 0x84c87814a1f0ab72, 0x84c87814a1f0ab72, 0x84c87814a1f0ab72, 0x84c87814a1f0ab72, 0x84c87814a1f0ab72, 0x84c87814a1f0ab72 - dq 0x8cc702081a6439ec, 0x8cc702081a6439ec, 0x8cc702081a6439ec, 0x8cc702081a6439ec, 0x8cc702081a6439ec, 0x8cc702081a6439ec, 0x8cc702081a6439ec, 0x8cc702081a6439ec - dq 0x90befffa23631e28, 0x90befffa23631e28, 0x90befffa23631e28, 0x90befffa23631e28, 0x90befffa23631e28, 0x90befffa23631e28, 0x90befffa23631e28, 0x90befffa23631e28 - dq 0xa4506cebde82bde9, 0xa4506cebde82bde9, 0xa4506cebde82bde9, 0xa4506cebde82bde9, 0xa4506cebde82bde9, 0xa4506cebde82bde9, 0xa4506cebde82bde9, 0xa4506cebde82bde9 - dq 0xbef9a3f7b2c67915, 0xbef9a3f7b2c67915, 0xbef9a3f7b2c67915, 0xbef9a3f7b2c67915, 0xbef9a3f7b2c67915, 0xbef9a3f7b2c67915, 0xbef9a3f7b2c67915, 0xbef9a3f7b2c67915 - dq 0xc67178f2e372532b, 0xc67178f2e372532b, 0xc67178f2e372532b, 0xc67178f2e372532b, 0xc67178f2e372532b, 0xc67178f2e372532b, 0xc67178f2e372532b, 0xc67178f2e372532b - dq 0xca273eceea26619c, 0xca273eceea26619c, 0xca273eceea26619c, 0xca273eceea26619c, 0xca273eceea26619c, 0xca273eceea26619c, 0xca273eceea26619c, 0xca273eceea26619c - dq 0xd186b8c721c0c207, 0xd186b8c721c0c207, 0xd186b8c721c0c207, 0xd186b8c721c0c207, 0xd186b8c721c0c207, 0xd186b8c721c0c207, 0xd186b8c721c0c207, 0xd186b8c721c0c207 - dq 0xeada7dd6cde0eb1e, 0xeada7dd6cde0eb1e, 0xeada7dd6cde0eb1e, 0xeada7dd6cde0eb1e, 0xeada7dd6cde0eb1e, 0xeada7dd6cde0eb1e, 0xeada7dd6cde0eb1e, 0xeada7dd6cde0eb1e - dq 0xf57d4f7fee6ed178, 0xf57d4f7fee6ed178, 0xf57d4f7fee6ed178, 0xf57d4f7fee6ed178, 0xf57d4f7fee6ed178, 0xf57d4f7fee6ed178, 0xf57d4f7fee6ed178, 0xf57d4f7fee6ed178 - dq 0x06f067aa72176fba, 0x06f067aa72176fba, 0x06f067aa72176fba, 0x06f067aa72176fba, 0x06f067aa72176fba, 0x06f067aa72176fba, 0x06f067aa72176fba, 0x06f067aa72176fba - dq 0x0a637dc5a2c898a6, 0x0a637dc5a2c898a6, 0x0a637dc5a2c898a6, 0x0a637dc5a2c898a6, 0x0a637dc5a2c898a6, 0x0a637dc5a2c898a6, 0x0a637dc5a2c898a6, 0x0a637dc5a2c898a6 - dq 0x113f9804bef90dae, 0x113f9804bef90dae, 0x113f9804bef90dae, 0x113f9804bef90dae, 0x113f9804bef90dae, 0x113f9804bef90dae, 0x113f9804bef90dae, 0x113f9804bef90dae - dq 0x1b710b35131c471b, 0x1b710b35131c471b, 0x1b710b35131c471b, 0x1b710b35131c471b, 0x1b710b35131c471b, 0x1b710b35131c471b, 0x1b710b35131c471b, 0x1b710b35131c471b - dq 0x28db77f523047d84, 0x28db77f523047d84, 0x28db77f523047d84, 0x28db77f523047d84, 0x28db77f523047d84, 0x28db77f523047d84, 0x28db77f523047d84, 0x28db77f523047d84 - dq 0x32caab7b40c72493, 0x32caab7b40c72493, 0x32caab7b40c72493, 0x32caab7b40c72493, 0x32caab7b40c72493, 0x32caab7b40c72493, 0x32caab7b40c72493, 0x32caab7b40c72493 - dq 0x3c9ebe0a15c9bebc, 0x3c9ebe0a15c9bebc, 0x3c9ebe0a15c9bebc, 0x3c9ebe0a15c9bebc, 0x3c9ebe0a15c9bebc, 0x3c9ebe0a15c9bebc, 0x3c9ebe0a15c9bebc, 0x3c9ebe0a15c9bebc - dq 0x431d67c49c100d4c, 0x431d67c49c100d4c, 0x431d67c49c100d4c, 0x431d67c49c100d4c, 0x431d67c49c100d4c, 0x431d67c49c100d4c, 0x431d67c49c100d4c, 0x431d67c49c100d4c - dq 0x4cc5d4becb3e42b6, 0x4cc5d4becb3e42b6, 0x4cc5d4becb3e42b6, 0x4cc5d4becb3e42b6, 0x4cc5d4becb3e42b6, 0x4cc5d4becb3e42b6, 0x4cc5d4becb3e42b6, 0x4cc5d4becb3e42b6 - dq 0x597f299cfc657e2a, 0x597f299cfc657e2a, 0x597f299cfc657e2a, 0x597f299cfc657e2a, 0x597f299cfc657e2a, 0x597f299cfc657e2a, 0x597f299cfc657e2a, 0x597f299cfc657e2a - dq 0x5fcb6fab3ad6faec, 0x5fcb6fab3ad6faec, 0x5fcb6fab3ad6faec, 0x5fcb6fab3ad6faec, 0x5fcb6fab3ad6faec, 0x5fcb6fab3ad6faec, 0x5fcb6fab3ad6faec, 0x5fcb6fab3ad6faec - dq 0x6c44198c4a475817, 0x6c44198c4a475817, 0x6c44198c4a475817, 0x6c44198c4a475817, 0x6c44198c4a475817, 0x6c44198c4a475817, 0x6c44198c4a475817, 0x6c44198c4a475817 + dq 0x428a2f98d728ae22 + dq 0x7137449123ef65cd + dq 0xb5c0fbcfec4d3b2f + dq 0xe9b5dba58189dbbc + dq 0x3956c25bf348b538 + dq 0x59f111f1b605d019 + dq 0x923f82a4af194f9b + dq 0xab1c5ed5da6d8118 + dq 0xd807aa98a3030242 + dq 0x12835b0145706fbe + dq 0x243185be4ee4b28c + dq 0x550c7dc3d5ffb4e2 + dq 0x72be5d74f27b896f + dq 0x80deb1fe3b1696b1 + dq 0x9bdc06a725c71235 + dq 0xc19bf174cf692694 + dq 0xe49b69c19ef14ad2 + dq 0xefbe4786384f25e3 + dq 0x0fc19dc68b8cd5b5 + dq 0x240ca1cc77ac9c65 + dq 0x2de92c6f592b0275 + dq 0x4a7484aa6ea6e483 + dq 0x5cb0a9dcbd41fbd4 + dq 0x76f988da831153b5 + dq 0x983e5152ee66dfab + dq 0xa831c66d2db43210 + dq 0xb00327c898fb213f + dq 0xbf597fc7beef0ee4 + dq 0xc6e00bf33da88fc2 + dq 0xd5a79147930aa725 + dq 0x06ca6351e003826f + dq 0x142929670a0e6e70 + dq 0x27b70a8546d22ffc + dq 0x2e1b21385c26c926 + dq 0x4d2c6dfc5ac42aed + dq 0x53380d139d95b3df + dq 0x650a73548baf63de + dq 0x766a0abb3c77b2a8 + dq 0x81c2c92e47edaee6 + dq 0x92722c851482353b + dq 0xa2bfe8a14cf10364 + dq 0xa81a664bbc423001 + dq 0xc24b8b70d0f89791 + dq 0xc76c51a30654be30 + dq 0xd192e819d6ef5218 + dq 0xd69906245565a910 + dq 0xf40e35855771202a + dq 0x106aa07032bbd1b8 + dq 0x19a4c116b8d2d0c8 + dq 0x1e376c085141ab53 + dq 0x2748774cdf8eeb99 + dq 0x34b0bcb5e19b48a8 + dq 0x391c0cb3c5c95a63 + dq 0x4ed8aa4ae3418acb + dq 0x5b9cca4f7763e373 + dq 0x682e6ff3d6b2b8a3 + dq 0x748f82ee5defb2fc + dq 0x78a5636f43172f60 + dq 0x84c87814a1f0ab72 + dq 0x8cc702081a6439ec + dq 0x90befffa23631e28 + dq 0xa4506cebde82bde9 + dq 0xbef9a3f7b2c67915 + dq 0xc67178f2e372532b + dq 0xca273eceea26619c + dq 0xd186b8c721c0c207 + dq 0xeada7dd6cde0eb1e + dq 0xf57d4f7fee6ed178 + dq 0x06f067aa72176fba + dq 0x0a637dc5a2c898a6 + dq 0x113f9804bef90dae + dq 0x1b710b35131c471b + dq 0x28db77f523047d84 + dq 0x32caab7b40c72493 + dq 0x3c9ebe0a15c9bebc + dq 0x431d67c49c100d4c + dq 0x4cc5d4becb3e42b6 + dq 0x597f299cfc657e2a + dq 0x5fcb6fab3ad6faec + dq 0x6c44198c4a475817 align 64 ; this does the big endian to little endian conversion over a quad word .. ZMM ;; shuffle on ZMM is shuffle on 4 XMM size chunks, 128 bits PSHUFFLE_BYTE_FLIP_MASK: dq 0x0001020304050607, 0x08090a0b0c0d0e0f - dq 0x1011121314151617, 0x18191a1b1c1d1e1f - dq 0x2021222324252627, 0x28292a2b2c2d2e2f - dq 0x3031323334353637, 0x38393a3b3c3d3e3f align 64 TRANSPOSE8_PERM_INDEX_1: dq 0x0000000000000000 diff --git a/sm3_mb/sm3_mb_x16_avx512.asm b/sm3_mb/sm3_mb_x16_avx512.asm index 3b300fa8..9b0fdf79 100644 --- a/sm3_mb/sm3_mb_x16_avx512.asm +++ b/sm3_mb/sm3_mb_x16_avx512.asm @@ -162,6 +162,10 @@ FIELD _rsp, 8, 8 %define %%t0 %17 %define %%t1 %18 + ; keep the shuffle masks in registers. + vmovdqa32 TMP2, [PSHUFFLE_TRANSPOSE16_MASK1] + vmovdqa32 TMP3, [PSHUFFLE_TRANSPOSE16_MASK2] + ; process top half (r0..r3) {a...d} vshufps %%t0, %%r0, %%r1, 0x44 ; t0 = {b13 b12 a13 a12 b9 b8 a9 a8 b5 b4 a5 a4 b1 b0 a1 a0} vshufps %%r0, %%r0, %%r1, 0xEE ; r0 = {b15 b14 a15 a14 b11 b10 a11 a10 b7 b6 a7 a6 b3 b2 a3 a2} @@ -206,44 +210,44 @@ FIELD _rsp, 8, 8 vshufps %%r12, %%r12, %%r14, 0xDD ; r12 = {p15 015 n15 m15 p11 011 n11 m11 p7 07 n7 m7 p3 03 n3 m3} vshufps %%r10, %%r10, %%t1, 0x88 ; r10 = {p12 012 n12 m12 p8 08 n8 m8 p4 04 n4 m4 p0 00 n0 m0} - vmovdqa32 %%r14, [PSHUFFLE_TRANSPOSE16_MASK1] + vmovdqa32 %%r14, TMP2 vpermi2q %%r14, %%t0, %%r2 ; r14 = {h8 g8 f8 e8 d8 c8 b8 a8 h0 g0 f0 e0 d0 c0 b0 a0} - vmovdqa32 %%t1, [PSHUFFLE_TRANSPOSE16_MASK2] + vmovdqa32 %%t1, TMP3 vpermi2q %%t1, %%t0, %%r2 ; t1 = {h12 g12 f12 e12 d12 c12 b12 a12 h4 g4 f4 e4 d4 c4 b4 a4} - vmovdqa32 %%r2, [PSHUFFLE_TRANSPOSE16_MASK1] + vmovdqa32 %%r2, TMP2 vpermi2q %%r2, %%r3, %%r7 ; r2 = {h9 g9 f9 e9 d9 c9 b9 a9 h1 g1 f1 e1 d1 c1 b1 a1} - vmovdqa32 %%t0, [PSHUFFLE_TRANSPOSE16_MASK2] + vmovdqa32 %%t0, TMP3 vpermi2q %%t0, %%r3, %%r7 ; t0 = {h13 g13 f13 e13 d13 c13 b13 a13 h5 g5 f5 e5 d5 c5 b5 a5} - vmovdqa32 %%r3, [PSHUFFLE_TRANSPOSE16_MASK1] + vmovdqa32 %%r3, TMP2 vpermi2q %%r3, %%r1, %%r5 ; r3 = {h10 g10 f10 e10 d10 c10 b10 a10 h2 g2 f2 e2 d2 c2 b2 a2} - vmovdqa32 %%r7, [PSHUFFLE_TRANSPOSE16_MASK2] + vmovdqa32 %%r7, TMP3 vpermi2q %%r7, %%r1, %%r5 ; r7 = {h14 g14 f14 e14 d14 c14 b14 a14 h6 g6 f6 e6 d6 c6 b6 a6} - vmovdqa32 %%r1, [PSHUFFLE_TRANSPOSE16_MASK1] + vmovdqa32 %%r1, TMP2 vpermi2q %%r1, %%r0, %%r4 ; r1 = {h11 g11 f11 e11 d11 c11 b11 a11 h3 g3 f3 e3 d3 c3 b3 a3} - vmovdqa32 %%r5, [PSHUFFLE_TRANSPOSE16_MASK2] + vmovdqa32 %%r5, TMP3 vpermi2q %%r5, %%r0, %%r4 ; r5 = {h15 g15 f15 e15 d15 c15 b15 a15 h7 g7 f7 e7 d7 c7 b7 a7} - vmovdqa32 %%r0, [PSHUFFLE_TRANSPOSE16_MASK1] + vmovdqa32 %%r0, TMP2 vpermi2q %%r0, %%r6, %%r10 ; r0 = {p8 o8 n8 m8 l8 k8 j8 i8 p0 o0 n0 m0 l0 k0 j0 i0} - vmovdqa32 %%r4, [PSHUFFLE_TRANSPOSE16_MASK2] + vmovdqa32 %%r4, TMP3 vpermi2q %%r4, %%r6, %%r10 ; r4 = {p12 o12 n12 m12 l12 k12 j12 i12 p4 o4 n4 m4 l4 k4 j4 i4} - vmovdqa32 %%r6, [PSHUFFLE_TRANSPOSE16_MASK1] + vmovdqa32 %%r6, TMP2 vpermi2q %%r6, %%r11, %%r15 ; r6 = {p9 o9 n9 m9 l9 k9 j9 i9 p1 o1 n1 m1 l1 k1 j1 i1} - vmovdqa32 %%r10, [PSHUFFLE_TRANSPOSE16_MASK2] + vmovdqa32 %%r10, TMP3 vpermi2q %%r10, %%r11, %%r15 ; r10 = {p13 o13 n13 m13 l13 k13 j13 i13 p5 o5 n5 m5 l5 k5 j5 i5} - vmovdqa32 %%r11, [PSHUFFLE_TRANSPOSE16_MASK1] + vmovdqa32 %%r11, TMP2 vpermi2q %%r11, %%r9, %%r13 ; r11 = {p10 o10 n10 m10 l10 k10 j10 i10 p2 o2 n2 m2 l2 k2 j2 i2} - vmovdqa32 %%r15, [PSHUFFLE_TRANSPOSE16_MASK2] + vmovdqa32 %%r15, TMP3 vpermi2q %%r15, %%r9, %%r13 ; r15 = {p14 o14 n14 m14 l14 k14 j14 i14 p6 o6 n6 m6 l6 k6 j6 i6} - vmovdqa32 %%r9, [PSHUFFLE_TRANSPOSE16_MASK1] + vmovdqa32 %%r9, TMP2 vpermi2q %%r9, %%r8, %%r12 ; r9 = {p11 o11 n11 m11 l11 k11 j11 i11 p3 o3 n3 m3 l3 k3 j3 i3} - vmovdqa32 %%r13, [PSHUFFLE_TRANSPOSE16_MASK2] + vmovdqa32 %%r13, TMP3 vpermi2q %%r13, %%r8, %%r12 ; r13 = {p15 o15 n15 m15 l15 k15 j15 i15 p7 o7 n7 m7 l7 k7 j7 i7} ;; At this point r8 and r12 can be used as scratch registers @@ -326,7 +330,7 @@ FIELD _rsp, 8, 8 %define %%Y %2 %define %%Z %3 ; I < 16 return (X ^ Y ^ Z) - vmovups TMP0,%%X + vmovdqa32 TMP0,%%X vpternlogd TMP0,%%Y,%%Z,0x96 %endmacro @@ -339,12 +343,10 @@ FIELD _rsp, 8, 8 %define %%X %1 %define %%Y %2 %define %%Z %3 - ; I > 16 return (x & y) | (x & z) | (y & z) + ; I > 16 return (x & y) | (x & z) | (y & z) bitwise majority function. ; Same as (x & y) | (z & (x | y)) - vporq TMP0,%%X,%%Y - vpandq TMP0,%%Z - vpandq TMP1,%%X,%%Y - vporq TMP0,TMP1 + vmovdqa32 TMP0, %%X + vpternlogd TMP0, %%Y, %%Z, 0xE8 %endmacro @@ -356,7 +358,7 @@ FIELD _rsp, 8, 8 %define %%Y %2 %define %%Z %3 ; I < 16 return (x ^ y ^ z) - vmovups TMP0,%%X + vmovdqa32 TMP0,%%X vpternlogd TMP0,%%Y,%%Z,0x96 %endmacro @@ -366,10 +368,9 @@ FIELD _rsp, 8, 8 %define %%Y %2 %define %%Z %3 - ; I > 16 return (x & y) | ((~x) & z) - vpandq TMP0,%%X,%%Y - vpandnd TMP1,%%X,%%Z - vporq TMP0,TMP1 + ; I > 16 return (x & y) | ((~x) & z) bitwise select x ? y : z. + vmovdqa32 TMP0, %%X + vpternlogd TMP0, %%Y, %%Z, 0xCA %endmacro ;; void sm3_mb_x16_avx512(SM3_MB_ARGS_X16, uint32_t size) @@ -387,17 +388,19 @@ sm3_mb_x16_avx512: lea TBL, [TABLE] ;; Initialize digests - vmovups A, [DIGEST + 0*64] ; mov unsigned - vmovups B, [DIGEST + 1*64] - vmovups C, [DIGEST + 2*64] - vmovups D, [DIGEST + 3*64] - vmovups E, [DIGEST + 4*64] - vmovups F, [DIGEST + 5*64] - vmovups G, [DIGEST + 6*64] - vmovups H, [DIGEST + 7*64] + vmovdqu64 A, [DIGEST + 0*64] ; mov unsigned + vmovdqu64 B, [DIGEST + 1*64] + vmovdqu64 C, [DIGEST + 2*64] + vmovdqu64 D, [DIGEST + 3*64] + vmovdqu64 E, [DIGEST + 4*64] + vmovdqu64 F, [DIGEST + 5*64] + vmovdqu64 G, [DIGEST + 6*64] + vmovdqu64 H, [DIGEST + 7*64] xor IDX, IDX + jmp lloop +align 32 %assign cur_loop 0 lloop: ;; start message expand @@ -414,14 +417,14 @@ lloop: ;; stored B(i) to W(1)...W(15) ;; in zmm16....zmm31 - vmovups WB0,[inp0+IDX] - vmovups WB1,[inp1+IDX] - vmovups WB2,[inp2+IDX] - vmovups WB3,[inp3+IDX] - vmovups WB4,[inp4+IDX] - vmovups WB5,[inp5+IDX] - vmovups WB6,[inp6+IDX] - vmovups WB7,[inp7+IDX] + vmovdqu64 WB0,[inp0+IDX] + vmovdqu64 WB1,[inp1+IDX] + vmovdqu64 WB2,[inp2+IDX] + vmovdqu64 WB3,[inp3+IDX] + vmovdqu64 WB4,[inp4+IDX] + vmovdqu64 WB5,[inp5+IDX] + vmovdqu64 WB6,[inp6+IDX] + vmovdqu64 WB7,[inp7+IDX] mov inp0, [IN + 8*8] mov inp1, [IN + 9*8] @@ -432,14 +435,14 @@ lloop: mov inp6, [IN +14*8] mov inp7, [IN +15*8] - vmovups WB8, [inp0+IDX] - vmovups WB9, [inp1+IDX] - vmovups WB10,[inp2+IDX] - vmovups WB11,[inp3+IDX] - vmovups WB12,[inp4+IDX] - vmovups WB13,[inp5+IDX] - vmovups WB14,[inp6+IDX] - vmovups WB15,[inp7+IDX] + vmovdqu64 WB8, [inp0+IDX] + vmovdqu64 WB9, [inp1+IDX] + vmovdqu64 WB10,[inp2+IDX] + vmovdqu64 WB11,[inp3+IDX] + vmovdqu64 WB12,[inp4+IDX] + vmovdqu64 WB13,[inp5+IDX] + vmovdqu64 WB14,[inp6+IDX] + vmovdqu64 WB15,[inp7+IDX] vmovdqa32 [rsp + _DIGEST_SAVE + 64*0], A vmovdqa32 [rsp + _DIGEST_SAVE + 64*1], B @@ -456,7 +459,7 @@ lloop: TRANSPOSE16 WB0, WB1, WB2, WB3, WB4, WB5, WB6, WB7, WB8, WB9, WB10, WB11, WB12, WB13, WB14, WB15, TMP0, TMP1 ; little endian to big endian - vmovdqa32 TMP0, [SHUF_MASK] + vbroadcasti32x4 TMP0, [SHUF_MASK] vpshufb WB0,TMP0 vpshufb WB1,TMP0 vpshufb WB2,TMP0 @@ -485,8 +488,7 @@ lloop: ; SS1 = ((A <<< 12) + E + (T(j) <<< j)) <<< 7 ; (T(j) <<< j) store in TBL ; SS1 store in TMP2 - vmovdqa32 TMP2, [TBL + (I*64)] - vpaddd TMP2,E + vpaddd TMP2,E, [TBL+ (I*4)]{1to16} vpaddd TMP2,TMP0 vprold TMP2,7 @@ -520,17 +522,15 @@ lloop: ; G = F <<< 19 ; F = E ; E = P(TT2) - vmovups D,C - vprold B,9 - vmovups C,B - vmovups B,A - vmovups A,TMP3 - vmovups H,G - vprold F,19 - vmovups G,F - vmovups F,E + vmovdqa32 D,C + vprold C, B, 9 + vmovdqa32 B,A + vmovdqa32 A,TMP3 + vmovdqa32 H,G + vprold G, F,19 + vmovdqa32 F,E P TMP2 - vmovups E,TMP0 + vmovdqa32 E,TMP0 ;vprold B,9 ;vprold F,19 @@ -562,8 +562,7 @@ lloop: P1 APPEND(WB,J) vprold APPEND(WB,J),APPEND(WB,J_13),7 - vpxord APPEND(WB,J),TMP0 - vpxord APPEND(WB,J),APPEND(WB,J_6) + vpternlogd APPEND(WB,J),APPEND(WB,J_6), TMP0, 0x96 ; (A <<< 12) ; store in TMP0 @@ -572,8 +571,7 @@ lloop: ; SS1 = ((A <<< 12) + E + (T(j) <<< j)) <<< 7 ; (T(j) <<< j) store in TBL ; SS1 store in TMP2 - vmovdqa32 TMP2, [TBL + (I*64)] - vpaddd TMP2,E + vpaddd TMP2,E, [TBL + (I*4)]{1to16} vpaddd TMP2,TMP0 vprold TMP2,7 @@ -606,17 +604,17 @@ lloop: ; G = F <<< 19 ; F = E ; E = P(TT2) - vmovups D,C + vmovdqa32 D,C vprold B,9 - vmovups C,B - vmovups B,A - vmovups A,TMP3 - vmovups H,G + vmovdqa32 C,B + vmovdqa32 B,A + vmovdqa32 A,TMP3 + vmovdqa32 H,G vprold F,19 - vmovups G,F - vmovups F,E + vmovdqa32 G,F + vmovdqa32 F,E P TMP2 - vmovups E,TMP0 + vmovdqu64 E,TMP0 %assign I (I+1) %endrep @@ -634,14 +632,12 @@ lloop: %assign J (((I+4) % 20)) vprold APPEND(WB,J),APPEND(WB,J_3),15 - vpxord APPEND(WB,J),APPEND(WB,J_16) - vpxord APPEND(WB,J),APPEND(WB,J_9) + vpternlogd APPEND(WB,J),APPEND(WB,J_9), APPEND(WB,J_16), 0x96 P1 APPEND(WB,J) vprold APPEND(WB,J),APPEND(WB,J_13),7 - vpxord APPEND(WB,J),TMP0 - vpxord APPEND(WB,J),APPEND(WB,J_6) + vpternlogd APPEND(WB,J),APPEND(WB,J_6), TMP0, 0x96 ; (A <<< 12) ; store in TMP0 @@ -650,8 +646,7 @@ lloop: ; SS1 = ((A <<< 12) + E + (T(j) <<< j)) <<< 7 ; (T(j) <<< j) store in TBL ; SS1 store in TMP2 - vmovdqa32 TMP2, [TBL + (I*64)] - vpaddd TMP2,E + vpaddd TMP2,E, [TBL + (I*4)]{1to16} vpaddd TMP2,TMP0 vprold TMP2,7 @@ -684,17 +679,15 @@ lloop: ; G = F <<< 19 ; F = E ; E = P(TT2) - vmovups D,C - vprold B,9 - vmovups C,B - vmovups B,A - vmovups A,TMP3 - vmovups H,G - vprold F,19 - vmovups G,F - vmovups F,E + vmovdqa32 D,C + vprold C, B, 9 + vmovdqa32 B,A + vmovdqa32 A,TMP3 + vmovdqa32 H,G + vprold G, F, 19 + vmovdqa32 F,E P TMP2 - vmovups E,TMP0 + vmovdqa32 E,TMP0 %assign I (I+1) %endrep @@ -710,9 +703,7 @@ lloop: %assign cur_loop cur_loop+1 sub SIZE, 1 - je last_loop - - jmp lloop + jne lloop last_loop: @@ -728,14 +719,14 @@ last_loop: %assign I (I+1) %endrep ; Write out digest - vmovups [DIGEST + 0*64], A - vmovups [DIGEST + 1*64], B - vmovups [DIGEST + 2*64], C - vmovups [DIGEST + 3*64], D - vmovups [DIGEST + 4*64], E - vmovups [DIGEST + 5*64], F - vmovups [DIGEST + 6*64], G - vmovups [DIGEST + 7*64], H + vmovdqu64 [DIGEST + 0*64], A + vmovdqu64 [DIGEST + 1*64], B + vmovdqu64 [DIGEST + 2*64], C + vmovdqu64 [DIGEST + 3*64], D + vmovdqu64 [DIGEST + 4*64], E + vmovdqu64 [DIGEST + 5*64], F + vmovdqu64 [DIGEST + 6*64], G + vmovdqu64 [DIGEST + 7*64], H mov rsp, [rsp + _rsp] @@ -745,265 +736,74 @@ last_loop: section .data align 64 TABLE: - dq 0x79cc451979cc4519,0x79cc451979cc4519 - dq 0x79cc451979cc4519,0x79cc451979cc4519 - dq 0x79cc451979cc4519,0x79cc451979cc4519 - dq 0x79cc451979cc4519,0x79cc451979cc4519 - dq 0xf3988a32f3988a32,0xf3988a32f3988a32 - dq 0xf3988a32f3988a32,0xf3988a32f3988a32 - dq 0xf3988a32f3988a32,0xf3988a32f3988a32 - dq 0xf3988a32f3988a32,0xf3988a32f3988a32 - dq 0xe7311465e7311465,0xe7311465e7311465 - dq 0xe7311465e7311465,0xe7311465e7311465 - dq 0xe7311465e7311465,0xe7311465e7311465 - dq 0xe7311465e7311465,0xe7311465e7311465 - dq 0xce6228cbce6228cb,0xce6228cbce6228cb - dq 0xce6228cbce6228cb,0xce6228cbce6228cb - dq 0xce6228cbce6228cb,0xce6228cbce6228cb - dq 0xce6228cbce6228cb,0xce6228cbce6228cb - dq 0x9cc451979cc45197,0x9cc451979cc45197 - dq 0x9cc451979cc45197,0x9cc451979cc45197 - dq 0x9cc451979cc45197,0x9cc451979cc45197 - dq 0x9cc451979cc45197,0x9cc451979cc45197 - dq 0x3988a32f3988a32f,0x3988a32f3988a32f - dq 0x3988a32f3988a32f,0x3988a32f3988a32f - dq 0x3988a32f3988a32f,0x3988a32f3988a32f - dq 0x3988a32f3988a32f,0x3988a32f3988a32f - dq 0x7311465e7311465e,0x7311465e7311465e - dq 0x7311465e7311465e,0x7311465e7311465e - dq 0x7311465e7311465e,0x7311465e7311465e - dq 0x7311465e7311465e,0x7311465e7311465e - dq 0xe6228cbce6228cbc,0xe6228cbce6228cbc - dq 0xe6228cbce6228cbc,0xe6228cbce6228cbc - dq 0xe6228cbce6228cbc,0xe6228cbce6228cbc - dq 0xe6228cbce6228cbc,0xe6228cbce6228cbc - dq 0xcc451979cc451979,0xcc451979cc451979 - dq 0xcc451979cc451979,0xcc451979cc451979 - dq 0xcc451979cc451979,0xcc451979cc451979 - dq 0xcc451979cc451979,0xcc451979cc451979 - dq 0x988a32f3988a32f3,0x988a32f3988a32f3 - dq 0x988a32f3988a32f3,0x988a32f3988a32f3 - dq 0x988a32f3988a32f3,0x988a32f3988a32f3 - dq 0x988a32f3988a32f3,0x988a32f3988a32f3 - dq 0x311465e7311465e7,0x311465e7311465e7 - dq 0x311465e7311465e7,0x311465e7311465e7 - dq 0x311465e7311465e7,0x311465e7311465e7 - dq 0x311465e7311465e7,0x311465e7311465e7 - dq 0x6228cbce6228cbce,0x6228cbce6228cbce - dq 0x6228cbce6228cbce,0x6228cbce6228cbce - dq 0x6228cbce6228cbce,0x6228cbce6228cbce - dq 0x6228cbce6228cbce,0x6228cbce6228cbce - dq 0xc451979cc451979c,0xc451979cc451979c - dq 0xc451979cc451979c,0xc451979cc451979c - dq 0xc451979cc451979c,0xc451979cc451979c - dq 0xc451979cc451979c,0xc451979cc451979c - dq 0x88a32f3988a32f39,0x88a32f3988a32f39 - dq 0x88a32f3988a32f39,0x88a32f3988a32f39 - dq 0x88a32f3988a32f39,0x88a32f3988a32f39 - dq 0x88a32f3988a32f39,0x88a32f3988a32f39 - dq 0x11465e7311465e73,0x11465e7311465e73 - dq 0x11465e7311465e73,0x11465e7311465e73 - dq 0x11465e7311465e73,0x11465e7311465e73 - dq 0x11465e7311465e73,0x11465e7311465e73 - dq 0x228cbce6228cbce6,0x228cbce6228cbce6 - dq 0x228cbce6228cbce6,0x228cbce6228cbce6 - dq 0x228cbce6228cbce6,0x228cbce6228cbce6 - dq 0x228cbce6228cbce6,0x228cbce6228cbce6 - dq 0x9d8a7a879d8a7a87,0x9d8a7a879d8a7a87 - dq 0x9d8a7a879d8a7a87,0x9d8a7a879d8a7a87 - dq 0x9d8a7a879d8a7a87,0x9d8a7a879d8a7a87 - dq 0x9d8a7a879d8a7a87,0x9d8a7a879d8a7a87 - dq 0x3b14f50f3b14f50f,0x3b14f50f3b14f50f - dq 0x3b14f50f3b14f50f,0x3b14f50f3b14f50f - dq 0x3b14f50f3b14f50f,0x3b14f50f3b14f50f - dq 0x3b14f50f3b14f50f,0x3b14f50f3b14f50f - dq 0x7629ea1e7629ea1e,0x7629ea1e7629ea1e - dq 0x7629ea1e7629ea1e,0x7629ea1e7629ea1e - dq 0x7629ea1e7629ea1e,0x7629ea1e7629ea1e - dq 0x7629ea1e7629ea1e,0x7629ea1e7629ea1e - dq 0xec53d43cec53d43c,0xec53d43cec53d43c - dq 0xec53d43cec53d43c,0xec53d43cec53d43c - dq 0xec53d43cec53d43c,0xec53d43cec53d43c - dq 0xec53d43cec53d43c,0xec53d43cec53d43c - dq 0xd8a7a879d8a7a879,0xd8a7a879d8a7a879 - dq 0xd8a7a879d8a7a879,0xd8a7a879d8a7a879 - dq 0xd8a7a879d8a7a879,0xd8a7a879d8a7a879 - dq 0xd8a7a879d8a7a879,0xd8a7a879d8a7a879 - dq 0xb14f50f3b14f50f3,0xb14f50f3b14f50f3 - dq 0xb14f50f3b14f50f3,0xb14f50f3b14f50f3 - dq 0xb14f50f3b14f50f3,0xb14f50f3b14f50f3 - dq 0xb14f50f3b14f50f3,0xb14f50f3b14f50f3 - dq 0x629ea1e7629ea1e7,0x629ea1e7629ea1e7 - dq 0x629ea1e7629ea1e7,0x629ea1e7629ea1e7 - dq 0x629ea1e7629ea1e7,0x629ea1e7629ea1e7 - dq 0x629ea1e7629ea1e7,0x629ea1e7629ea1e7 - dq 0xc53d43cec53d43ce,0xc53d43cec53d43ce - dq 0xc53d43cec53d43ce,0xc53d43cec53d43ce - dq 0xc53d43cec53d43ce,0xc53d43cec53d43ce - dq 0xc53d43cec53d43ce,0xc53d43cec53d43ce - dq 0x8a7a879d8a7a879d,0x8a7a879d8a7a879d - dq 0x8a7a879d8a7a879d,0x8a7a879d8a7a879d - dq 0x8a7a879d8a7a879d,0x8a7a879d8a7a879d - dq 0x8a7a879d8a7a879d,0x8a7a879d8a7a879d - dq 0x14f50f3b14f50f3b,0x14f50f3b14f50f3b - dq 0x14f50f3b14f50f3b,0x14f50f3b14f50f3b - dq 0x14f50f3b14f50f3b,0x14f50f3b14f50f3b - dq 0x14f50f3b14f50f3b,0x14f50f3b14f50f3b - dq 0x29ea1e7629ea1e76,0x29ea1e7629ea1e76 - dq 0x29ea1e7629ea1e76,0x29ea1e7629ea1e76 - dq 0x29ea1e7629ea1e76,0x29ea1e7629ea1e76 - dq 0x29ea1e7629ea1e76,0x29ea1e7629ea1e76 - dq 0x53d43cec53d43cec,0x53d43cec53d43cec - dq 0x53d43cec53d43cec,0x53d43cec53d43cec - dq 0x53d43cec53d43cec,0x53d43cec53d43cec - dq 0x53d43cec53d43cec,0x53d43cec53d43cec - dq 0xa7a879d8a7a879d8,0xa7a879d8a7a879d8 - dq 0xa7a879d8a7a879d8,0xa7a879d8a7a879d8 - dq 0xa7a879d8a7a879d8,0xa7a879d8a7a879d8 - dq 0xa7a879d8a7a879d8,0xa7a879d8a7a879d8 - dq 0x4f50f3b14f50f3b1,0x4f50f3b14f50f3b1 - dq 0x4f50f3b14f50f3b1,0x4f50f3b14f50f3b1 - dq 0x4f50f3b14f50f3b1,0x4f50f3b14f50f3b1 - dq 0x4f50f3b14f50f3b1,0x4f50f3b14f50f3b1 - dq 0x9ea1e7629ea1e762,0x9ea1e7629ea1e762 - dq 0x9ea1e7629ea1e762,0x9ea1e7629ea1e762 - dq 0x9ea1e7629ea1e762,0x9ea1e7629ea1e762 - dq 0x9ea1e7629ea1e762,0x9ea1e7629ea1e762 - dq 0x3d43cec53d43cec5,0x3d43cec53d43cec5 - dq 0x3d43cec53d43cec5,0x3d43cec53d43cec5 - dq 0x3d43cec53d43cec5,0x3d43cec53d43cec5 - dq 0x3d43cec53d43cec5,0x3d43cec53d43cec5 - dq 0x7a879d8a7a879d8a,0x7a879d8a7a879d8a - dq 0x7a879d8a7a879d8a,0x7a879d8a7a879d8a - dq 0x7a879d8a7a879d8a,0x7a879d8a7a879d8a - dq 0x7a879d8a7a879d8a,0x7a879d8a7a879d8a - dq 0xf50f3b14f50f3b14,0xf50f3b14f50f3b14 - dq 0xf50f3b14f50f3b14,0xf50f3b14f50f3b14 - dq 0xf50f3b14f50f3b14,0xf50f3b14f50f3b14 - dq 0xf50f3b14f50f3b14,0xf50f3b14f50f3b14 - dq 0xea1e7629ea1e7629,0xea1e7629ea1e7629 - dq 0xea1e7629ea1e7629,0xea1e7629ea1e7629 - dq 0xea1e7629ea1e7629,0xea1e7629ea1e7629 - dq 0xea1e7629ea1e7629,0xea1e7629ea1e7629 - dq 0xd43cec53d43cec53,0xd43cec53d43cec53 - dq 0xd43cec53d43cec53,0xd43cec53d43cec53 - dq 0xd43cec53d43cec53,0xd43cec53d43cec53 - dq 0xd43cec53d43cec53,0xd43cec53d43cec53 - dq 0xa879d8a7a879d8a7,0xa879d8a7a879d8a7 - dq 0xa879d8a7a879d8a7,0xa879d8a7a879d8a7 - dq 0xa879d8a7a879d8a7,0xa879d8a7a879d8a7 - dq 0xa879d8a7a879d8a7,0xa879d8a7a879d8a7 - dq 0x50f3b14f50f3b14f,0x50f3b14f50f3b14f - dq 0x50f3b14f50f3b14f,0x50f3b14f50f3b14f - dq 0x50f3b14f50f3b14f,0x50f3b14f50f3b14f - dq 0x50f3b14f50f3b14f,0x50f3b14f50f3b14f - dq 0xa1e7629ea1e7629e,0xa1e7629ea1e7629e - dq 0xa1e7629ea1e7629e,0xa1e7629ea1e7629e - dq 0xa1e7629ea1e7629e,0xa1e7629ea1e7629e - dq 0xa1e7629ea1e7629e,0xa1e7629ea1e7629e - dq 0x43cec53d43cec53d,0x43cec53d43cec53d - dq 0x43cec53d43cec53d,0x43cec53d43cec53d - dq 0x43cec53d43cec53d,0x43cec53d43cec53d - dq 0x43cec53d43cec53d,0x43cec53d43cec53d - dq 0x879d8a7a879d8a7a,0x879d8a7a879d8a7a - dq 0x879d8a7a879d8a7a,0x879d8a7a879d8a7a - dq 0x879d8a7a879d8a7a,0x879d8a7a879d8a7a - dq 0x879d8a7a879d8a7a,0x879d8a7a879d8a7a - dq 0x0f3b14f50f3b14f5,0x0f3b14f50f3b14f5 - dq 0x0f3b14f50f3b14f5,0x0f3b14f50f3b14f5 - dq 0x0f3b14f50f3b14f5,0x0f3b14f50f3b14f5 - dq 0x0f3b14f50f3b14f5,0x0f3b14f50f3b14f5 - dq 0x1e7629ea1e7629ea,0x1e7629ea1e7629ea - dq 0x1e7629ea1e7629ea,0x1e7629ea1e7629ea - dq 0x1e7629ea1e7629ea,0x1e7629ea1e7629ea - dq 0x1e7629ea1e7629ea,0x1e7629ea1e7629ea - dq 0x3cec53d43cec53d4,0x3cec53d43cec53d4 - dq 0x3cec53d43cec53d4,0x3cec53d43cec53d4 - dq 0x3cec53d43cec53d4,0x3cec53d43cec53d4 - dq 0x3cec53d43cec53d4,0x3cec53d43cec53d4 - dq 0x79d8a7a879d8a7a8,0x79d8a7a879d8a7a8 - dq 0x79d8a7a879d8a7a8,0x79d8a7a879d8a7a8 - dq 0x79d8a7a879d8a7a8,0x79d8a7a879d8a7a8 - dq 0x79d8a7a879d8a7a8,0x79d8a7a879d8a7a8 - dq 0xf3b14f50f3b14f50,0xf3b14f50f3b14f50 - dq 0xf3b14f50f3b14f50,0xf3b14f50f3b14f50 - dq 0xf3b14f50f3b14f50,0xf3b14f50f3b14f50 - dq 0xf3b14f50f3b14f50,0xf3b14f50f3b14f50 - dq 0xe7629ea1e7629ea1,0xe7629ea1e7629ea1 - dq 0xe7629ea1e7629ea1,0xe7629ea1e7629ea1 - dq 0xe7629ea1e7629ea1,0xe7629ea1e7629ea1 - dq 0xe7629ea1e7629ea1,0xe7629ea1e7629ea1 - dq 0xcec53d43cec53d43,0xcec53d43cec53d43 - dq 0xcec53d43cec53d43,0xcec53d43cec53d43 - dq 0xcec53d43cec53d43,0xcec53d43cec53d43 - dq 0xcec53d43cec53d43,0xcec53d43cec53d43 - dq 0x9d8a7a879d8a7a87,0x9d8a7a879d8a7a87 - dq 0x9d8a7a879d8a7a87,0x9d8a7a879d8a7a87 - dq 0x9d8a7a879d8a7a87,0x9d8a7a879d8a7a87 - dq 0x9d8a7a879d8a7a87,0x9d8a7a879d8a7a87 - dq 0x3b14f50f3b14f50f,0x3b14f50f3b14f50f - dq 0x3b14f50f3b14f50f,0x3b14f50f3b14f50f - dq 0x3b14f50f3b14f50f,0x3b14f50f3b14f50f - dq 0x3b14f50f3b14f50f,0x3b14f50f3b14f50f - dq 0x7629ea1e7629ea1e,0x7629ea1e7629ea1e - dq 0x7629ea1e7629ea1e,0x7629ea1e7629ea1e - dq 0x7629ea1e7629ea1e,0x7629ea1e7629ea1e - dq 0x7629ea1e7629ea1e,0x7629ea1e7629ea1e - dq 0xec53d43cec53d43c,0xec53d43cec53d43c - dq 0xec53d43cec53d43c,0xec53d43cec53d43c - dq 0xec53d43cec53d43c,0xec53d43cec53d43c - dq 0xec53d43cec53d43c,0xec53d43cec53d43c - dq 0xd8a7a879d8a7a879,0xd8a7a879d8a7a879 - dq 0xd8a7a879d8a7a879,0xd8a7a879d8a7a879 - dq 0xd8a7a879d8a7a879,0xd8a7a879d8a7a879 - dq 0xd8a7a879d8a7a879,0xd8a7a879d8a7a879 - dq 0xb14f50f3b14f50f3,0xb14f50f3b14f50f3 - dq 0xb14f50f3b14f50f3,0xb14f50f3b14f50f3 - dq 0xb14f50f3b14f50f3,0xb14f50f3b14f50f3 - dq 0xb14f50f3b14f50f3,0xb14f50f3b14f50f3 - dq 0x629ea1e7629ea1e7,0x629ea1e7629ea1e7 - dq 0x629ea1e7629ea1e7,0x629ea1e7629ea1e7 - dq 0x629ea1e7629ea1e7,0x629ea1e7629ea1e7 - dq 0x629ea1e7629ea1e7,0x629ea1e7629ea1e7 - dq 0xc53d43cec53d43ce,0xc53d43cec53d43ce - dq 0xc53d43cec53d43ce,0xc53d43cec53d43ce - dq 0xc53d43cec53d43ce,0xc53d43cec53d43ce - dq 0xc53d43cec53d43ce,0xc53d43cec53d43ce - dq 0x8a7a879d8a7a879d,0x8a7a879d8a7a879d - dq 0x8a7a879d8a7a879d,0x8a7a879d8a7a879d - dq 0x8a7a879d8a7a879d,0x8a7a879d8a7a879d - dq 0x8a7a879d8a7a879d,0x8a7a879d8a7a879d - dq 0x14f50f3b14f50f3b,0x14f50f3b14f50f3b - dq 0x14f50f3b14f50f3b,0x14f50f3b14f50f3b - dq 0x14f50f3b14f50f3b,0x14f50f3b14f50f3b - dq 0x14f50f3b14f50f3b,0x14f50f3b14f50f3b - dq 0x29ea1e7629ea1e76,0x29ea1e7629ea1e76 - dq 0x29ea1e7629ea1e76,0x29ea1e7629ea1e76 - dq 0x29ea1e7629ea1e76,0x29ea1e7629ea1e76 - dq 0x29ea1e7629ea1e76,0x29ea1e7629ea1e76 - dq 0x53d43cec53d43cec,0x53d43cec53d43cec - dq 0x53d43cec53d43cec,0x53d43cec53d43cec - dq 0x53d43cec53d43cec,0x53d43cec53d43cec - dq 0x53d43cec53d43cec,0x53d43cec53d43cec - dq 0xa7a879d8a7a879d8,0xa7a879d8a7a879d8 - dq 0xa7a879d8a7a879d8,0xa7a879d8a7a879d8 - dq 0xa7a879d8a7a879d8,0xa7a879d8a7a879d8 - dq 0xa7a879d8a7a879d8,0xa7a879d8a7a879d8 - dq 0x4f50f3b14f50f3b1,0x4f50f3b14f50f3b1 - dq 0x4f50f3b14f50f3b1,0x4f50f3b14f50f3b1 - dq 0x4f50f3b14f50f3b1,0x4f50f3b14f50f3b1 - dq 0x4f50f3b14f50f3b1,0x4f50f3b14f50f3b1 - dq 0x9ea1e7629ea1e762,0x9ea1e7629ea1e762 - dq 0x9ea1e7629ea1e762,0x9ea1e7629ea1e762 - dq 0x9ea1e7629ea1e762,0x9ea1e7629ea1e762 - dq 0x9ea1e7629ea1e762,0x9ea1e7629ea1e762 - dq 0x3d43cec53d43cec5,0x3d43cec53d43cec5 - dq 0x3d43cec53d43cec5,0x3d43cec53d43cec5 - dq 0x3d43cec53d43cec5,0x3d43cec53d43cec5 - dq 0x3d43cec53d43cec5,0x3d43cec53d43cec5 + dd 0x79cc4519 + dd 0xf3988a32 + dd 0xe7311465 + dd 0xce6228cb + dd 0x9cc45197 + dd 0x3988a32f + dd 0x7311465e + dd 0xe6228cbc + dd 0xcc451979 + dd 0x988a32f3 + dd 0x311465e7 + dd 0x6228cbce + dd 0xc451979c + dd 0x88a32f39 + dd 0x11465e73 + dd 0x228cbce6 + dd 0x9d8a7a87 + dd 0x3b14f50f + dd 0x7629ea1e + dd 0xec53d43c + dd 0xd8a7a879 + dd 0xb14f50f3 + dd 0x629ea1e7 + dd 0xc53d43ce + dd 0x8a7a879d + dd 0x14f50f3b + dd 0x29ea1e76 + dd 0x53d43cec + dd 0xa7a879d8 + dd 0x4f50f3b1 + dd 0x9ea1e762 + dd 0x3d43cec5 + dd 0x7a879d8a + dd 0xf50f3b14 + dd 0xea1e7629 + dd 0xd43cec53 + dd 0xa879d8a7 + dd 0x50f3b14f + dd 0xa1e7629e + dd 0x43cec53d + dd 0x879d8a7a + dd 0x0f3b14f5 + dd 0x1e7629ea + dd 0x3cec53d4 + dd 0x79d8a7a8 + dd 0xf3b14f50 + dd 0xe7629ea1 + dd 0xcec53d43 + dd 0x9d8a7a87 + dd 0x3b14f50f + dd 0x7629ea1e + dd 0xec53d43c + dd 0xd8a7a879 + dd 0xb14f50f3 + dd 0x629ea1e7 + dd 0xc53d43ce + dd 0x8a7a879d + dd 0x14f50f3b + dd 0x29ea1e76 + dd 0x53d43cec + dd 0xa7a879d8 + dd 0x4f50f3b1 + dd 0x9ea1e762 + dd 0x3d43cec5 +align 64 PSHUFFLE_TRANSPOSE16_MASK1: dq 0x0000000000000000 dq 0x0000000000000001 dq 0x0000000000000008 @@ -1023,9 +823,6 @@ PSHUFFLE_TRANSPOSE16_MASK2: dq 0x0000000000000002 dq 0x000000000000000F SHUF_MASK: dq 0x0405060700010203,0x0c0d0e0f08090a0b - dq 0x0405060700010203,0x0c0d0e0f08090a0b - dq 0x0405060700010203,0x0c0d0e0f08090a0b - dq 0x0405060700010203,0x0c0d0e0f08090a0b %else %ifidn __OUTPUT_FORMAT__, win64 From c23274251ea68446278c5badb4891d514e5806e0 Mon Sep 17 00:00:00 2001 From: Nicola Torracca Date: Mon, 13 May 2024 14:12:33 +0200 Subject: [PATCH 2/3] Use embedded broadcast for constants. Signed-off-by: Nicola Torracca --- sm3_mb/sm3_mb_x16_avx512.asm | 160 ++++++++++++++++++----------------- 1 file changed, 84 insertions(+), 76 deletions(-) diff --git a/sm3_mb/sm3_mb_x16_avx512.asm b/sm3_mb/sm3_mb_x16_avx512.asm index 9b0fdf79..294ad6b1 100644 --- a/sm3_mb/sm3_mb_x16_avx512.asm +++ b/sm3_mb/sm3_mb_x16_avx512.asm @@ -162,10 +162,9 @@ FIELD _rsp, 8, 8 %define %%t0 %17 %define %%t1 %18 - ; keep the shuffle masks in registers. + ; keep the transpose masks in registers vmovdqa32 TMP2, [PSHUFFLE_TRANSPOSE16_MASK1] vmovdqa32 TMP3, [PSHUFFLE_TRANSPOSE16_MASK2] - ; process top half (r0..r3) {a...d} vshufps %%t0, %%r0, %%r1, 0x44 ; t0 = {b13 b12 a13 a12 b9 b8 a9 a8 b5 b4 a5 a4 b1 b0 a1 a0} vshufps %%r0, %%r0, %%r1, 0xEE ; r0 = {b15 b14 a15 a14 b11 b10 a11 a10 b7 b6 a7 a6 b3 b2 a3 a2} @@ -330,7 +329,7 @@ FIELD _rsp, 8, 8 %define %%Y %2 %define %%Z %3 ; I < 16 return (X ^ Y ^ Z) - vmovdqa32 TMP0,%%X + vmovups TMP0,%%X vpternlogd TMP0,%%Y,%%Z,0x96 %endmacro @@ -343,10 +342,12 @@ FIELD _rsp, 8, 8 %define %%X %1 %define %%Y %2 %define %%Z %3 - ; I > 16 return (x & y) | (x & z) | (y & z) bitwise majority function. + ; I > 16 return (x & y) | (x & z) | (y & z) ; Same as (x & y) | (z & (x | y)) - vmovdqa32 TMP0, %%X - vpternlogd TMP0, %%Y, %%Z, 0xE8 + vporq TMP0,%%X,%%Y + vpandq TMP0,%%Z + vpandq TMP1,%%X,%%Y + vporq TMP0,TMP1 %endmacro @@ -358,7 +359,7 @@ FIELD _rsp, 8, 8 %define %%Y %2 %define %%Z %3 ; I < 16 return (x ^ y ^ z) - vmovdqa32 TMP0,%%X + vmovups TMP0,%%X vpternlogd TMP0,%%Y,%%Z,0x96 %endmacro @@ -368,9 +369,10 @@ FIELD _rsp, 8, 8 %define %%Y %2 %define %%Z %3 - ; I > 16 return (x & y) | ((~x) & z) bitwise select x ? y : z. - vmovdqa32 TMP0, %%X - vpternlogd TMP0, %%Y, %%Z, 0xCA + ; I > 16 return (x & y) | ((~x) & z) + vpandq TMP0,%%X,%%Y + vpandnd TMP1,%%X,%%Z + vporq TMP0,TMP1 %endmacro ;; void sm3_mb_x16_avx512(SM3_MB_ARGS_X16, uint32_t size) @@ -388,19 +390,17 @@ sm3_mb_x16_avx512: lea TBL, [TABLE] ;; Initialize digests - vmovdqu64 A, [DIGEST + 0*64] ; mov unsigned - vmovdqu64 B, [DIGEST + 1*64] - vmovdqu64 C, [DIGEST + 2*64] - vmovdqu64 D, [DIGEST + 3*64] - vmovdqu64 E, [DIGEST + 4*64] - vmovdqu64 F, [DIGEST + 5*64] - vmovdqu64 G, [DIGEST + 6*64] - vmovdqu64 H, [DIGEST + 7*64] + vmovups A, [DIGEST + 0*64] ; mov unsigned + vmovups B, [DIGEST + 1*64] + vmovups C, [DIGEST + 2*64] + vmovups D, [DIGEST + 3*64] + vmovups E, [DIGEST + 4*64] + vmovups F, [DIGEST + 5*64] + vmovups G, [DIGEST + 6*64] + vmovups H, [DIGEST + 7*64] xor IDX, IDX - jmp lloop -align 32 %assign cur_loop 0 lloop: ;; start message expand @@ -417,14 +417,14 @@ lloop: ;; stored B(i) to W(1)...W(15) ;; in zmm16....zmm31 - vmovdqu64 WB0,[inp0+IDX] - vmovdqu64 WB1,[inp1+IDX] - vmovdqu64 WB2,[inp2+IDX] - vmovdqu64 WB3,[inp3+IDX] - vmovdqu64 WB4,[inp4+IDX] - vmovdqu64 WB5,[inp5+IDX] - vmovdqu64 WB6,[inp6+IDX] - vmovdqu64 WB7,[inp7+IDX] + vmovups WB0,[inp0+IDX] + vmovups WB1,[inp1+IDX] + vmovups WB2,[inp2+IDX] + vmovups WB3,[inp3+IDX] + vmovups WB4,[inp4+IDX] + vmovups WB5,[inp5+IDX] + vmovups WB6,[inp6+IDX] + vmovups WB7,[inp7+IDX] mov inp0, [IN + 8*8] mov inp1, [IN + 9*8] @@ -435,14 +435,14 @@ lloop: mov inp6, [IN +14*8] mov inp7, [IN +15*8] - vmovdqu64 WB8, [inp0+IDX] - vmovdqu64 WB9, [inp1+IDX] - vmovdqu64 WB10,[inp2+IDX] - vmovdqu64 WB11,[inp3+IDX] - vmovdqu64 WB12,[inp4+IDX] - vmovdqu64 WB13,[inp5+IDX] - vmovdqu64 WB14,[inp6+IDX] - vmovdqu64 WB15,[inp7+IDX] + vmovups WB8, [inp0+IDX] + vmovups WB9, [inp1+IDX] + vmovups WB10,[inp2+IDX] + vmovups WB11,[inp3+IDX] + vmovups WB12,[inp4+IDX] + vmovups WB13,[inp5+IDX] + vmovups WB14,[inp6+IDX] + vmovups WB15,[inp7+IDX] vmovdqa32 [rsp + _DIGEST_SAVE + 64*0], A vmovdqa32 [rsp + _DIGEST_SAVE + 64*1], B @@ -488,7 +488,7 @@ lloop: ; SS1 = ((A <<< 12) + E + (T(j) <<< j)) <<< 7 ; (T(j) <<< j) store in TBL ; SS1 store in TMP2 - vpaddd TMP2,E, [TBL+ (I*4)]{1to16} + vpaddd TMP2, E, [TBL + (I*4)]{1to16} vpaddd TMP2,TMP0 vprold TMP2,7 @@ -522,15 +522,17 @@ lloop: ; G = F <<< 19 ; F = E ; E = P(TT2) - vmovdqa32 D,C - vprold C, B, 9 - vmovdqa32 B,A - vmovdqa32 A,TMP3 - vmovdqa32 H,G - vprold G, F,19 - vmovdqa32 F,E + vmovups D,C + vprold B,9 + vmovups C,B + vmovups B,A + vmovups A,TMP3 + vmovups H,G + vprold F,19 + vmovups G,F + vmovups F,E P TMP2 - vmovdqa32 E,TMP0 + vmovups E,TMP0 ;vprold B,9 ;vprold F,19 @@ -562,7 +564,8 @@ lloop: P1 APPEND(WB,J) vprold APPEND(WB,J),APPEND(WB,J_13),7 - vpternlogd APPEND(WB,J),APPEND(WB,J_6), TMP0, 0x96 + vpxord APPEND(WB,J),TMP0 + vpxord APPEND(WB,J),APPEND(WB,J_6) ; (A <<< 12) ; store in TMP0 @@ -571,7 +574,7 @@ lloop: ; SS1 = ((A <<< 12) + E + (T(j) <<< j)) <<< 7 ; (T(j) <<< j) store in TBL ; SS1 store in TMP2 - vpaddd TMP2,E, [TBL + (I*4)]{1to16} + vpaddd TMP2, E, [TBL + (I*4)]{1to16} vpaddd TMP2,TMP0 vprold TMP2,7 @@ -604,17 +607,17 @@ lloop: ; G = F <<< 19 ; F = E ; E = P(TT2) - vmovdqa32 D,C + vmovups D,C vprold B,9 - vmovdqa32 C,B - vmovdqa32 B,A - vmovdqa32 A,TMP3 - vmovdqa32 H,G + vmovups C,B + vmovups B,A + vmovups A,TMP3 + vmovups H,G vprold F,19 - vmovdqa32 G,F - vmovdqa32 F,E + vmovups G,F + vmovups F,E P TMP2 - vmovdqu64 E,TMP0 + vmovups E,TMP0 %assign I (I+1) %endrep @@ -632,12 +635,14 @@ lloop: %assign J (((I+4) % 20)) vprold APPEND(WB,J),APPEND(WB,J_3),15 - vpternlogd APPEND(WB,J),APPEND(WB,J_9), APPEND(WB,J_16), 0x96 + vpxord APPEND(WB,J),APPEND(WB,J_16) + vpxord APPEND(WB,J),APPEND(WB,J_9) P1 APPEND(WB,J) vprold APPEND(WB,J),APPEND(WB,J_13),7 - vpternlogd APPEND(WB,J),APPEND(WB,J_6), TMP0, 0x96 + vpxord APPEND(WB,J),TMP0 + vpxord APPEND(WB,J),APPEND(WB,J_6) ; (A <<< 12) ; store in TMP0 @@ -646,7 +651,7 @@ lloop: ; SS1 = ((A <<< 12) + E + (T(j) <<< j)) <<< 7 ; (T(j) <<< j) store in TBL ; SS1 store in TMP2 - vpaddd TMP2,E, [TBL + (I*4)]{1to16} + vpaddd TMP2, E, [TBL + (I*4)]{1to16} vpaddd TMP2,TMP0 vprold TMP2,7 @@ -679,15 +684,17 @@ lloop: ; G = F <<< 19 ; F = E ; E = P(TT2) - vmovdqa32 D,C - vprold C, B, 9 - vmovdqa32 B,A - vmovdqa32 A,TMP3 - vmovdqa32 H,G - vprold G, F, 19 - vmovdqa32 F,E + vmovups D,C + vprold B,9 + vmovups C,B + vmovups B,A + vmovups A,TMP3 + vmovups H,G + vprold F,19 + vmovups G,F + vmovups F,E P TMP2 - vmovdqa32 E,TMP0 + vmovups E,TMP0 %assign I (I+1) %endrep @@ -703,7 +710,9 @@ lloop: %assign cur_loop cur_loop+1 sub SIZE, 1 - jne lloop + je last_loop + + jmp lloop last_loop: @@ -719,14 +728,14 @@ last_loop: %assign I (I+1) %endrep ; Write out digest - vmovdqu64 [DIGEST + 0*64], A - vmovdqu64 [DIGEST + 1*64], B - vmovdqu64 [DIGEST + 2*64], C - vmovdqu64 [DIGEST + 3*64], D - vmovdqu64 [DIGEST + 4*64], E - vmovdqu64 [DIGEST + 5*64], F - vmovdqu64 [DIGEST + 6*64], G - vmovdqu64 [DIGEST + 7*64], H + vmovups [DIGEST + 0*64], A + vmovups [DIGEST + 1*64], B + vmovups [DIGEST + 2*64], C + vmovups [DIGEST + 3*64], D + vmovups [DIGEST + 4*64], E + vmovups [DIGEST + 5*64], F + vmovups [DIGEST + 6*64], G + vmovups [DIGEST + 7*64], H mov rsp, [rsp + _rsp] @@ -803,7 +812,6 @@ TABLE: -align 64 PSHUFFLE_TRANSPOSE16_MASK1: dq 0x0000000000000000 dq 0x0000000000000001 dq 0x0000000000000008 From c45ffec22b76b1d5fe399c4051e0ead715a7194c Mon Sep 17 00:00:00 2001 From: Nicola Torracca Date: Mon, 13 May 2024 14:18:49 +0200 Subject: [PATCH 3/3] fix to pass check_format.sh coding style. Signed-off-by: Nicola Torracca --- aes/cbc_std_vectors.h | 2 +- aes/gcm_vectors.h | 6 ++---- fips/aes_self_tests.c | 14 ++++---------- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/aes/cbc_std_vectors.h b/aes/cbc_std_vectors.h index 5340da6c..b8e61d22 100644 --- a/aes/cbc_std_vectors.h +++ b/aes/cbc_std_vectors.h @@ -420,7 +420,7 @@ static unsigned char C11[] = { 0x15, 0xb9, 0x26, 0x83, 0x81, 0x95, 0x96, 0xa8, 0 #define vector(N) \ { \ K##N, (CBC_KEY_LEN(K##N)), IV##N, vect_size(P##N, C##N), P##N, C##N, NULL, \ - NULL, /*NULL, NULL*/ \ + NULL, /*NULL, NULL*/ \ } struct cbc_vector const cbc_vectors[] = { vector(1), vector(2), vector(3), vector(4), vector(5), vector(6), diff --git a/aes/gcm_vectors.h b/aes/gcm_vectors.h index c2fc422f..9a791951 100644 --- a/aes/gcm_vectors.h +++ b/aes/gcm_vectors.h @@ -475,10 +475,8 @@ static uint8_t T11[] = { 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, /////// #define vector(N) \ - { \ - K##N, (KBITS(K##N)), IV##N, sizeof(IV##N), A##N, A##N##_len, P##N, sizeof(P##N), \ - C##N, T##N, sizeof(T##N) \ - } + { K##N, (KBITS(K##N)), IV##N, sizeof(IV##N), A##N, A##N##_len, \ + P##N, sizeof(P##N), C##N, T##N, sizeof(T##N) } gcm_vector const gcm_vectors[] = { // field order {K, Klen, IV, IVlen, A, Alen, P, Plen, C, T, Tlen}; diff --git a/fips/aes_self_tests.c b/fips/aes_self_tests.c index 2a10d546..8e629a98 100644 --- a/fips/aes_self_tests.c +++ b/fips/aes_self_tests.c @@ -322,9 +322,7 @@ static uint8_t aes_gcm_256_tag[] = { 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0 0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b }; #define ADD_CBC_VECTOR(_key, _iv, _plain, _cipher, _descr) \ - { \ - _key, sizeof(_key), _iv, _plain, sizeof(_plain), _cipher, _descr \ - } + { _key, sizeof(_key), _iv, _plain, sizeof(_plain), _cipher, _descr } static const struct self_test_cbc_vector cbc_vectors[] = { ADD_CBC_VECTOR(aes_cbc_128_key, aes_cbc_128_iv, aes_cbc_128_plaintext, @@ -420,9 +418,7 @@ _aes_cbc_self_test(void) } #define ADD_XTS_VECTOR(_key1, _key2, _tweak, _plain, _cipher, _descr) \ - { \ - _key1, _key2, sizeof(_key1), _tweak, _plain, sizeof(_plain), _cipher, _descr \ - } + { _key1, _key2, sizeof(_key1), _tweak, _plain, sizeof(_plain), _cipher, _descr } static const struct self_test_xts_vector xts_vectors[] = { ADD_XTS_VECTOR(aes_xts_128_key1, aes_xts_128_key2, aes_xts_128_tweak, aes_xts_128_plaintext, @@ -557,10 +553,8 @@ _aes_xts_self_test(void) } #define ADD_GCM_VECTOR(_key, _iv, _plain, _cipher, _aad, _tag, _descr) \ - { \ - _key, sizeof(_key), _iv, _plain, sizeof(_plain), _cipher, _aad, sizeof(_aad), \ - _tag, sizeof(_tag), _descr \ - } + { _key, sizeof(_key), _iv, _plain, sizeof(_plain), _cipher, \ + _aad, sizeof(_aad), _tag, sizeof(_tag), _descr } static const struct self_test_gcm_vector gcm_vectors[] = { ADD_GCM_VECTOR(aes_gcm_128_key, aes_gcm_128_iv, aes_gcm_128_plaintext,