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