LCOV - code coverage report
Current view: top level - src/crypto - sha256_sse4.cpp (source / functions) Coverage Total Hit
Test: total_coverage.info Lines: 0.0 % 11 0
Test Date: 2025-01-19 05:08:01 Functions: 0.0 % 1 0

            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