LCOV - code coverage report
Current view: top level - src/crypto - sha256_sse4.cpp (source / functions) Hit Total Coverage
Test: coverage.lcov Lines: 935 935 100.0 %
Date: 2022-04-21 14:51:19 Functions: 1 1 100.0 %
Legend: Modified by patch:
Lines: hit not hit | Branches: + taken - not taken # not executed

Not modified by patch:
Lines: hit not hit | Branches: + taken - not taken # not executed
Branches: 0 0 -

           Branch data     Line data    Source code
#       1                 :            : // Copyright (c) 2017-2020 The Bitcoin Core developers
#       2                 :            : // Distributed under the MIT software license, see the accompanying
#       3                 :            : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
#       4                 :            : //
#       5                 :            : // This is a translation to GCC extended asm syntax from YASM code by Intel
#       6                 :            : // (available at the bottom of this file).
#       7                 :            : 
#       8                 :            : #include <stdint.h>
#       9                 :            : #include <stdlib.h>
#      10                 :            : 
#      11                 :            : #if defined(__x86_64__) || defined(__amd64__)
#      12                 :            : 
#      13                 :            : namespace sha256_sse4
#      14                 :            : {
#      15                 :            : void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks)
#      16                 :   69060005 : {
#      17                 :   69060005 :     static const uint32_t K256 alignas(16) [] = {
#      18                 :   69060005 :         0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
#      19                 :   69060005 :         0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
#      20                 :   69060005 :         0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
#      21                 :   69060005 :         0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
#      22                 :   69060005 :         0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
#      23                 :   69060005 :         0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
#      24                 :   69060005 :         0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
#      25                 :   69060005 :         0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
#      26                 :   69060005 :         0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
#      27                 :   69060005 :         0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
#      28                 :   69060005 :         0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
#      29                 :   69060005 :         0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
#      30                 :   69060005 :         0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
#      31                 :   69060005 :         0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
#      32                 :   69060005 :         0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
#      33                 :   69060005 :         0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
#      34                 :   69060005 :     };
#      35                 :   69060005 :     static const uint32_t FLIP_MASK alignas(16) [] = {0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f};
#      36                 :   69060005 :     static const uint32_t SHUF_00BA alignas(16) [] = {0x03020100, 0x0b0a0908, 0xffffffff, 0xffffffff};
#      37                 :   69060005 :     static const uint32_t SHUF_DC00 alignas(16) [] = {0xffffffff, 0xffffffff, 0x03020100, 0x0b0a0908};
#      38                 :   69060005 :     uint32_t a, b, c, d, f, g, h, y0, y1, y2;
#      39                 :   69060005 :     uint64_t tbl;
#      40                 :   69060005 :     uint64_t inp_end, inp;
#      41                 :   69060005 :     uint32_t xfer alignas(16) [4];
#      42                 :            : 
#      43                 :   69060005 :     __asm__ __volatile__(
#      44                 :   69060005 :         "shl    $0x6,%2;"
#      45                 :   69060005 :         "je     Ldone_hash_%=;"
#      46                 :   69060005 :         "add    %1,%2;"
#      47                 :   69060005 :         "mov    %2,%14;"
#      48                 :   69060005 :         "mov    (%0),%3;"
#      49                 :   69060005 :         "mov    0x4(%0),%4;"
#      50                 :   69060005 :         "mov    0x8(%0),%5;"
#      51                 :   69060005 :         "mov    0xc(%0),%6;"
#      52                 :   69060005 :         "mov    0x10(%0),%k2;"
#      53                 :   69060005 :         "mov    0x14(%0),%7;"
#      54                 :   69060005 :         "mov    0x18(%0),%8;"
#      55                 :   69060005 :         "mov    0x1c(%0),%9;"
#      56                 :   69060005 :         "movdqa %18,%%xmm12;"
#      57                 :   69060005 :         "movdqa %19,%%xmm10;"
#      58                 :   69060005 :         "movdqa %20,%%xmm11;"
#      59                 :            : 
#      60                 :   69060005 :         "Lloop0_%=:"
#      61                 :   69060005 :         "lea    %17,%13;"
#      62                 :   69060005 :         "movdqu (%1),%%xmm4;"
#      63                 :   69060005 :         "pshufb %%xmm12,%%xmm4;"
#      64                 :   69060005 :         "movdqu 0x10(%1),%%xmm5;"
#      65                 :   69060005 :         "pshufb %%xmm12,%%xmm5;"
#      66                 :   69060005 :         "movdqu 0x20(%1),%%xmm6;"
#      67                 :   69060005 :         "pshufb %%xmm12,%%xmm6;"
#      68                 :   69060005 :         "movdqu 0x30(%1),%%xmm7;"
#      69                 :   69060005 :         "pshufb %%xmm12,%%xmm7;"
#      70                 :   69060005 :         "mov    %1,%15;"
#      71                 :   69060005 :         "mov    $3,%1;"
#      72                 :            : 
#      73                 :   69060005 :         "Lloop1_%=:"
#      74                 :   69060005 :         "movdqa 0x0(%13),%%xmm9;"
#      75                 :   69060005 :         "paddd  %%xmm4,%%xmm9;"
#      76                 :   69060005 :         "movdqa %%xmm9,%16;"
#      77                 :   69060005 :         "movdqa %%xmm7,%%xmm0;"
#      78                 :   69060005 :         "mov    %k2,%10;"
#      79                 :   69060005 :         "ror    $0xe,%10;"
#      80                 :   69060005 :         "mov    %3,%11;"
#      81                 :   69060005 :         "palignr $0x4,%%xmm6,%%xmm0;"
#      82                 :   69060005 :         "ror    $0x9,%11;"
#      83                 :   69060005 :         "xor    %k2,%10;"
#      84                 :   69060005 :         "mov    %7,%12;"
#      85                 :   69060005 :         "ror    $0x5,%10;"
#      86                 :   69060005 :         "movdqa %%xmm5,%%xmm1;"
#      87                 :   69060005 :         "xor    %3,%11;"
#      88                 :   69060005 :         "xor    %8,%12;"
#      89                 :   69060005 :         "paddd  %%xmm4,%%xmm0;"
#      90                 :   69060005 :         "xor    %k2,%10;"
#      91                 :   69060005 :         "and    %k2,%12;"
#      92                 :   69060005 :         "ror    $0xb,%11;"
#      93                 :   69060005 :         "palignr $0x4,%%xmm4,%%xmm1;"
#      94                 :   69060005 :         "xor    %3,%11;"
#      95                 :   69060005 :         "ror    $0x6,%10;"
#      96                 :   69060005 :         "xor    %8,%12;"
#      97                 :   69060005 :         "movdqa %%xmm1,%%xmm2;"
#      98                 :   69060005 :         "ror    $0x2,%11;"
#      99                 :   69060005 :         "add    %10,%12;"
#     100                 :   69060005 :         "add    %16,%12;"
#     101                 :   69060005 :         "movdqa %%xmm1,%%xmm3;"
#     102                 :   69060005 :         "mov    %3,%10;"
#     103                 :   69060005 :         "add    %12,%9;"
#     104                 :   69060005 :         "mov    %3,%12;"
#     105                 :   69060005 :         "pslld  $0x19,%%xmm1;"
#     106                 :   69060005 :         "or     %5,%10;"
#     107                 :   69060005 :         "add    %9,%6;"
#     108                 :   69060005 :         "and    %5,%12;"
#     109                 :   69060005 :         "psrld  $0x7,%%xmm2;"
#     110                 :   69060005 :         "and    %4,%10;"
#     111                 :   69060005 :         "add    %11,%9;"
#     112                 :   69060005 :         "por    %%xmm2,%%xmm1;"
#     113                 :   69060005 :         "or     %12,%10;"
#     114                 :   69060005 :         "add    %10,%9;"
#     115                 :   69060005 :         "movdqa %%xmm3,%%xmm2;"
#     116                 :   69060005 :         "mov    %6,%10;"
#     117                 :   69060005 :         "mov    %9,%11;"
#     118                 :   69060005 :         "movdqa %%xmm3,%%xmm8;"
#     119                 :   69060005 :         "ror    $0xe,%10;"
#     120                 :   69060005 :         "xor    %6,%10;"
#     121                 :   69060005 :         "mov    %k2,%12;"
#     122                 :   69060005 :         "ror    $0x9,%11;"
#     123                 :   69060005 :         "pslld  $0xe,%%xmm3;"
#     124                 :   69060005 :         "xor    %9,%11;"
#     125                 :   69060005 :         "ror    $0x5,%10;"
#     126                 :   69060005 :         "xor    %7,%12;"
#     127                 :   69060005 :         "psrld  $0x12,%%xmm2;"
#     128                 :   69060005 :         "ror    $0xb,%11;"
#     129                 :   69060005 :         "xor    %6,%10;"
#     130                 :   69060005 :         "and    %6,%12;"
#     131                 :   69060005 :         "ror    $0x6,%10;"
#     132                 :   69060005 :         "pxor   %%xmm3,%%xmm1;"
#     133                 :   69060005 :         "xor    %9,%11;"
#     134                 :   69060005 :         "xor    %7,%12;"
#     135                 :   69060005 :         "psrld  $0x3,%%xmm8;"
#     136                 :   69060005 :         "add    %10,%12;"
#     137                 :   69060005 :         "add    4+%16,%12;"
#     138                 :   69060005 :         "ror    $0x2,%11;"
#     139                 :   69060005 :         "pxor   %%xmm2,%%xmm1;"
#     140                 :   69060005 :         "mov    %9,%10;"
#     141                 :   69060005 :         "add    %12,%8;"
#     142                 :   69060005 :         "mov    %9,%12;"
#     143                 :   69060005 :         "pxor   %%xmm8,%%xmm1;"
#     144                 :   69060005 :         "or     %4,%10;"
#     145                 :   69060005 :         "add    %8,%5;"
#     146                 :   69060005 :         "and    %4,%12;"
#     147                 :   69060005 :         "pshufd $0xfa,%%xmm7,%%xmm2;"
#     148                 :   69060005 :         "and    %3,%10;"
#     149                 :   69060005 :         "add    %11,%8;"
#     150                 :   69060005 :         "paddd  %%xmm1,%%xmm0;"
#     151                 :   69060005 :         "or     %12,%10;"
#     152                 :   69060005 :         "add    %10,%8;"
#     153                 :   69060005 :         "movdqa %%xmm2,%%xmm3;"
#     154                 :   69060005 :         "mov    %5,%10;"
#     155                 :   69060005 :         "mov    %8,%11;"
#     156                 :   69060005 :         "ror    $0xe,%10;"
#     157                 :   69060005 :         "movdqa %%xmm2,%%xmm8;"
#     158                 :   69060005 :         "xor    %5,%10;"
#     159                 :   69060005 :         "ror    $0x9,%11;"
#     160                 :   69060005 :         "mov    %6,%12;"
#     161                 :   69060005 :         "xor    %8,%11;"
#     162                 :   69060005 :         "ror    $0x5,%10;"
#     163                 :   69060005 :         "psrlq  $0x11,%%xmm2;"
#     164                 :   69060005 :         "xor    %k2,%12;"
#     165                 :   69060005 :         "psrlq  $0x13,%%xmm3;"
#     166                 :   69060005 :         "xor    %5,%10;"
#     167                 :   69060005 :         "and    %5,%12;"
#     168                 :   69060005 :         "psrld  $0xa,%%xmm8;"
#     169                 :   69060005 :         "ror    $0xb,%11;"
#     170                 :   69060005 :         "xor    %8,%11;"
#     171                 :   69060005 :         "xor    %k2,%12;"
#     172                 :   69060005 :         "ror    $0x6,%10;"
#     173                 :   69060005 :         "pxor   %%xmm3,%%xmm2;"
#     174                 :   69060005 :         "add    %10,%12;"
#     175                 :   69060005 :         "ror    $0x2,%11;"
#     176                 :   69060005 :         "add    8+%16,%12;"
#     177                 :   69060005 :         "pxor   %%xmm2,%%xmm8;"
#     178                 :   69060005 :         "mov    %8,%10;"
#     179                 :   69060005 :         "add    %12,%7;"
#     180                 :   69060005 :         "mov    %8,%12;"
#     181                 :   69060005 :         "pshufb %%xmm10,%%xmm8;"
#     182                 :   69060005 :         "or     %3,%10;"
#     183                 :   69060005 :         "add    %7,%4;"
#     184                 :   69060005 :         "and    %3,%12;"
#     185                 :   69060005 :         "paddd  %%xmm8,%%xmm0;"
#     186                 :   69060005 :         "and    %9,%10;"
#     187                 :   69060005 :         "add    %11,%7;"
#     188                 :   69060005 :         "pshufd $0x50,%%xmm0,%%xmm2;"
#     189                 :   69060005 :         "or     %12,%10;"
#     190                 :   69060005 :         "add    %10,%7;"
#     191                 :   69060005 :         "movdqa %%xmm2,%%xmm3;"
#     192                 :   69060005 :         "mov    %4,%10;"
#     193                 :   69060005 :         "ror    $0xe,%10;"
#     194                 :   69060005 :         "mov    %7,%11;"
#     195                 :   69060005 :         "movdqa %%xmm2,%%xmm4;"
#     196                 :   69060005 :         "ror    $0x9,%11;"
#     197                 :   69060005 :         "xor    %4,%10;"
#     198                 :   69060005 :         "mov    %5,%12;"
#     199                 :   69060005 :         "ror    $0x5,%10;"
#     200                 :   69060005 :         "psrlq  $0x11,%%xmm2;"
#     201                 :   69060005 :         "xor    %7,%11;"
#     202                 :   69060005 :         "xor    %6,%12;"
#     203                 :   69060005 :         "psrlq  $0x13,%%xmm3;"
#     204                 :   69060005 :         "xor    %4,%10;"
#     205                 :   69060005 :         "and    %4,%12;"
#     206                 :   69060005 :         "ror    $0xb,%11;"
#     207                 :   69060005 :         "psrld  $0xa,%%xmm4;"
#     208                 :   69060005 :         "xor    %7,%11;"
#     209                 :   69060005 :         "ror    $0x6,%10;"
#     210                 :   69060005 :         "xor    %6,%12;"
#     211                 :   69060005 :         "pxor   %%xmm3,%%xmm2;"
#     212                 :   69060005 :         "ror    $0x2,%11;"
#     213                 :   69060005 :         "add    %10,%12;"
#     214                 :   69060005 :         "add    12+%16,%12;"
#     215                 :   69060005 :         "pxor   %%xmm2,%%xmm4;"
#     216                 :   69060005 :         "mov    %7,%10;"
#     217                 :   69060005 :         "add    %12,%k2;"
#     218                 :   69060005 :         "mov    %7,%12;"
#     219                 :   69060005 :         "pshufb %%xmm11,%%xmm4;"
#     220                 :   69060005 :         "or     %9,%10;"
#     221                 :   69060005 :         "add    %k2,%3;"
#     222                 :   69060005 :         "and    %9,%12;"
#     223                 :   69060005 :         "paddd  %%xmm0,%%xmm4;"
#     224                 :   69060005 :         "and    %8,%10;"
#     225                 :   69060005 :         "add    %11,%k2;"
#     226                 :   69060005 :         "or     %12,%10;"
#     227                 :   69060005 :         "add    %10,%k2;"
#     228                 :   69060005 :         "movdqa 0x10(%13),%%xmm9;"
#     229                 :   69060005 :         "paddd  %%xmm5,%%xmm9;"
#     230                 :   69060005 :         "movdqa %%xmm9,%16;"
#     231                 :   69060005 :         "movdqa %%xmm4,%%xmm0;"
#     232                 :   69060005 :         "mov    %3,%10;"
#     233                 :   69060005 :         "ror    $0xe,%10;"
#     234                 :   69060005 :         "mov    %k2,%11;"
#     235                 :   69060005 :         "palignr $0x4,%%xmm7,%%xmm0;"
#     236                 :   69060005 :         "ror    $0x9,%11;"
#     237                 :   69060005 :         "xor    %3,%10;"
#     238                 :   69060005 :         "mov    %4,%12;"
#     239                 :   69060005 :         "ror    $0x5,%10;"
#     240                 :   69060005 :         "movdqa %%xmm6,%%xmm1;"
#     241                 :   69060005 :         "xor    %k2,%11;"
#     242                 :   69060005 :         "xor    %5,%12;"
#     243                 :   69060005 :         "paddd  %%xmm5,%%xmm0;"
#     244                 :   69060005 :         "xor    %3,%10;"
#     245                 :   69060005 :         "and    %3,%12;"
#     246                 :   69060005 :         "ror    $0xb,%11;"
#     247                 :   69060005 :         "palignr $0x4,%%xmm5,%%xmm1;"
#     248                 :   69060005 :         "xor    %k2,%11;"
#     249                 :   69060005 :         "ror    $0x6,%10;"
#     250                 :   69060005 :         "xor    %5,%12;"
#     251                 :   69060005 :         "movdqa %%xmm1,%%xmm2;"
#     252                 :   69060005 :         "ror    $0x2,%11;"
#     253                 :   69060005 :         "add    %10,%12;"
#     254                 :   69060005 :         "add    %16,%12;"
#     255                 :   69060005 :         "movdqa %%xmm1,%%xmm3;"
#     256                 :   69060005 :         "mov    %k2,%10;"
#     257                 :   69060005 :         "add    %12,%6;"
#     258                 :   69060005 :         "mov    %k2,%12;"
#     259                 :   69060005 :         "pslld  $0x19,%%xmm1;"
#     260                 :   69060005 :         "or     %8,%10;"
#     261                 :   69060005 :         "add    %6,%9;"
#     262                 :   69060005 :         "and    %8,%12;"
#     263                 :   69060005 :         "psrld  $0x7,%%xmm2;"
#     264                 :   69060005 :         "and    %7,%10;"
#     265                 :   69060005 :         "add    %11,%6;"
#     266                 :   69060005 :         "por    %%xmm2,%%xmm1;"
#     267                 :   69060005 :         "or     %12,%10;"
#     268                 :   69060005 :         "add    %10,%6;"
#     269                 :   69060005 :         "movdqa %%xmm3,%%xmm2;"
#     270                 :   69060005 :         "mov    %9,%10;"
#     271                 :   69060005 :         "mov    %6,%11;"
#     272                 :   69060005 :         "movdqa %%xmm3,%%xmm8;"
#     273                 :   69060005 :         "ror    $0xe,%10;"
#     274                 :   69060005 :         "xor    %9,%10;"
#     275                 :   69060005 :         "mov    %3,%12;"
#     276                 :   69060005 :         "ror    $0x9,%11;"
#     277                 :   69060005 :         "pslld  $0xe,%%xmm3;"
#     278                 :   69060005 :         "xor    %6,%11;"
#     279                 :   69060005 :         "ror    $0x5,%10;"
#     280                 :   69060005 :         "xor    %4,%12;"
#     281                 :   69060005 :         "psrld  $0x12,%%xmm2;"
#     282                 :   69060005 :         "ror    $0xb,%11;"
#     283                 :   69060005 :         "xor    %9,%10;"
#     284                 :   69060005 :         "and    %9,%12;"
#     285                 :   69060005 :         "ror    $0x6,%10;"
#     286                 :   69060005 :         "pxor   %%xmm3,%%xmm1;"
#     287                 :   69060005 :         "xor    %6,%11;"
#     288                 :   69060005 :         "xor    %4,%12;"
#     289                 :   69060005 :         "psrld  $0x3,%%xmm8;"
#     290                 :   69060005 :         "add    %10,%12;"
#     291                 :   69060005 :         "add    4+%16,%12;"
#     292                 :   69060005 :         "ror    $0x2,%11;"
#     293                 :   69060005 :         "pxor   %%xmm2,%%xmm1;"
#     294                 :   69060005 :         "mov    %6,%10;"
#     295                 :   69060005 :         "add    %12,%5;"
#     296                 :   69060005 :         "mov    %6,%12;"
#     297                 :   69060005 :         "pxor   %%xmm8,%%xmm1;"
#     298                 :   69060005 :         "or     %7,%10;"
#     299                 :   69060005 :         "add    %5,%8;"
#     300                 :   69060005 :         "and    %7,%12;"
#     301                 :   69060005 :         "pshufd $0xfa,%%xmm4,%%xmm2;"
#     302                 :   69060005 :         "and    %k2,%10;"
#     303                 :   69060005 :         "add    %11,%5;"
#     304                 :   69060005 :         "paddd  %%xmm1,%%xmm0;"
#     305                 :   69060005 :         "or     %12,%10;"
#     306                 :   69060005 :         "add    %10,%5;"
#     307                 :   69060005 :         "movdqa %%xmm2,%%xmm3;"
#     308                 :   69060005 :         "mov    %8,%10;"
#     309                 :   69060005 :         "mov    %5,%11;"
#     310                 :   69060005 :         "ror    $0xe,%10;"
#     311                 :   69060005 :         "movdqa %%xmm2,%%xmm8;"
#     312                 :   69060005 :         "xor    %8,%10;"
#     313                 :   69060005 :         "ror    $0x9,%11;"
#     314                 :   69060005 :         "mov    %9,%12;"
#     315                 :   69060005 :         "xor    %5,%11;"
#     316                 :   69060005 :         "ror    $0x5,%10;"
#     317                 :   69060005 :         "psrlq  $0x11,%%xmm2;"
#     318                 :   69060005 :         "xor    %3,%12;"
#     319                 :   69060005 :         "psrlq  $0x13,%%xmm3;"
#     320                 :   69060005 :         "xor    %8,%10;"
#     321                 :   69060005 :         "and    %8,%12;"
#     322                 :   69060005 :         "psrld  $0xa,%%xmm8;"
#     323                 :   69060005 :         "ror    $0xb,%11;"
#     324                 :   69060005 :         "xor    %5,%11;"
#     325                 :   69060005 :         "xor    %3,%12;"
#     326                 :   69060005 :         "ror    $0x6,%10;"
#     327                 :   69060005 :         "pxor   %%xmm3,%%xmm2;"
#     328                 :   69060005 :         "add    %10,%12;"
#     329                 :   69060005 :         "ror    $0x2,%11;"
#     330                 :   69060005 :         "add    8+%16,%12;"
#     331                 :   69060005 :         "pxor   %%xmm2,%%xmm8;"
#     332                 :   69060005 :         "mov    %5,%10;"
#     333                 :   69060005 :         "add    %12,%4;"
#     334                 :   69060005 :         "mov    %5,%12;"
#     335                 :   69060005 :         "pshufb %%xmm10,%%xmm8;"
#     336                 :   69060005 :         "or     %k2,%10;"
#     337                 :   69060005 :         "add    %4,%7;"
#     338                 :   69060005 :         "and    %k2,%12;"
#     339                 :   69060005 :         "paddd  %%xmm8,%%xmm0;"
#     340                 :   69060005 :         "and    %6,%10;"
#     341                 :   69060005 :         "add    %11,%4;"
#     342                 :   69060005 :         "pshufd $0x50,%%xmm0,%%xmm2;"
#     343                 :   69060005 :         "or     %12,%10;"
#     344                 :   69060005 :         "add    %10,%4;"
#     345                 :   69060005 :         "movdqa %%xmm2,%%xmm3;"
#     346                 :   69060005 :         "mov    %7,%10;"
#     347                 :   69060005 :         "ror    $0xe,%10;"
#     348                 :   69060005 :         "mov    %4,%11;"
#     349                 :   69060005 :         "movdqa %%xmm2,%%xmm5;"
#     350                 :   69060005 :         "ror    $0x9,%11;"
#     351                 :   69060005 :         "xor    %7,%10;"
#     352                 :   69060005 :         "mov    %8,%12;"
#     353                 :   69060005 :         "ror    $0x5,%10;"
#     354                 :   69060005 :         "psrlq  $0x11,%%xmm2;"
#     355                 :   69060005 :         "xor    %4,%11;"
#     356                 :   69060005 :         "xor    %9,%12;"
#     357                 :   69060005 :         "psrlq  $0x13,%%xmm3;"
#     358                 :   69060005 :         "xor    %7,%10;"
#     359                 :   69060005 :         "and    %7,%12;"
#     360                 :   69060005 :         "ror    $0xb,%11;"
#     361                 :   69060005 :         "psrld  $0xa,%%xmm5;"
#     362                 :   69060005 :         "xor    %4,%11;"
#     363                 :   69060005 :         "ror    $0x6,%10;"
#     364                 :   69060005 :         "xor    %9,%12;"
#     365                 :   69060005 :         "pxor   %%xmm3,%%xmm2;"
#     366                 :   69060005 :         "ror    $0x2,%11;"
#     367                 :   69060005 :         "add    %10,%12;"
#     368                 :   69060005 :         "add    12+%16,%12;"
#     369                 :   69060005 :         "pxor   %%xmm2,%%xmm5;"
#     370                 :   69060005 :         "mov    %4,%10;"
#     371                 :   69060005 :         "add    %12,%3;"
#     372                 :   69060005 :         "mov    %4,%12;"
#     373                 :   69060005 :         "pshufb %%xmm11,%%xmm5;"
#     374                 :   69060005 :         "or     %6,%10;"
#     375                 :   69060005 :         "add    %3,%k2;"
#     376                 :   69060005 :         "and    %6,%12;"
#     377                 :   69060005 :         "paddd  %%xmm0,%%xmm5;"
#     378                 :   69060005 :         "and    %5,%10;"
#     379                 :   69060005 :         "add    %11,%3;"
#     380                 :   69060005 :         "or     %12,%10;"
#     381                 :   69060005 :         "add    %10,%3;"
#     382                 :   69060005 :         "movdqa 0x20(%13),%%xmm9;"
#     383                 :   69060005 :         "paddd  %%xmm6,%%xmm9;"
#     384                 :   69060005 :         "movdqa %%xmm9,%16;"
#     385                 :   69060005 :         "movdqa %%xmm5,%%xmm0;"
#     386                 :   69060005 :         "mov    %k2,%10;"
#     387                 :   69060005 :         "ror    $0xe,%10;"
#     388                 :   69060005 :         "mov    %3,%11;"
#     389                 :   69060005 :         "palignr $0x4,%%xmm4,%%xmm0;"
#     390                 :   69060005 :         "ror    $0x9,%11;"
#     391                 :   69060005 :         "xor    %k2,%10;"
#     392                 :   69060005 :         "mov    %7,%12;"
#     393                 :   69060005 :         "ror    $0x5,%10;"
#     394                 :   69060005 :         "movdqa %%xmm7,%%xmm1;"
#     395                 :   69060005 :         "xor    %3,%11;"
#     396                 :   69060005 :         "xor    %8,%12;"
#     397                 :   69060005 :         "paddd  %%xmm6,%%xmm0;"
#     398                 :   69060005 :         "xor    %k2,%10;"
#     399                 :   69060005 :         "and    %k2,%12;"
#     400                 :   69060005 :         "ror    $0xb,%11;"
#     401                 :   69060005 :         "palignr $0x4,%%xmm6,%%xmm1;"
#     402                 :   69060005 :         "xor    %3,%11;"
#     403                 :   69060005 :         "ror    $0x6,%10;"
#     404                 :   69060005 :         "xor    %8,%12;"
#     405                 :   69060005 :         "movdqa %%xmm1,%%xmm2;"
#     406                 :   69060005 :         "ror    $0x2,%11;"
#     407                 :   69060005 :         "add    %10,%12;"
#     408                 :   69060005 :         "add    %16,%12;"
#     409                 :   69060005 :         "movdqa %%xmm1,%%xmm3;"
#     410                 :   69060005 :         "mov    %3,%10;"
#     411                 :   69060005 :         "add    %12,%9;"
#     412                 :   69060005 :         "mov    %3,%12;"
#     413                 :   69060005 :         "pslld  $0x19,%%xmm1;"
#     414                 :   69060005 :         "or     %5,%10;"
#     415                 :   69060005 :         "add    %9,%6;"
#     416                 :   69060005 :         "and    %5,%12;"
#     417                 :   69060005 :         "psrld  $0x7,%%xmm2;"
#     418                 :   69060005 :         "and    %4,%10;"
#     419                 :   69060005 :         "add    %11,%9;"
#     420                 :   69060005 :         "por    %%xmm2,%%xmm1;"
#     421                 :   69060005 :         "or     %12,%10;"
#     422                 :   69060005 :         "add    %10,%9;"
#     423                 :   69060005 :         "movdqa %%xmm3,%%xmm2;"
#     424                 :   69060005 :         "mov    %6,%10;"
#     425                 :   69060005 :         "mov    %9,%11;"
#     426                 :   69060005 :         "movdqa %%xmm3,%%xmm8;"
#     427                 :   69060005 :         "ror    $0xe,%10;"
#     428                 :   69060005 :         "xor    %6,%10;"
#     429                 :   69060005 :         "mov    %k2,%12;"
#     430                 :   69060005 :         "ror    $0x9,%11;"
#     431                 :   69060005 :         "pslld  $0xe,%%xmm3;"
#     432                 :   69060005 :         "xor    %9,%11;"
#     433                 :   69060005 :         "ror    $0x5,%10;"
#     434                 :   69060005 :         "xor    %7,%12;"
#     435                 :   69060005 :         "psrld  $0x12,%%xmm2;"
#     436                 :   69060005 :         "ror    $0xb,%11;"
#     437                 :   69060005 :         "xor    %6,%10;"
#     438                 :   69060005 :         "and    %6,%12;"
#     439                 :   69060005 :         "ror    $0x6,%10;"
#     440                 :   69060005 :         "pxor   %%xmm3,%%xmm1;"
#     441                 :   69060005 :         "xor    %9,%11;"
#     442                 :   69060005 :         "xor    %7,%12;"
#     443                 :   69060005 :         "psrld  $0x3,%%xmm8;"
#     444                 :   69060005 :         "add    %10,%12;"
#     445                 :   69060005 :         "add    4+%16,%12;"
#     446                 :   69060005 :         "ror    $0x2,%11;"
#     447                 :   69060005 :         "pxor   %%xmm2,%%xmm1;"
#     448                 :   69060005 :         "mov    %9,%10;"
#     449                 :   69060005 :         "add    %12,%8;"
#     450                 :   69060005 :         "mov    %9,%12;"
#     451                 :   69060005 :         "pxor   %%xmm8,%%xmm1;"
#     452                 :   69060005 :         "or     %4,%10;"
#     453                 :   69060005 :         "add    %8,%5;"
#     454                 :   69060005 :         "and    %4,%12;"
#     455                 :   69060005 :         "pshufd $0xfa,%%xmm5,%%xmm2;"
#     456                 :   69060005 :         "and    %3,%10;"
#     457                 :   69060005 :         "add    %11,%8;"
#     458                 :   69060005 :         "paddd  %%xmm1,%%xmm0;"
#     459                 :   69060005 :         "or     %12,%10;"
#     460                 :   69060005 :         "add    %10,%8;"
#     461                 :   69060005 :         "movdqa %%xmm2,%%xmm3;"
#     462                 :   69060005 :         "mov    %5,%10;"
#     463                 :   69060005 :         "mov    %8,%11;"
#     464                 :   69060005 :         "ror    $0xe,%10;"
#     465                 :   69060005 :         "movdqa %%xmm2,%%xmm8;"
#     466                 :   69060005 :         "xor    %5,%10;"
#     467                 :   69060005 :         "ror    $0x9,%11;"
#     468                 :   69060005 :         "mov    %6,%12;"
#     469                 :   69060005 :         "xor    %8,%11;"
#     470                 :   69060005 :         "ror    $0x5,%10;"
#     471                 :   69060005 :         "psrlq  $0x11,%%xmm2;"
#     472                 :   69060005 :         "xor    %k2,%12;"
#     473                 :   69060005 :         "psrlq  $0x13,%%xmm3;"
#     474                 :   69060005 :         "xor    %5,%10;"
#     475                 :   69060005 :         "and    %5,%12;"
#     476                 :   69060005 :         "psrld  $0xa,%%xmm8;"
#     477                 :   69060005 :         "ror    $0xb,%11;"
#     478                 :   69060005 :         "xor    %8,%11;"
#     479                 :   69060005 :         "xor    %k2,%12;"
#     480                 :   69060005 :         "ror    $0x6,%10;"
#     481                 :   69060005 :         "pxor   %%xmm3,%%xmm2;"
#     482                 :   69060005 :         "add    %10,%12;"
#     483                 :   69060005 :         "ror    $0x2,%11;"
#     484                 :   69060005 :         "add    8+%16,%12;"
#     485                 :   69060005 :         "pxor   %%xmm2,%%xmm8;"
#     486                 :   69060005 :         "mov    %8,%10;"
#     487                 :   69060005 :         "add    %12,%7;"
#     488                 :   69060005 :         "mov    %8,%12;"
#     489                 :   69060005 :         "pshufb %%xmm10,%%xmm8;"
#     490                 :   69060005 :         "or     %3,%10;"
#     491                 :   69060005 :         "add    %7,%4;"
#     492                 :   69060005 :         "and    %3,%12;"
#     493                 :   69060005 :         "paddd  %%xmm8,%%xmm0;"
#     494                 :   69060005 :         "and    %9,%10;"
#     495                 :   69060005 :         "add    %11,%7;"
#     496                 :   69060005 :         "pshufd $0x50,%%xmm0,%%xmm2;"
#     497                 :   69060005 :         "or     %12,%10;"
#     498                 :   69060005 :         "add    %10,%7;"
#     499                 :   69060005 :         "movdqa %%xmm2,%%xmm3;"
#     500                 :   69060005 :         "mov    %4,%10;"
#     501                 :   69060005 :         "ror    $0xe,%10;"
#     502                 :   69060005 :         "mov    %7,%11;"
#     503                 :   69060005 :         "movdqa %%xmm2,%%xmm6;"
#     504                 :   69060005 :         "ror    $0x9,%11;"
#     505                 :   69060005 :         "xor    %4,%10;"
#     506                 :   69060005 :         "mov    %5,%12;"
#     507                 :   69060005 :         "ror    $0x5,%10;"
#     508                 :   69060005 :         "psrlq  $0x11,%%xmm2;"
#     509                 :   69060005 :         "xor    %7,%11;"
#     510                 :   69060005 :         "xor    %6,%12;"
#     511                 :   69060005 :         "psrlq  $0x13,%%xmm3;"
#     512                 :   69060005 :         "xor    %4,%10;"
#     513                 :   69060005 :         "and    %4,%12;"
#     514                 :   69060005 :         "ror    $0xb,%11;"
#     515                 :   69060005 :         "psrld  $0xa,%%xmm6;"
#     516                 :   69060005 :         "xor    %7,%11;"
#     517                 :   69060005 :         "ror    $0x6,%10;"
#     518                 :   69060005 :         "xor    %6,%12;"
#     519                 :   69060005 :         "pxor   %%xmm3,%%xmm2;"
#     520                 :   69060005 :         "ror    $0x2,%11;"
#     521                 :   69060005 :         "add    %10,%12;"
#     522                 :   69060005 :         "add    12+%16,%12;"
#     523                 :   69060005 :         "pxor   %%xmm2,%%xmm6;"
#     524                 :   69060005 :         "mov    %7,%10;"
#     525                 :   69060005 :         "add    %12,%k2;"
#     526                 :   69060005 :         "mov    %7,%12;"
#     527                 :   69060005 :         "pshufb %%xmm11,%%xmm6;"
#     528                 :   69060005 :         "or     %9,%10;"
#     529                 :   69060005 :         "add    %k2,%3;"
#     530                 :   69060005 :         "and    %9,%12;"
#     531                 :   69060005 :         "paddd  %%xmm0,%%xmm6;"
#     532                 :   69060005 :         "and    %8,%10;"
#     533                 :   69060005 :         "add    %11,%k2;"
#     534                 :   69060005 :         "or     %12,%10;"
#     535                 :   69060005 :         "add    %10,%k2;"
#     536                 :   69060005 :         "movdqa 0x30(%13),%%xmm9;"
#     537                 :   69060005 :         "paddd  %%xmm7,%%xmm9;"
#     538                 :   69060005 :         "movdqa %%xmm9,%16;"
#     539                 :   69060005 :         "add    $0x40,%13;"
#     540                 :   69060005 :         "movdqa %%xmm6,%%xmm0;"
#     541                 :   69060005 :         "mov    %3,%10;"
#     542                 :   69060005 :         "ror    $0xe,%10;"
#     543                 :   69060005 :         "mov    %k2,%11;"
#     544                 :   69060005 :         "palignr $0x4,%%xmm5,%%xmm0;"
#     545                 :   69060005 :         "ror    $0x9,%11;"
#     546                 :   69060005 :         "xor    %3,%10;"
#     547                 :   69060005 :         "mov    %4,%12;"
#     548                 :   69060005 :         "ror    $0x5,%10;"
#     549                 :   69060005 :         "movdqa %%xmm4,%%xmm1;"
#     550                 :   69060005 :         "xor    %k2,%11;"
#     551                 :   69060005 :         "xor    %5,%12;"
#     552                 :   69060005 :         "paddd  %%xmm7,%%xmm0;"
#     553                 :   69060005 :         "xor    %3,%10;"
#     554                 :   69060005 :         "and    %3,%12;"
#     555                 :   69060005 :         "ror    $0xb,%11;"
#     556                 :   69060005 :         "palignr $0x4,%%xmm7,%%xmm1;"
#     557                 :   69060005 :         "xor    %k2,%11;"
#     558                 :   69060005 :         "ror    $0x6,%10;"
#     559                 :   69060005 :         "xor    %5,%12;"
#     560                 :   69060005 :         "movdqa %%xmm1,%%xmm2;"
#     561                 :   69060005 :         "ror    $0x2,%11;"
#     562                 :   69060005 :         "add    %10,%12;"
#     563                 :   69060005 :         "add    %16,%12;"
#     564                 :   69060005 :         "movdqa %%xmm1,%%xmm3;"
#     565                 :   69060005 :         "mov    %k2,%10;"
#     566                 :   69060005 :         "add    %12,%6;"
#     567                 :   69060005 :         "mov    %k2,%12;"
#     568                 :   69060005 :         "pslld  $0x19,%%xmm1;"
#     569                 :   69060005 :         "or     %8,%10;"
#     570                 :   69060005 :         "add    %6,%9;"
#     571                 :   69060005 :         "and    %8,%12;"
#     572                 :   69060005 :         "psrld  $0x7,%%xmm2;"
#     573                 :   69060005 :         "and    %7,%10;"
#     574                 :   69060005 :         "add    %11,%6;"
#     575                 :   69060005 :         "por    %%xmm2,%%xmm1;"
#     576                 :   69060005 :         "or     %12,%10;"
#     577                 :   69060005 :         "add    %10,%6;"
#     578                 :   69060005 :         "movdqa %%xmm3,%%xmm2;"
#     579                 :   69060005 :         "mov    %9,%10;"
#     580                 :   69060005 :         "mov    %6,%11;"
#     581                 :   69060005 :         "movdqa %%xmm3,%%xmm8;"
#     582                 :   69060005 :         "ror    $0xe,%10;"
#     583                 :   69060005 :         "xor    %9,%10;"
#     584                 :   69060005 :         "mov    %3,%12;"
#     585                 :   69060005 :         "ror    $0x9,%11;"
#     586                 :   69060005 :         "pslld  $0xe,%%xmm3;"
#     587                 :   69060005 :         "xor    %6,%11;"
#     588                 :   69060005 :         "ror    $0x5,%10;"
#     589                 :   69060005 :         "xor    %4,%12;"
#     590                 :   69060005 :         "psrld  $0x12,%%xmm2;"
#     591                 :   69060005 :         "ror    $0xb,%11;"
#     592                 :   69060005 :         "xor    %9,%10;"
#     593                 :   69060005 :         "and    %9,%12;"
#     594                 :   69060005 :         "ror    $0x6,%10;"
#     595                 :   69060005 :         "pxor   %%xmm3,%%xmm1;"
#     596                 :   69060005 :         "xor    %6,%11;"
#     597                 :   69060005 :         "xor    %4,%12;"
#     598                 :   69060005 :         "psrld  $0x3,%%xmm8;"
#     599                 :   69060005 :         "add    %10,%12;"
#     600                 :   69060005 :         "add    4+%16,%12;"
#     601                 :   69060005 :         "ror    $0x2,%11;"
#     602                 :   69060005 :         "pxor   %%xmm2,%%xmm1;"
#     603                 :   69060005 :         "mov    %6,%10;"
#     604                 :   69060005 :         "add    %12,%5;"
#     605                 :   69060005 :         "mov    %6,%12;"
#     606                 :   69060005 :         "pxor   %%xmm8,%%xmm1;"
#     607                 :   69060005 :         "or     %7,%10;"
#     608                 :   69060005 :         "add    %5,%8;"
#     609                 :   69060005 :         "and    %7,%12;"
#     610                 :   69060005 :         "pshufd $0xfa,%%xmm6,%%xmm2;"
#     611                 :   69060005 :         "and    %k2,%10;"
#     612                 :   69060005 :         "add    %11,%5;"
#     613                 :   69060005 :         "paddd  %%xmm1,%%xmm0;"
#     614                 :   69060005 :         "or     %12,%10;"
#     615                 :   69060005 :         "add    %10,%5;"
#     616                 :   69060005 :         "movdqa %%xmm2,%%xmm3;"
#     617                 :   69060005 :         "mov    %8,%10;"
#     618                 :   69060005 :         "mov    %5,%11;"
#     619                 :   69060005 :         "ror    $0xe,%10;"
#     620                 :   69060005 :         "movdqa %%xmm2,%%xmm8;"
#     621                 :   69060005 :         "xor    %8,%10;"
#     622                 :   69060005 :         "ror    $0x9,%11;"
#     623                 :   69060005 :         "mov    %9,%12;"
#     624                 :   69060005 :         "xor    %5,%11;"
#     625                 :   69060005 :         "ror    $0x5,%10;"
#     626                 :   69060005 :         "psrlq  $0x11,%%xmm2;"
#     627                 :   69060005 :         "xor    %3,%12;"
#     628                 :   69060005 :         "psrlq  $0x13,%%xmm3;"
#     629                 :   69060005 :         "xor    %8,%10;"
#     630                 :   69060005 :         "and    %8,%12;"
#     631                 :   69060005 :         "psrld  $0xa,%%xmm8;"
#     632                 :   69060005 :         "ror    $0xb,%11;"
#     633                 :   69060005 :         "xor    %5,%11;"
#     634                 :   69060005 :         "xor    %3,%12;"
#     635                 :   69060005 :         "ror    $0x6,%10;"
#     636                 :   69060005 :         "pxor   %%xmm3,%%xmm2;"
#     637                 :   69060005 :         "add    %10,%12;"
#     638                 :   69060005 :         "ror    $0x2,%11;"
#     639                 :   69060005 :         "add    8+%16,%12;"
#     640                 :   69060005 :         "pxor   %%xmm2,%%xmm8;"
#     641                 :   69060005 :         "mov    %5,%10;"
#     642                 :   69060005 :         "add    %12,%4;"
#     643                 :   69060005 :         "mov    %5,%12;"
#     644                 :   69060005 :         "pshufb %%xmm10,%%xmm8;"
#     645                 :   69060005 :         "or     %k2,%10;"
#     646                 :   69060005 :         "add    %4,%7;"
#     647                 :   69060005 :         "and    %k2,%12;"
#     648                 :   69060005 :         "paddd  %%xmm8,%%xmm0;"
#     649                 :   69060005 :         "and    %6,%10;"
#     650                 :   69060005 :         "add    %11,%4;"
#     651                 :   69060005 :         "pshufd $0x50,%%xmm0,%%xmm2;"
#     652                 :   69060005 :         "or     %12,%10;"
#     653                 :   69060005 :         "add    %10,%4;"
#     654                 :   69060005 :         "movdqa %%xmm2,%%xmm3;"
#     655                 :   69060005 :         "mov    %7,%10;"
#     656                 :   69060005 :         "ror    $0xe,%10;"
#     657                 :   69060005 :         "mov    %4,%11;"
#     658                 :   69060005 :         "movdqa %%xmm2,%%xmm7;"
#     659                 :   69060005 :         "ror    $0x9,%11;"
#     660                 :   69060005 :         "xor    %7,%10;"
#     661                 :   69060005 :         "mov    %8,%12;"
#     662                 :   69060005 :         "ror    $0x5,%10;"
#     663                 :   69060005 :         "psrlq  $0x11,%%xmm2;"
#     664                 :   69060005 :         "xor    %4,%11;"
#     665                 :   69060005 :         "xor    %9,%12;"
#     666                 :   69060005 :         "psrlq  $0x13,%%xmm3;"
#     667                 :   69060005 :         "xor    %7,%10;"
#     668                 :   69060005 :         "and    %7,%12;"
#     669                 :   69060005 :         "ror    $0xb,%11;"
#     670                 :   69060005 :         "psrld  $0xa,%%xmm7;"
#     671                 :   69060005 :         "xor    %4,%11;"
#     672                 :   69060005 :         "ror    $0x6,%10;"
#     673                 :   69060005 :         "xor    %9,%12;"
#     674                 :   69060005 :         "pxor   %%xmm3,%%xmm2;"
#     675                 :   69060005 :         "ror    $0x2,%11;"
#     676                 :   69060005 :         "add    %10,%12;"
#     677                 :   69060005 :         "add    12+%16,%12;"
#     678                 :   69060005 :         "pxor   %%xmm2,%%xmm7;"
#     679                 :   69060005 :         "mov    %4,%10;"
#     680                 :   69060005 :         "add    %12,%3;"
#     681                 :   69060005 :         "mov    %4,%12;"
#     682                 :   69060005 :         "pshufb %%xmm11,%%xmm7;"
#     683                 :   69060005 :         "or     %6,%10;"
#     684                 :   69060005 :         "add    %3,%k2;"
#     685                 :   69060005 :         "and    %6,%12;"
#     686                 :   69060005 :         "paddd  %%xmm0,%%xmm7;"
#     687                 :   69060005 :         "and    %5,%10;"
#     688                 :   69060005 :         "add    %11,%3;"
#     689                 :   69060005 :         "or     %12,%10;"
#     690                 :   69060005 :         "add    %10,%3;"
#     691                 :   69060005 :         "sub    $0x1,%1;"
#     692                 :   69060005 :         "jne    Lloop1_%=;"
#     693                 :   69060005 :         "mov    $0x2,%1;"
#     694                 :            : 
#     695                 :   69060005 :         "Lloop2_%=:"
#     696                 :   69060005 :         "paddd  0x0(%13),%%xmm4;"
#     697                 :   69060005 :         "movdqa %%xmm4,%16;"
#     698                 :   69060005 :         "mov    %k2,%10;"
#     699                 :   69060005 :         "ror    $0xe,%10;"
#     700                 :   69060005 :         "mov    %3,%11;"
#     701                 :   69060005 :         "xor    %k2,%10;"
#     702                 :   69060005 :         "ror    $0x9,%11;"
#     703                 :   69060005 :         "mov    %7,%12;"
#     704                 :   69060005 :         "xor    %3,%11;"
#     705                 :   69060005 :         "ror    $0x5,%10;"
#     706                 :   69060005 :         "xor    %8,%12;"
#     707                 :   69060005 :         "xor    %k2,%10;"
#     708                 :   69060005 :         "ror    $0xb,%11;"
#     709                 :   69060005 :         "and    %k2,%12;"
#     710                 :   69060005 :         "xor    %3,%11;"
#     711                 :   69060005 :         "ror    $0x6,%10;"
#     712                 :   69060005 :         "xor    %8,%12;"
#     713                 :   69060005 :         "add    %10,%12;"
#     714                 :   69060005 :         "ror    $0x2,%11;"
#     715                 :   69060005 :         "add    %16,%12;"
#     716                 :   69060005 :         "mov    %3,%10;"
#     717                 :   69060005 :         "add    %12,%9;"
#     718                 :   69060005 :         "mov    %3,%12;"
#     719                 :   69060005 :         "or     %5,%10;"
#     720                 :   69060005 :         "add    %9,%6;"
#     721                 :   69060005 :         "and    %5,%12;"
#     722                 :   69060005 :         "and    %4,%10;"
#     723                 :   69060005 :         "add    %11,%9;"
#     724                 :   69060005 :         "or     %12,%10;"
#     725                 :   69060005 :         "add    %10,%9;"
#     726                 :   69060005 :         "mov    %6,%10;"
#     727                 :   69060005 :         "ror    $0xe,%10;"
#     728                 :   69060005 :         "mov    %9,%11;"
#     729                 :   69060005 :         "xor    %6,%10;"
#     730                 :   69060005 :         "ror    $0x9,%11;"
#     731                 :   69060005 :         "mov    %k2,%12;"
#     732                 :   69060005 :         "xor    %9,%11;"
#     733                 :   69060005 :         "ror    $0x5,%10;"
#     734                 :   69060005 :         "xor    %7,%12;"
#     735                 :   69060005 :         "xor    %6,%10;"
#     736                 :   69060005 :         "ror    $0xb,%11;"
#     737                 :   69060005 :         "and    %6,%12;"
#     738                 :   69060005 :         "xor    %9,%11;"
#     739                 :   69060005 :         "ror    $0x6,%10;"
#     740                 :   69060005 :         "xor    %7,%12;"
#     741                 :   69060005 :         "add    %10,%12;"
#     742                 :   69060005 :         "ror    $0x2,%11;"
#     743                 :   69060005 :         "add    4+%16,%12;"
#     744                 :   69060005 :         "mov    %9,%10;"
#     745                 :   69060005 :         "add    %12,%8;"
#     746                 :   69060005 :         "mov    %9,%12;"
#     747                 :   69060005 :         "or     %4,%10;"
#     748                 :   69060005 :         "add    %8,%5;"
#     749                 :   69060005 :         "and    %4,%12;"
#     750                 :   69060005 :         "and    %3,%10;"
#     751                 :   69060005 :         "add    %11,%8;"
#     752                 :   69060005 :         "or     %12,%10;"
#     753                 :   69060005 :         "add    %10,%8;"
#     754                 :   69060005 :         "mov    %5,%10;"
#     755                 :   69060005 :         "ror    $0xe,%10;"
#     756                 :   69060005 :         "mov    %8,%11;"
#     757                 :   69060005 :         "xor    %5,%10;"
#     758                 :   69060005 :         "ror    $0x9,%11;"
#     759                 :   69060005 :         "mov    %6,%12;"
#     760                 :   69060005 :         "xor    %8,%11;"
#     761                 :   69060005 :         "ror    $0x5,%10;"
#     762                 :   69060005 :         "xor    %k2,%12;"
#     763                 :   69060005 :         "xor    %5,%10;"
#     764                 :   69060005 :         "ror    $0xb,%11;"
#     765                 :   69060005 :         "and    %5,%12;"
#     766                 :   69060005 :         "xor    %8,%11;"
#     767                 :   69060005 :         "ror    $0x6,%10;"
#     768                 :   69060005 :         "xor    %k2,%12;"
#     769                 :   69060005 :         "add    %10,%12;"
#     770                 :   69060005 :         "ror    $0x2,%11;"
#     771                 :   69060005 :         "add    8+%16,%12;"
#     772                 :   69060005 :         "mov    %8,%10;"
#     773                 :   69060005 :         "add    %12,%7;"
#     774                 :   69060005 :         "mov    %8,%12;"
#     775                 :   69060005 :         "or     %3,%10;"
#     776                 :   69060005 :         "add    %7,%4;"
#     777                 :   69060005 :         "and    %3,%12;"
#     778                 :   69060005 :         "and    %9,%10;"
#     779                 :   69060005 :         "add    %11,%7;"
#     780                 :   69060005 :         "or     %12,%10;"
#     781                 :   69060005 :         "add    %10,%7;"
#     782                 :   69060005 :         "mov    %4,%10;"
#     783                 :   69060005 :         "ror    $0xe,%10;"
#     784                 :   69060005 :         "mov    %7,%11;"
#     785                 :   69060005 :         "xor    %4,%10;"
#     786                 :   69060005 :         "ror    $0x9,%11;"
#     787                 :   69060005 :         "mov    %5,%12;"
#     788                 :   69060005 :         "xor    %7,%11;"
#     789                 :   69060005 :         "ror    $0x5,%10;"
#     790                 :   69060005 :         "xor    %6,%12;"
#     791                 :   69060005 :         "xor    %4,%10;"
#     792                 :   69060005 :         "ror    $0xb,%11;"
#     793                 :   69060005 :         "and    %4,%12;"
#     794                 :   69060005 :         "xor    %7,%11;"
#     795                 :   69060005 :         "ror    $0x6,%10;"
#     796                 :   69060005 :         "xor    %6,%12;"
#     797                 :   69060005 :         "add    %10,%12;"
#     798                 :   69060005 :         "ror    $0x2,%11;"
#     799                 :   69060005 :         "add    12+%16,%12;"
#     800                 :   69060005 :         "mov    %7,%10;"
#     801                 :   69060005 :         "add    %12,%k2;"
#     802                 :   69060005 :         "mov    %7,%12;"
#     803                 :   69060005 :         "or     %9,%10;"
#     804                 :   69060005 :         "add    %k2,%3;"
#     805                 :   69060005 :         "and    %9,%12;"
#     806                 :   69060005 :         "and    %8,%10;"
#     807                 :   69060005 :         "add    %11,%k2;"
#     808                 :   69060005 :         "or     %12,%10;"
#     809                 :   69060005 :         "add    %10,%k2;"
#     810                 :   69060005 :         "paddd  0x10(%13),%%xmm5;"
#     811                 :   69060005 :         "movdqa %%xmm5,%16;"
#     812                 :   69060005 :         "add    $0x20,%13;"
#     813                 :   69060005 :         "mov    %3,%10;"
#     814                 :   69060005 :         "ror    $0xe,%10;"
#     815                 :   69060005 :         "mov    %k2,%11;"
#     816                 :   69060005 :         "xor    %3,%10;"
#     817                 :   69060005 :         "ror    $0x9,%11;"
#     818                 :   69060005 :         "mov    %4,%12;"
#     819                 :   69060005 :         "xor    %k2,%11;"
#     820                 :   69060005 :         "ror    $0x5,%10;"
#     821                 :   69060005 :         "xor    %5,%12;"
#     822                 :   69060005 :         "xor    %3,%10;"
#     823                 :   69060005 :         "ror    $0xb,%11;"
#     824                 :   69060005 :         "and    %3,%12;"
#     825                 :   69060005 :         "xor    %k2,%11;"
#     826                 :   69060005 :         "ror    $0x6,%10;"
#     827                 :   69060005 :         "xor    %5,%12;"
#     828                 :   69060005 :         "add    %10,%12;"
#     829                 :   69060005 :         "ror    $0x2,%11;"
#     830                 :   69060005 :         "add    %16,%12;"
#     831                 :   69060005 :         "mov    %k2,%10;"
#     832                 :   69060005 :         "add    %12,%6;"
#     833                 :   69060005 :         "mov    %k2,%12;"
#     834                 :   69060005 :         "or     %8,%10;"
#     835                 :   69060005 :         "add    %6,%9;"
#     836                 :   69060005 :         "and    %8,%12;"
#     837                 :   69060005 :         "and    %7,%10;"
#     838                 :   69060005 :         "add    %11,%6;"
#     839                 :   69060005 :         "or     %12,%10;"
#     840                 :   69060005 :         "add    %10,%6;"
#     841                 :   69060005 :         "mov    %9,%10;"
#     842                 :   69060005 :         "ror    $0xe,%10;"
#     843                 :   69060005 :         "mov    %6,%11;"
#     844                 :   69060005 :         "xor    %9,%10;"
#     845                 :   69060005 :         "ror    $0x9,%11;"
#     846                 :   69060005 :         "mov    %3,%12;"
#     847                 :   69060005 :         "xor    %6,%11;"
#     848                 :   69060005 :         "ror    $0x5,%10;"
#     849                 :   69060005 :         "xor    %4,%12;"
#     850                 :   69060005 :         "xor    %9,%10;"
#     851                 :   69060005 :         "ror    $0xb,%11;"
#     852                 :   69060005 :         "and    %9,%12;"
#     853                 :   69060005 :         "xor    %6,%11;"
#     854                 :   69060005 :         "ror    $0x6,%10;"
#     855                 :   69060005 :         "xor    %4,%12;"
#     856                 :   69060005 :         "add    %10,%12;"
#     857                 :   69060005 :         "ror    $0x2,%11;"
#     858                 :   69060005 :         "add    4+%16,%12;"
#     859                 :   69060005 :         "mov    %6,%10;"
#     860                 :   69060005 :         "add    %12,%5;"
#     861                 :   69060005 :         "mov    %6,%12;"
#     862                 :   69060005 :         "or     %7,%10;"
#     863                 :   69060005 :         "add    %5,%8;"
#     864                 :   69060005 :         "and    %7,%12;"
#     865                 :   69060005 :         "and    %k2,%10;"
#     866                 :   69060005 :         "add    %11,%5;"
#     867                 :   69060005 :         "or     %12,%10;"
#     868                 :   69060005 :         "add    %10,%5;"
#     869                 :   69060005 :         "mov    %8,%10;"
#     870                 :   69060005 :         "ror    $0xe,%10;"
#     871                 :   69060005 :         "mov    %5,%11;"
#     872                 :   69060005 :         "xor    %8,%10;"
#     873                 :   69060005 :         "ror    $0x9,%11;"
#     874                 :   69060005 :         "mov    %9,%12;"
#     875                 :   69060005 :         "xor    %5,%11;"
#     876                 :   69060005 :         "ror    $0x5,%10;"
#     877                 :   69060005 :         "xor    %3,%12;"
#     878                 :   69060005 :         "xor    %8,%10;"
#     879                 :   69060005 :         "ror    $0xb,%11;"
#     880                 :   69060005 :         "and    %8,%12;"
#     881                 :   69060005 :         "xor    %5,%11;"
#     882                 :   69060005 :         "ror    $0x6,%10;"
#     883                 :   69060005 :         "xor    %3,%12;"
#     884                 :   69060005 :         "add    %10,%12;"
#     885                 :   69060005 :         "ror    $0x2,%11;"
#     886                 :   69060005 :         "add    8+%16,%12;"
#     887                 :   69060005 :         "mov    %5,%10;"
#     888                 :   69060005 :         "add    %12,%4;"
#     889                 :   69060005 :         "mov    %5,%12;"
#     890                 :   69060005 :         "or     %k2,%10;"
#     891                 :   69060005 :         "add    %4,%7;"
#     892                 :   69060005 :         "and    %k2,%12;"
#     893                 :   69060005 :         "and    %6,%10;"
#     894                 :   69060005 :         "add    %11,%4;"
#     895                 :   69060005 :         "or     %12,%10;"
#     896                 :   69060005 :         "add    %10,%4;"
#     897                 :   69060005 :         "mov    %7,%10;"
#     898                 :   69060005 :         "ror    $0xe,%10;"
#     899                 :   69060005 :         "mov    %4,%11;"
#     900                 :   69060005 :         "xor    %7,%10;"
#     901                 :   69060005 :         "ror    $0x9,%11;"
#     902                 :   69060005 :         "mov    %8,%12;"
#     903                 :   69060005 :         "xor    %4,%11;"
#     904                 :   69060005 :         "ror    $0x5,%10;"
#     905                 :   69060005 :         "xor    %9,%12;"
#     906                 :   69060005 :         "xor    %7,%10;"
#     907                 :   69060005 :         "ror    $0xb,%11;"
#     908                 :   69060005 :         "and    %7,%12;"
#     909                 :   69060005 :         "xor    %4,%11;"
#     910                 :   69060005 :         "ror    $0x6,%10;"
#     911                 :   69060005 :         "xor    %9,%12;"
#     912                 :   69060005 :         "add    %10,%12;"
#     913                 :   69060005 :         "ror    $0x2,%11;"
#     914                 :   69060005 :         "add    12+%16,%12;"
#     915                 :   69060005 :         "mov    %4,%10;"
#     916                 :   69060005 :         "add    %12,%3;"
#     917                 :   69060005 :         "mov    %4,%12;"
#     918                 :   69060005 :         "or     %6,%10;"
#     919                 :   69060005 :         "add    %3,%k2;"
#     920                 :   69060005 :         "and    %6,%12;"
#     921                 :   69060005 :         "and    %5,%10;"
#     922                 :   69060005 :         "add    %11,%3;"
#     923                 :   69060005 :         "or     %12,%10;"
#     924                 :   69060005 :         "add    %10,%3;"
#     925                 :   69060005 :         "movdqa %%xmm6,%%xmm4;"
#     926                 :   69060005 :         "movdqa %%xmm7,%%xmm5;"
#     927                 :   69060005 :         "sub    $0x1,%1;"
#     928                 :   69060005 :         "jne    Lloop2_%=;"
#     929                 :   69060005 :         "add    (%0),%3;"
#     930                 :   69060005 :         "mov    %3,(%0);"
#     931                 :   69060005 :         "add    0x4(%0),%4;"
#     932                 :   69060005 :         "mov    %4,0x4(%0);"
#     933                 :   69060005 :         "add    0x8(%0),%5;"
#     934                 :   69060005 :         "mov    %5,0x8(%0);"
#     935                 :   69060005 :         "add    0xc(%0),%6;"
#     936                 :   69060005 :         "mov    %6,0xc(%0);"
#     937                 :   69060005 :         "add    0x10(%0),%k2;"
#     938                 :   69060005 :         "mov    %k2,0x10(%0);"
#     939                 :   69060005 :         "add    0x14(%0),%7;"
#     940                 :   69060005 :         "mov    %7,0x14(%0);"
#     941                 :   69060005 :         "add    0x18(%0),%8;"
#     942                 :   69060005 :         "mov    %8,0x18(%0);"
#     943                 :   69060005 :         "add    0x1c(%0),%9;"
#     944                 :   69060005 :         "mov    %9,0x1c(%0);"
#     945                 :   69060005 :         "mov    %15,%1;"
#     946                 :   69060005 :         "add    $0x40,%1;"
#     947                 :   69060005 :         "cmp    %14,%1;"
#     948                 :   69060005 :         "jne    Lloop0_%=;"
#     949                 :            : 
#     950                 :   69060005 :         "Ldone_hash_%=:"
#     951                 :            : 
#     952                 :   69060005 :         : "+r"(s), "+r"(chunk), "+r"(blocks), "=r"(a), "=r"(b), "=r"(c), "=r"(d), /* e = chunk */ "=r"(f), "=r"(g), "=r"(h), "=r"(y0), "=r"(y1), "=r"(y2), "=r"(tbl), "+m"(inp_end), "+m"(inp), "+m"(xfer)
#     953                 :   69060005 :         : "m"(K256), "m"(FLIP_MASK), "m"(SHUF_00BA), "m"(SHUF_DC00)
#     954                 :   69060005 :         : "cc", "memory", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "xmm8", "xmm9", "xmm10", "xmm11", "xmm12"
#     955                 :   69060005 :    );
#     956                 :   69060005 : }
#     957                 :            : }
#     958                 :            : 
#     959                 :            : /*
#     960                 :            : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#     961                 :            : ; Copyright (c) 2012, Intel Corporation 
#     962                 :            : ; 
#     963                 :            : ; All rights reserved. 
#     964                 :            : ; 
#     965                 :            : ; Redistribution and use in source and binary forms, with or without
#     966                 :            : ; modification, are permitted provided that the following conditions are
#     967                 :            : ; met: 
#     968                 :            : ; 
#     969                 :            : ; * Redistributions of source code must retain the above copyright
#     970                 :            : ;   notice, this list of conditions and the following disclaimer.  
#     971                 :            : ; 
#     972                 :            : ; * Redistributions in binary form must reproduce the above copyright
#     973                 :            : ;   notice, this list of conditions and the following disclaimer in the
#     974                 :            : ;   documentation and/or other materials provided with the
#     975                 :            : ;   distribution. 
#     976                 :            : ; 
#     977                 :            : ; * Neither the name of the Intel Corporation nor the names of its
#     978                 :            : ;   contributors may be used to endorse or promote products derived from
#     979                 :            : ;   this software without specific prior written permission. 
#     980                 :            : ; 
#     981                 :            : ; 
#     982                 :            : ; THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY
#     983                 :            : ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#     984                 :            : ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
#     985                 :            : ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR
#     986                 :            : ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
#     987                 :            : ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#     988                 :            : ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
#     989                 :            : ; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
#     990                 :            : ; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
#     991                 :            : ; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#     992                 :            : ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#     993                 :            : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#     994                 :            : ;
#     995                 :            : ; Example YASM command lines:
#     996                 :            : ; Windows:  yasm -Xvc -f x64 -rnasm -pnasm -o sha256_sse4.obj -g cv8 sha256_sse4.asm
#     997                 :            : ; Linux:    yasm -f x64 -f elf64 -X gnu -g dwarf2 -D LINUX -o sha256_sse4.o sha256_sse4.asm
#     998                 :            : ;
#     999                 :            : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#    1000                 :            : ;
#    1001                 :            : ; This code is described in an Intel White-Paper:
#    1002                 :            : ; "Fast SHA-256 Implementations on Intel Architecture Processors"
#    1003                 :            : ;
#    1004                 :            : ; To find it, surf to https://www.intel.com/p/en_US/embedded
#    1005                 :            : ; and search for that title.
#    1006                 :            : ; The paper is expected to be released roughly at the end of April, 2012
#    1007                 :            : ;
#    1008                 :            : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#    1009                 :            : ; This code schedules 1 blocks at a time, with 4 lanes per block
#    1010                 :            : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#    1011                 :            : 
#    1012                 :            : %define MOVDQ movdqu ;; assume buffers not aligned 
#    1013                 :            : 
#    1014                 :            : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Define Macros
#    1015                 :            : 
#    1016                 :            : ; addm [mem], reg
#    1017                 :            : ; Add reg to mem using reg-mem add and store
#    1018                 :            : %macro addm 2
#    1019                 :            :     add %2, %1
#    1020                 :            :     mov %1, %2
#    1021                 :            : %endm
#    1022                 :            : 
#    1023                 :            : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#    1024                 :            : 
#    1025                 :            : ; COPY_XMM_AND_BSWAP xmm, [mem], byte_flip_mask
#    1026                 :            : ; Load xmm with mem and byte swap each dword
#    1027                 :            : %macro COPY_XMM_AND_BSWAP 3
#    1028                 :            :     MOVDQ %1, %2
#    1029                 :            :     pshufb %1, %3
#    1030                 :            : %endmacro
#    1031                 :            : 
#    1032                 :            : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#    1033                 :            : 
#    1034                 :            : %define X0 xmm4
#    1035                 :            : %define X1 xmm5
#    1036                 :            : %define X2 xmm6
#    1037                 :            : %define X3 xmm7
#    1038                 :            : 
#    1039                 :            : %define XTMP0 xmm0
#    1040                 :            : %define XTMP1 xmm1
#    1041                 :            : %define XTMP2 xmm2
#    1042                 :            : %define XTMP3 xmm3
#    1043                 :            : %define XTMP4 xmm8
#    1044                 :            : %define XFER  xmm9
#    1045                 :            : 
#    1046                 :            : %define SHUF_00BA       xmm10 ; shuffle xBxA -> 00BA
#    1047                 :            : %define SHUF_DC00       xmm11 ; shuffle xDxC -> DC00
#    1048                 :            : %define BYTE_FLIP_MASK  xmm12
#    1049                 :            :     
#    1050                 :            : %ifdef LINUX
#    1051                 :            : %define NUM_BLKS rdx    ; 3rd arg
#    1052                 :            : %define CTX     rsi     ; 2nd arg
#    1053                 :            : %define INP     rdi     ; 1st arg
#    1054                 :            : 
#    1055                 :            : %define SRND    rdi     ; clobbers INP
#    1056                 :            : %define c       ecx
#    1057                 :            : %define d       r8d
#    1058                 :            : %define e       edx
#    1059                 :            : %else
#    1060                 :            : %define NUM_BLKS r8     ; 3rd arg
#    1061                 :            : %define CTX     rdx     ; 2nd arg
#    1062                 :            : %define INP     rcx     ; 1st arg
#    1063                 :            : 
#    1064                 :            : %define SRND    rcx     ; clobbers INP
#    1065                 :            : %define c       edi 
#    1066                 :            : %define d       esi 
#    1067                 :            : %define e       r8d
#    1068                 :            :     
#    1069                 :            : %endif
#    1070                 :            : %define TBL     rbp
#    1071                 :            : %define a eax
#    1072                 :            : %define b ebx
#    1073                 :            : 
#    1074                 :            : %define f r9d
#    1075                 :            : %define g r10d
#    1076                 :            : %define h r11d
#    1077                 :            : 
#    1078                 :            : %define y0 r13d
#    1079                 :            : %define y1 r14d
#    1080                 :            : %define y2 r15d
#    1081                 :            : 
#    1082                 :            : 
#    1083                 :            : 
#    1084                 :            : _INP_END_SIZE   equ 8
#    1085                 :            : _INP_SIZE       equ 8
#    1086                 :            : _XFER_SIZE      equ 8
#    1087                 :            : %ifdef LINUX
#    1088                 :            : _XMM_SAVE_SIZE  equ 0
#    1089                 :            : %else
#    1090                 :            : _XMM_SAVE_SIZE  equ 7*16
#    1091                 :            : %endif
#    1092                 :            : ; STACK_SIZE plus pushes must be an odd multiple of 8
#    1093                 :            : _ALIGN_SIZE     equ 8
#    1094                 :            : 
#    1095                 :            : _INP_END        equ 0
#    1096                 :            : _INP            equ _INP_END  + _INP_END_SIZE
#    1097                 :            : _XFER           equ _INP      + _INP_SIZE
#    1098                 :            : _XMM_SAVE       equ _XFER     + _XFER_SIZE + _ALIGN_SIZE
#    1099                 :            : STACK_SIZE      equ _XMM_SAVE + _XMM_SAVE_SIZE
#    1100                 :            : 
#    1101                 :            : ; rotate_Xs
#    1102                 :            : ; Rotate values of symbols X0...X3
#    1103                 :            : %macro rotate_Xs 0
#    1104                 :            : %xdefine X_ X0
#    1105                 :            : %xdefine X0 X1
#    1106                 :            : %xdefine X1 X2
#    1107                 :            : %xdefine X2 X3
#    1108                 :            : %xdefine X3 X_
#    1109                 :            : %endm
#    1110                 :            : 
#    1111                 :            : ; ROTATE_ARGS
#    1112                 :            : ; Rotate values of symbols a...h
#    1113                 :            : %macro ROTATE_ARGS 0
#    1114                 :            : %xdefine TMP_ h
#    1115                 :            : %xdefine h g
#    1116                 :            : %xdefine g f
#    1117                 :            : %xdefine f e
#    1118                 :            : %xdefine e d
#    1119                 :            : %xdefine d c
#    1120                 :            : %xdefine c b
#    1121                 :            : %xdefine b a
#    1122                 :            : %xdefine a TMP_
#    1123                 :            : %endm
#    1124                 :            : 
#    1125                 :            : %macro FOUR_ROUNDS_AND_SCHED 0
#    1126                 :            :         ;; compute s0 four at a time and s1 two at a time
#    1127                 :            :         ;; compute W[-16] + W[-7] 4 at a time
#    1128                 :            :         movdqa  XTMP0, X3
#    1129                 :            :     mov y0, e           ; y0 = e
#    1130                 :            :     ror y0, (25-11)     ; y0 = e >> (25-11)
#    1131                 :            :     mov y1, a           ; y1 = a
#    1132                 :            :         palignr XTMP0, X2, 4    ; XTMP0 = W[-7]
#    1133                 :            :     ror y1, (22-13)     ; y1 = a >> (22-13)
#    1134                 :            :     xor y0, e           ; y0 = e ^ (e >> (25-11))
#    1135                 :            :     mov y2, f           ; y2 = f
#    1136                 :            :     ror y0, (11-6)      ; y0 = (e >> (11-6)) ^ (e >> (25-6))
#    1137                 :            :         movdqa  XTMP1, X1
#    1138                 :            :     xor y1, a           ; y1 = a ^ (a >> (22-13)
#    1139                 :            :     xor y2, g           ; y2 = f^g
#    1140                 :            :         paddd   XTMP0, X0       ; XTMP0 = W[-7] + W[-16]
#    1141                 :            :     xor y0, e           ; y0 = e ^ (e >> (11-6)) ^ (e >> (25-6))
#    1142                 :            :     and y2, e           ; y2 = (f^g)&e
#    1143                 :            :     ror y1, (13-2)      ; y1 = (a >> (13-2)) ^ (a >> (22-2))
#    1144                 :            :         ;; compute s0
#    1145                 :            :         palignr XTMP1, X0, 4    ; XTMP1 = W[-15]
#    1146                 :            :     xor y1, a           ; y1 = a ^ (a >> (13-2)) ^ (a >> (22-2))
#    1147                 :            :     ror y0, 6           ; y0 = S1 = (e>>6) & (e>>11) ^ (e>>25)
#    1148                 :            :     xor y2, g           ; y2 = CH = ((f^g)&e)^g
#    1149                 :            :         movdqa  XTMP2, XTMP1    ; XTMP2 = W[-15]
#    1150                 :            :     ror y1, 2           ; y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22)
#    1151                 :            :     add y2, y0          ; y2 = S1 + CH
#    1152                 :            :     add y2, [rsp + _XFER + 0*4] ; y2 = k + w + S1 + CH
#    1153                 :            :         movdqa  XTMP3, XTMP1    ; XTMP3 = W[-15]
#    1154                 :            :     mov y0, a           ; y0 = a
#    1155                 :            :     add h, y2           ; h = h + S1 + CH + k + w
#    1156                 :            :     mov y2, a           ; y2 = a
#    1157                 :            :         pslld   XTMP1, (32-7)
#    1158                 :            :     or  y0, c           ; y0 = a|c
#    1159                 :            :     add d, h            ; d = d + h + S1 + CH + k + w
#    1160                 :            :     and y2, c           ; y2 = a&c
#    1161                 :            :         psrld   XTMP2, 7
#    1162                 :            :     and y0, b           ; y0 = (a|c)&b
#    1163                 :            :     add h, y1           ; h = h + S1 + CH + k + w + S0
#    1164                 :            :         por     XTMP1, XTMP2    ; XTMP1 = W[-15] ror 7
#    1165                 :            :     or  y0, y2          ; y0 = MAJ = (a|c)&b)|(a&c)
#    1166                 :            :     add h, y0           ; h = h + S1 + CH + k + w + S0 + MAJ
#    1167                 :            : 
#    1168                 :            : ROTATE_ARGS
#    1169                 :            :         movdqa  XTMP2, XTMP3    ; XTMP2 = W[-15]
#    1170                 :            :     mov y0, e           ; y0 = e
#    1171                 :            :     mov y1, a           ; y1 = a
#    1172                 :            :         movdqa  XTMP4, XTMP3    ; XTMP4 = W[-15]
#    1173                 :            :     ror y0, (25-11)     ; y0 = e >> (25-11)
#    1174                 :            :     xor y0, e           ; y0 = e ^ (e >> (25-11))
#    1175                 :            :     mov y2, f           ; y2 = f
#    1176                 :            :     ror y1, (22-13)     ; y1 = a >> (22-13)
#    1177                 :            :         pslld   XTMP3, (32-18)
#    1178                 :            :     xor y1, a           ; y1 = a ^ (a >> (22-13)
#    1179                 :            :     ror y0, (11-6)      ; y0 = (e >> (11-6)) ^ (e >> (25-6))
#    1180                 :            :     xor y2, g           ; y2 = f^g
#    1181                 :            :         psrld   XTMP2, 18
#    1182                 :            :     ror y1, (13-2)      ; y1 = (a >> (13-2)) ^ (a >> (22-2))
#    1183                 :            :     xor y0, e           ; y0 = e ^ (e >> (11-6)) ^ (e >> (25-6))
#    1184                 :            :     and y2, e           ; y2 = (f^g)&e
#    1185                 :            :     ror y0, 6           ; y0 = S1 = (e>>6) & (e>>11) ^ (e>>25)
#    1186                 :            :         pxor    XTMP1, XTMP3
#    1187                 :            :     xor y1, a           ; y1 = a ^ (a >> (13-2)) ^ (a >> (22-2))
#    1188                 :            :     xor y2, g           ; y2 = CH = ((f^g)&e)^g
#    1189                 :            :         psrld   XTMP4, 3        ; XTMP4 = W[-15] >> 3
#    1190                 :            :     add y2, y0          ; y2 = S1 + CH
#    1191                 :            :     add y2, [rsp + _XFER + 1*4] ; y2 = k + w + S1 + CH
#    1192                 :            :     ror y1, 2           ; y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22)
#    1193                 :            :         pxor    XTMP1, XTMP2    ; XTMP1 = W[-15] ror 7 ^ W[-15] ror 18
#    1194                 :            :     mov y0, a           ; y0 = a
#    1195                 :            :     add h, y2           ; h = h + S1 + CH + k + w
#    1196                 :            :     mov y2, a           ; y2 = a
#    1197                 :            :         pxor    XTMP1, XTMP4    ; XTMP1 = s0
#    1198                 :            :     or  y0, c           ; y0 = a|c
#    1199                 :            :     add d, h            ; d = d + h + S1 + CH + k + w
#    1200                 :            :     and y2, c           ; y2 = a&c
#    1201                 :            :         ;; compute low s1
#    1202                 :            :         pshufd  XTMP2, X3, 11111010b    ; XTMP2 = W[-2] {BBAA}
#    1203                 :            :     and y0, b           ; y0 = (a|c)&b
#    1204                 :            :     add h, y1           ; h = h + S1 + CH + k + w + S0
#    1205                 :            :         paddd   XTMP0, XTMP1    ; XTMP0 = W[-16] + W[-7] + s0
#    1206                 :            :     or  y0, y2          ; y0 = MAJ = (a|c)&b)|(a&c)
#    1207                 :            :     add h, y0           ; h = h + S1 + CH + k + w + S0 + MAJ
#    1208                 :            : 
#    1209                 :            : ROTATE_ARGS
#    1210                 :            :         movdqa  XTMP3, XTMP2    ; XTMP3 = W[-2] {BBAA}
#    1211                 :            :     mov y0, e           ; y0 = e
#    1212                 :            :     mov y1, a           ; y1 = a
#    1213                 :            :     ror y0, (25-11)     ; y0 = e >> (25-11)
#    1214                 :            :         movdqa  XTMP4, XTMP2    ; XTMP4 = W[-2] {BBAA}
#    1215                 :            :     xor y0, e           ; y0 = e ^ (e >> (25-11))
#    1216                 :            :     ror y1, (22-13)     ; y1 = a >> (22-13)
#    1217                 :            :     mov y2, f           ; y2 = f
#    1218                 :            :     xor y1, a           ; y1 = a ^ (a >> (22-13)
#    1219                 :            :     ror y0, (11-6)      ; y0 = (e >> (11-6)) ^ (e >> (25-6))
#    1220                 :            :         psrlq   XTMP2, 17       ; XTMP2 = W[-2] ror 17 {xBxA}
#    1221                 :            :     xor y2, g           ; y2 = f^g
#    1222                 :            :         psrlq   XTMP3, 19       ; XTMP3 = W[-2] ror 19 {xBxA}
#    1223                 :            :     xor y0, e           ; y0 = e ^ (e >> (11-6)) ^ (e >> (25-6))
#    1224                 :            :     and y2, e           ; y2 = (f^g)&e
#    1225                 :            :         psrld   XTMP4, 10       ; XTMP4 = W[-2] >> 10 {BBAA}
#    1226                 :            :     ror y1, (13-2)      ; y1 = (a >> (13-2)) ^ (a >> (22-2))
#    1227                 :            :     xor y1, a           ; y1 = a ^ (a >> (13-2)) ^ (a >> (22-2))
#    1228                 :            :     xor y2, g           ; y2 = CH = ((f^g)&e)^g
#    1229                 :            :     ror y0, 6           ; y0 = S1 = (e>>6) & (e>>11) ^ (e>>25)
#    1230                 :            :         pxor    XTMP2, XTMP3
#    1231                 :            :     add y2, y0          ; y2 = S1 + CH
#    1232                 :            :     ror y1, 2           ; y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22)
#    1233                 :            :     add y2, [rsp + _XFER + 2*4] ; y2 = k + w + S1 + CH
#    1234                 :            :         pxor    XTMP4, XTMP2    ; XTMP4 = s1 {xBxA}
#    1235                 :            :     mov y0, a           ; y0 = a
#    1236                 :            :     add h, y2           ; h = h + S1 + CH + k + w
#    1237                 :            :     mov y2, a           ; y2 = a
#    1238                 :            :         pshufb  XTMP4, SHUF_00BA        ; XTMP4 = s1 {00BA}
#    1239                 :            :     or  y0, c           ; y0 = a|c
#    1240                 :            :     add d, h            ; d = d + h + S1 + CH + k + w
#    1241                 :            :     and y2, c           ; y2 = a&c
#    1242                 :            :         paddd   XTMP0, XTMP4    ; XTMP0 = {..., ..., W[1], W[0]}
#    1243                 :            :     and y0, b           ; y0 = (a|c)&b
#    1244                 :            :     add h, y1           ; h = h + S1 + CH + k + w + S0
#    1245                 :            :         ;; compute high s1
#    1246                 :            :         pshufd  XTMP2, XTMP0, 01010000b ; XTMP2 = W[-2] {DDCC}
#    1247                 :            :     or  y0, y2          ; y0 = MAJ = (a|c)&b)|(a&c)
#    1248                 :            :     add h, y0           ; h = h + S1 + CH + k + w + S0 + MAJ
#    1249                 :            : 
#    1250                 :            : ROTATE_ARGS
#    1251                 :            :         movdqa  XTMP3, XTMP2    ; XTMP3 = W[-2] {DDCC}
#    1252                 :            :     mov y0, e           ; y0 = e
#    1253                 :            :     ror y0, (25-11)     ; y0 = e >> (25-11)
#    1254                 :            :     mov y1, a           ; y1 = a
#    1255                 :            :         movdqa  X0,    XTMP2    ; X0    = W[-2] {DDCC}
#    1256                 :            :     ror y1, (22-13)     ; y1 = a >> (22-13)
#    1257                 :            :     xor y0, e           ; y0 = e ^ (e >> (25-11))
#    1258                 :            :     mov y2, f           ; y2 = f
#    1259                 :            :     ror y0, (11-6)      ; y0 = (e >> (11-6)) ^ (e >> (25-6))
#    1260                 :            :         psrlq   XTMP2, 17       ; XTMP2 = W[-2] ror 17 {xDxC}
#    1261                 :            :     xor y1, a           ; y1 = a ^ (a >> (22-13)
#    1262                 :            :     xor y2, g           ; y2 = f^g
#    1263                 :            :         psrlq   XTMP3, 19       ; XTMP3 = W[-2] ror 19 {xDxC}
#    1264                 :            :     xor y0, e           ; y0 = e ^ (e >> (11-6)) ^ (e >> (25-6))
#    1265                 :            :     and y2, e           ; y2 = (f^g)&e
#    1266                 :            :     ror y1, (13-2)      ; y1 = (a >> (13-2)) ^ (a >> (22-2))
#    1267                 :            :         psrld   X0,    10       ; X0 = W[-2] >> 10 {DDCC}
#    1268                 :            :     xor y1, a           ; y1 = a ^ (a >> (13-2)) ^ (a >> (22-2))
#    1269                 :            :     ror y0, 6           ; y0 = S1 = (e>>6) & (e>>11) ^ (e>>25)
#    1270                 :            :     xor y2, g           ; y2 = CH = ((f^g)&e)^g
#    1271                 :            :         pxor    XTMP2, XTMP3
#    1272                 :            :     ror y1, 2           ; y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22)
#    1273                 :            :     add y2, y0          ; y2 = S1 + CH
#    1274                 :            :     add y2, [rsp + _XFER + 3*4] ; y2 = k + w + S1 + CH
#    1275                 :            :         pxor    X0, XTMP2       ; X0 = s1 {xDxC}
#    1276                 :            :     mov y0, a           ; y0 = a
#    1277                 :            :     add h, y2           ; h = h + S1 + CH + k + w
#    1278                 :            :     mov y2, a           ; y2 = a
#    1279                 :            :         pshufb  X0, SHUF_DC00   ; X0 = s1 {DC00}
#    1280                 :            :     or  y0, c           ; y0 = a|c
#    1281                 :            :     add d, h            ; d = d + h + S1 + CH + k + w
#    1282                 :            :     and y2, c           ; y2 = a&c
#    1283                 :            :         paddd   X0, XTMP0       ; X0 = {W[3], W[2], W[1], W[0]}
#    1284                 :            :     and y0, b           ; y0 = (a|c)&b
#    1285                 :            :     add h, y1           ; h = h + S1 + CH + k + w + S0
#    1286                 :            :     or  y0, y2          ; y0 = MAJ = (a|c)&b)|(a&c)
#    1287                 :            :     add h, y0           ; h = h + S1 + CH + k + w + S0 + MAJ
#    1288                 :            : 
#    1289                 :            : ROTATE_ARGS
#    1290                 :            : rotate_Xs
#    1291                 :            : %endm
#    1292                 :            : 
#    1293                 :            : ;; input is [rsp + _XFER + %1 * 4]
#    1294                 :            : %macro DO_ROUND 1
#    1295                 :            :     mov y0, e           ; y0 = e
#    1296                 :            :     ror y0, (25-11)     ; y0 = e >> (25-11)
#    1297                 :            :     mov y1, a           ; y1 = a
#    1298                 :            :     xor y0, e           ; y0 = e ^ (e >> (25-11))
#    1299                 :            :     ror y1, (22-13)     ; y1 = a >> (22-13)
#    1300                 :            :     mov y2, f           ; y2 = f
#    1301                 :            :     xor y1, a           ; y1 = a ^ (a >> (22-13)
#    1302                 :            :     ror y0, (11-6)      ; y0 = (e >> (11-6)) ^ (e >> (25-6))
#    1303                 :            :     xor y2, g           ; y2 = f^g
#    1304                 :            :     xor y0, e           ; y0 = e ^ (e >> (11-6)) ^ (e >> (25-6))
#    1305                 :            :     ror y1, (13-2)      ; y1 = (a >> (13-2)) ^ (a >> (22-2))
#    1306                 :            :     and y2, e           ; y2 = (f^g)&e
#    1307                 :            :     xor y1, a           ; y1 = a ^ (a >> (13-2)) ^ (a >> (22-2))
#    1308                 :            :     ror y0, 6           ; y0 = S1 = (e>>6) & (e>>11) ^ (e>>25)
#    1309                 :            :     xor y2, g           ; y2 = CH = ((f^g)&e)^g
#    1310                 :            :     add y2, y0          ; y2 = S1 + CH
#    1311                 :            :     ror y1, 2           ; y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22)
#    1312                 :            :     add y2, [rsp + _XFER + %1 * 4]      ; y2 = k + w + S1 + CH
#    1313                 :            :     mov y0, a           ; y0 = a
#    1314                 :            :     add h, y2           ; h = h + S1 + CH + k + w
#    1315                 :            :     mov y2, a           ; y2 = a
#    1316                 :            :     or  y0, c           ; y0 = a|c
#    1317                 :            :     add d, h            ; d = d + h + S1 + CH + k + w
#    1318                 :            :     and y2, c           ; y2 = a&c
#    1319                 :            :     and y0, b           ; y0 = (a|c)&b
#    1320                 :            :     add h, y1           ; h = h + S1 + CH + k + w + S0
#    1321                 :            :     or  y0, y2          ; y0 = MAJ = (a|c)&b)|(a&c)
#    1322                 :            :     add h, y0           ; h = h + S1 + CH + k + w + S0 + MAJ
#    1323                 :            :     ROTATE_ARGS
#    1324                 :            : %endm
#    1325                 :            : 
#    1326                 :            : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#    1327                 :            : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#    1328                 :            : ;; void sha256_sse4(void *input_data, UINT32 digest[8], UINT64 num_blks)
#    1329                 :            : ;; arg 1 : pointer to input data
#    1330                 :            : ;; arg 2 : pointer to digest
#    1331                 :            : ;; arg 3 : Num blocks
#    1332                 :            : section .text
#    1333                 :            : global sha256_sse4
#    1334                 :            : align 32
#    1335                 :            : sha256_sse4:
#    1336                 :            :     push        rbx
#    1337                 :            : %ifndef LINUX
#    1338                 :            :     push        rsi
#    1339                 :            :     push        rdi
#    1340                 :            : %endif
#    1341                 :            :     push        rbp
#    1342                 :            :     push        r13
#    1343                 :            :     push        r14
#    1344                 :            :     push        r15
#    1345                 :            : 
#    1346                 :            :     sub rsp,STACK_SIZE
#    1347                 :            : %ifndef LINUX
#    1348                 :            :     movdqa      [rsp + _XMM_SAVE + 0*16],xmm6   
#    1349                 :            :     movdqa      [rsp + _XMM_SAVE + 1*16],xmm7
#    1350                 :            :     movdqa      [rsp + _XMM_SAVE + 2*16],xmm8   
#    1351                 :            :     movdqa      [rsp + _XMM_SAVE + 3*16],xmm9   
#    1352                 :            :     movdqa      [rsp + _XMM_SAVE + 4*16],xmm10
#    1353                 :            :     movdqa      [rsp + _XMM_SAVE + 5*16],xmm11
#    1354                 :            :     movdqa      [rsp + _XMM_SAVE + 6*16],xmm12
#    1355                 :            : %endif
#    1356                 :            : 
#    1357                 :            :     shl NUM_BLKS, 6     ; convert to bytes
#    1358                 :            :     jz  done_hash
#    1359                 :            :     add NUM_BLKS, INP   ; pointer to end of data
#    1360                 :            :     mov [rsp + _INP_END], NUM_BLKS
#    1361                 :            : 
#    1362                 :            :     ;; load initial digest
#    1363                 :            :     mov a,[4*0 + CTX]
#    1364                 :            :     mov b,[4*1 + CTX]
#    1365                 :            :     mov c,[4*2 + CTX]
#    1366                 :            :     mov d,[4*3 + CTX]
#    1367                 :            :     mov e,[4*4 + CTX]
#    1368                 :            :     mov f,[4*5 + CTX]
#    1369                 :            :     mov g,[4*6 + CTX]
#    1370                 :            :     mov h,[4*7 + CTX]
#    1371                 :            : 
#    1372                 :            :     movdqa      BYTE_FLIP_MASK, [PSHUFFLE_BYTE_FLIP_MASK wrt rip]
#    1373                 :            :     movdqa      SHUF_00BA, [_SHUF_00BA wrt rip]
#    1374                 :            :     movdqa      SHUF_DC00, [_SHUF_DC00 wrt rip]
#    1375                 :            : 
#    1376                 :            : loop0:
#    1377                 :            :     lea TBL,[K256 wrt rip]
#    1378                 :            : 
#    1379                 :            :     ;; byte swap first 16 dwords
#    1380                 :            :     COPY_XMM_AND_BSWAP  X0, [INP + 0*16], BYTE_FLIP_MASK
#    1381                 :            :     COPY_XMM_AND_BSWAP  X1, [INP + 1*16], BYTE_FLIP_MASK
#    1382                 :            :     COPY_XMM_AND_BSWAP  X2, [INP + 2*16], BYTE_FLIP_MASK
#    1383                 :            :     COPY_XMM_AND_BSWAP  X3, [INP + 3*16], BYTE_FLIP_MASK
#    1384                 :            :     
#    1385                 :            :     mov [rsp + _INP], INP
#    1386                 :            : 
#    1387                 :            :     ;; schedule 48 input dwords, by doing 3 rounds of 16 each
#    1388                 :            :     mov SRND, 3
#    1389                 :            : align 16
#    1390                 :            : loop1:
#    1391                 :            :     movdqa      XFER, [TBL + 0*16]
#    1392                 :            :     paddd       XFER, X0
#    1393                 :            :     movdqa      [rsp + _XFER], XFER
#    1394                 :            :     FOUR_ROUNDS_AND_SCHED
#    1395                 :            : 
#    1396                 :            :     movdqa      XFER, [TBL + 1*16]
#    1397                 :            :     paddd       XFER, X0
#    1398                 :            :     movdqa      [rsp + _XFER], XFER
#    1399                 :            :     FOUR_ROUNDS_AND_SCHED
#    1400                 :            : 
#    1401                 :            :     movdqa      XFER, [TBL + 2*16]
#    1402                 :            :     paddd       XFER, X0
#    1403                 :            :     movdqa      [rsp + _XFER], XFER
#    1404                 :            :     FOUR_ROUNDS_AND_SCHED
#    1405                 :            : 
#    1406                 :            :     movdqa      XFER, [TBL + 3*16]
#    1407                 :            :     paddd       XFER, X0
#    1408                 :            :     movdqa      [rsp + _XFER], XFER
#    1409                 :            :     add TBL, 4*16
#    1410                 :            :     FOUR_ROUNDS_AND_SCHED
#    1411                 :            : 
#    1412                 :            :     sub SRND, 1
#    1413                 :            :     jne loop1
#    1414                 :            : 
#    1415                 :            :     mov SRND, 2
#    1416                 :            : loop2:
#    1417                 :            :     paddd       X0, [TBL + 0*16]
#    1418                 :            :     movdqa      [rsp + _XFER], X0
#    1419                 :            :     DO_ROUND    0
#    1420                 :            :     DO_ROUND    1
#    1421                 :            :     DO_ROUND    2
#    1422                 :            :     DO_ROUND    3
#    1423                 :            :     paddd       X1, [TBL + 1*16]
#    1424                 :            :     movdqa      [rsp + _XFER], X1
#    1425                 :            :     add TBL, 2*16
#    1426                 :            :     DO_ROUND    0
#    1427                 :            :     DO_ROUND    1
#    1428                 :            :     DO_ROUND    2
#    1429                 :            :     DO_ROUND    3
#    1430                 :            : 
#    1431                 :            :     movdqa      X0, X2
#    1432                 :            :     movdqa      X1, X3
#    1433                 :            : 
#    1434                 :            :     sub SRND, 1
#    1435                 :            :     jne loop2
#    1436                 :            : 
#    1437                 :            :     addm        [4*0 + CTX],a
#    1438                 :            :     addm        [4*1 + CTX],b
#    1439                 :            :     addm        [4*2 + CTX],c
#    1440                 :            :     addm        [4*3 + CTX],d
#    1441                 :            :     addm        [4*4 + CTX],e
#    1442                 :            :     addm        [4*5 + CTX],f
#    1443                 :            :     addm        [4*6 + CTX],g
#    1444                 :            :     addm        [4*7 + CTX],h
#    1445                 :            : 
#    1446                 :            :     mov INP, [rsp + _INP]
#    1447                 :            :     add INP, 64
#    1448                 :            :     cmp INP, [rsp + _INP_END]
#    1449                 :            :     jne loop0
#    1450                 :            : 
#    1451                 :            : done_hash:
#    1452                 :            : %ifndef LINUX
#    1453                 :            :     movdqa      xmm6,[rsp + _XMM_SAVE + 0*16]
#    1454                 :            :     movdqa      xmm7,[rsp + _XMM_SAVE + 1*16]
#    1455                 :            :     movdqa      xmm8,[rsp + _XMM_SAVE + 2*16]
#    1456                 :            :     movdqa      xmm9,[rsp + _XMM_SAVE + 3*16]
#    1457                 :            :     movdqa      xmm10,[rsp + _XMM_SAVE + 4*16]
#    1458                 :            :     movdqa      xmm11,[rsp + _XMM_SAVE + 5*16]
#    1459                 :            :     movdqa      xmm12,[rsp + _XMM_SAVE + 6*16]
#    1460                 :            : %endif
#    1461                 :            : 
#    1462                 :            :     add rsp, STACK_SIZE
#    1463                 :            : 
#    1464                 :            :     pop r15
#    1465                 :            :     pop r14
#    1466                 :            :     pop r13
#    1467                 :            :     pop rbp
#    1468                 :            : %ifndef LINUX
#    1469                 :            :     pop rdi
#    1470                 :            :     pop rsi
#    1471                 :            : %endif
#    1472                 :            :     pop rbx
#    1473                 :            : 
#    1474                 :            :     ret 
#    1475                 :            :     
#    1476                 :            : 
#    1477                 :            : section .data
#    1478                 :            : align 64
#    1479                 :            : K256:
#    1480                 :            :     dd  0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
#    1481                 :            :     dd  0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
#    1482                 :            :     dd  0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
#    1483                 :            :     dd  0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
#    1484                 :            :     dd  0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
#    1485                 :            :     dd  0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
#    1486                 :            :     dd  0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
#    1487                 :            :     dd  0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
#    1488                 :            :     dd  0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
#    1489                 :            :     dd  0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
#    1490                 :            :     dd  0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
#    1491                 :            :     dd  0xd192e819,0xd6990624,0xf40e3585,0x106aa070
#    1492                 :            :     dd  0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
#    1493                 :            :     dd  0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
#    1494                 :            :     dd  0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
#    1495                 :            :     dd  0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
#    1496                 :            : 
#    1497                 :            : PSHUFFLE_BYTE_FLIP_MASK: ddq 0x0c0d0e0f08090a0b0405060700010203
#    1498                 :            : 
#    1499                 :            : ; shuffle xBxA -> 00BA
#    1500                 :            : _SHUF_00BA:              ddq 0xFFFFFFFFFFFFFFFF0b0a090803020100
#    1501                 :            : 
#    1502                 :            : ; shuffle xDxC -> DC00
#    1503                 :            : _SHUF_DC00:              ddq 0x0b0a090803020100FFFFFFFFFFFFFFFF
#    1504                 :            : */
#    1505                 :            : 
#    1506                 :            : #endif

Generated by: LCOV version 0-eol-96201-ge66f56f4af6a