LCOV - code coverage report
Current view: top level - src/crypto - sha256_sse4.cpp (source / functions) Coverage Total Hit
Test: fuzz_coverage.info Lines: 0.0 % 11 0
Test Date: 2024-12-04 04:00:22 Functions: 0.0 % 1 0
Branches: - 0 0

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

Generated by: LCOV version 2.0-1