sha512block_amd64_asm.mx raw

   1  // Copyright 2024 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  package main
   6  
   7  import (
   8  	"os"
   9  
  10  	. "github.com/mmcloughlin/avo/build"
  11  	. "github.com/mmcloughlin/avo/operand"
  12  	. "github.com/mmcloughlin/avo/reg"
  13  )
  14  
  15  //go:generate go run . -out ../sha512block_amd64.s
  16  
  17  // SHA512 block routine. See sha512block.go for Go equivalent.
  18  //
  19  // The algorithm is detailed in FIPS 180-4:
  20  //
  21  //  https://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
  22  //
  23  // Wt = Mt; for 0 <= t <= 15
  24  // Wt = SIGMA1(Wt-2) + SIGMA0(Wt-15) + Wt-16; for 16 <= t <= 79
  25  //
  26  // a = H0
  27  // b = H1
  28  // c = H2
  29  // d = H3
  30  // e = H4
  31  // f = H5
  32  // g = H6
  33  // h = H7
  34  //
  35  // for t = 0 to 79 {
  36  //    T1 = h + BIGSIGMA1(e) + Ch(e,f,g) + Kt + Wt
  37  //    T2 = BIGSIGMA0(a) + Maj(a,b,c)
  38  //    h = g
  39  //    g = f
  40  //    f = e
  41  //    e = d + T1
  42  //    d = c
  43  //    c = b
  44  //    b = a
  45  //    a = T1 + T2
  46  // }
  47  //
  48  // H0 = a + H0
  49  // H1 = b + H1
  50  // H2 = c + H2
  51  // H3 = d + H3
  52  // H4 = e + H4
  53  // H5 = f + H5
  54  // H6 = g + H6
  55  // H7 = h + H7
  56  
  57  const ThatPeskyUnicodeDot = "\u00b7"
  58  
  59  var _K = []uint64{
  60  	0x428a2f98d728ae22,
  61  	0x7137449123ef65cd,
  62  	0xb5c0fbcfec4d3b2f,
  63  	0xe9b5dba58189dbbc,
  64  	0x3956c25bf348b538,
  65  	0x59f111f1b605d019,
  66  	0x923f82a4af194f9b,
  67  	0xab1c5ed5da6d8118,
  68  	0xd807aa98a3030242,
  69  	0x12835b0145706fbe,
  70  	0x243185be4ee4b28c,
  71  	0x550c7dc3d5ffb4e2,
  72  	0x72be5d74f27b896f,
  73  	0x80deb1fe3b1696b1,
  74  	0x9bdc06a725c71235,
  75  	0xc19bf174cf692694,
  76  	0xe49b69c19ef14ad2,
  77  	0xefbe4786384f25e3,
  78  	0x0fc19dc68b8cd5b5,
  79  	0x240ca1cc77ac9c65,
  80  	0x2de92c6f592b0275,
  81  	0x4a7484aa6ea6e483,
  82  	0x5cb0a9dcbd41fbd4,
  83  	0x76f988da831153b5,
  84  	0x983e5152ee66dfab,
  85  	0xa831c66d2db43210,
  86  	0xb00327c898fb213f,
  87  	0xbf597fc7beef0ee4,
  88  	0xc6e00bf33da88fc2,
  89  	0xd5a79147930aa725,
  90  	0x06ca6351e003826f,
  91  	0x142929670a0e6e70,
  92  	0x27b70a8546d22ffc,
  93  	0x2e1b21385c26c926,
  94  	0x4d2c6dfc5ac42aed,
  95  	0x53380d139d95b3df,
  96  	0x650a73548baf63de,
  97  	0x766a0abb3c77b2a8,
  98  	0x81c2c92e47edaee6,
  99  	0x92722c851482353b,
 100  	0xa2bfe8a14cf10364,
 101  	0xa81a664bbc423001,
 102  	0xc24b8b70d0f89791,
 103  	0xc76c51a30654be30,
 104  	0xd192e819d6ef5218,
 105  	0xd69906245565a910,
 106  	0xf40e35855771202a,
 107  	0x106aa07032bbd1b8,
 108  	0x19a4c116b8d2d0c8,
 109  	0x1e376c085141ab53,
 110  	0x2748774cdf8eeb99,
 111  	0x34b0bcb5e19b48a8,
 112  	0x391c0cb3c5c95a63,
 113  	0x4ed8aa4ae3418acb,
 114  	0x5b9cca4f7763e373,
 115  	0x682e6ff3d6b2b8a3,
 116  	0x748f82ee5defb2fc,
 117  	0x78a5636f43172f60,
 118  	0x84c87814a1f0ab72,
 119  	0x8cc702081a6439ec,
 120  	0x90befffa23631e28,
 121  	0xa4506cebde82bde9,
 122  	0xbef9a3f7b2c67915,
 123  	0xc67178f2e372532b,
 124  	0xca273eceea26619c,
 125  	0xd186b8c721c0c207,
 126  	0xeada7dd6cde0eb1e,
 127  	0xf57d4f7fee6ed178,
 128  	0x06f067aa72176fba,
 129  	0x0a637dc5a2c898a6,
 130  	0x113f9804bef90dae,
 131  	0x1b710b35131c471b,
 132  	0x28db77f523047d84,
 133  	0x32caab7b40c72493,
 134  	0x3c9ebe0a15c9bebc,
 135  	0x431d67c49c100d4c,
 136  	0x4cc5d4becb3e42b6,
 137  	0x597f299cfc657e2a,
 138  	0x5fcb6fab3ad6faec,
 139  	0x6c44198c4a475817,
 140  }
 141  
 142  func main() {
 143  	// https://github.com/mmcloughlin/avo/issues/450
 144  	os.Setenv("GOOS", "linux")
 145  	os.Setenv("GOARCH", "amd64")
 146  
 147  	Package("crypto/internal/fips140/sha512")
 148  	ConstraintExpr("!purego")
 149  	blockAVX2()
 150  	Generate()
 151  }
 152  
 153  // Version below is based on "Fast SHA512 Implementations on Intel
 154  // Architecture Processors" White-paper
 155  // https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-sha512-implementations-ia-processors-paper.pdf
 156  // AVX2 version by Intel, same algorithm in Linux kernel:
 157  // https://github.com/torvalds/linux/blob/master/arch/x86/crypto/sha512-avx2-asm.S
 158  
 159  // James Guilford <james.guilford@intel.com>
 160  // Kirk Yap <kirk.s.yap@intel.com>
 161  // Tim Chen <tim.c.chen@linux.intel.com>
 162  // David Cote <david.m.cote@intel.com>
 163  // Aleksey Sidorov <aleksey.sidorov@intel.com>
 164  
 165  // Line 289
 166  var (
 167  	YFER_SIZE int = (4 * 8)
 168  	SRND_SIZE     = (1 * 8)
 169  	INP_SIZE      = (1 * 8)
 170  
 171  	frame_YFER   = (0)
 172  	frame_SRND   = (frame_YFER + YFER_SIZE)
 173  	frame_INP    = (frame_SRND + SRND_SIZE)
 174  	frame_INPEND = (frame_INP + INP_SIZE)
 175  )
 176  
 177  // Line 298
 178  func addm(p1 Mem, p2 GPPhysical) {
 179  	ADDQ(p1, p2)
 180  	MOVQ(p2, p1)
 181  }
 182  
 183  // Line 302
 184  func COPY_YMM_AND_BSWAP(p1 VecPhysical, p2 Mem, p3 VecPhysical) {
 185  	VMOVDQU(p2, p1)
 186  	VPSHUFB(p3, p1, p1)
 187  }
 188  
 189  // Line 306
 190  func MY_VPALIGNR(YDST, YSRC1, YSRC2 VecPhysical, RVAL int) {
 191  	VPERM2F128(U8(0x3), YSRC2, YSRC1, YDST)
 192  	VPALIGNR(U8(RVAL), YSRC2, YDST, YDST)
 193  }
 194  
 195  // Line 324
 196  func blockAVX2() {
 197  	Implement("blockAVX2")
 198  	Attributes(NOSPLIT)
 199  	AllocLocal(56)
 200  
 201  	Load(Param("dig"), RSI)
 202  	Load(Param("p").Base(), RDI)
 203  	Load(Param("p").Len(), RDX)
 204  
 205  	SHRQ(Imm(7), RDX)
 206  	SHLQ(Imm(7), RDX)
 207  
 208  	JZ(LabelRef("done_hash"))
 209  	ADDQ(RDI, RDX)
 210  	MOVQ(RDX, Mem{Base: SP}.Offset(frame_INPEND))
 211  
 212  	MOVQ(Mem{Base: SI}.Offset(0*8), RAX)
 213  	MOVQ(Mem{Base: SI}.Offset(1*8), RBX)
 214  	MOVQ(Mem{Base: SI}.Offset(2*8), RCX)
 215  	MOVQ(Mem{Base: SI}.Offset(3*8), R8)
 216  	MOVQ(Mem{Base: SI}.Offset(4*8), RDX)
 217  	MOVQ(Mem{Base: SI}.Offset(5*8), R9)
 218  	MOVQ(Mem{Base: SI}.Offset(6*8), R10)
 219  	MOVQ(Mem{Base: SI}.Offset(7*8), R11)
 220  
 221  	PSHUFFLE_BYTE_FLIP_MASK := PSHUFFLE_BYTE_FLIP_MASK_DATA()
 222  	VMOVDQU(PSHUFFLE_BYTE_FLIP_MASK, Y9)
 223  
 224  	loop0()
 225  	loop1()
 226  	loop2()
 227  	done_hash()
 228  }
 229  
 230  // Line 347
 231  func loop0() {
 232  	Label("loop0")
 233  
 234  	_K := NewDataAddr(Symbol{Name: "$" + ThatPeskyUnicodeDot + "_K"}, 0)
 235  	MOVQ(_K, RBP)
 236  
 237  	// byte swap first 16 dwords
 238  	COPY_YMM_AND_BSWAP(Y4, Mem{Base: DI}.Offset(0*32), Y9)
 239  	COPY_YMM_AND_BSWAP(Y5, Mem{Base: DI}.Offset(1*32), Y9)
 240  	COPY_YMM_AND_BSWAP(Y6, Mem{Base: DI}.Offset(2*32), Y9)
 241  	COPY_YMM_AND_BSWAP(Y7, Mem{Base: DI}.Offset(3*32), Y9)
 242  
 243  	MOVQ(RDI, Mem{Base: SP}.Offset(frame_INP))
 244  
 245  	// schedule 64 input dwords, by doing 12 rounds of 4 each
 246  	MOVQ(U32(4), Mem{Base: SP}.Offset(frame_SRND))
 247  }
 248  
 249  // Line 361
 250  func loop1() {
 251  	Label("loop1")
 252  	VPADDQ(Mem{Base: BP}, Y4, Y0)
 253  	VMOVDQU(Y0, Mem{Base: SP}.Offset(frame_YFER))
 254  
 255  	MY_VPALIGNR(Y0, Y7, Y6, 8)
 256  
 257  	VPADDQ(Y4, Y0, Y0)
 258  
 259  	MY_VPALIGNR(Y1, Y5, Y4, 8)
 260  
 261  	VPSRLQ(Imm(1), Y1, Y2)
 262  	VPSLLQ(Imm(64-1), Y1, Y3)
 263  	VPOR(Y2, Y3, Y3)
 264  
 265  	VPSRLQ(Imm(7), Y1, Y8)
 266  
 267  	MOVQ(RAX, RDI)
 268  	RORXQ(Imm(41), RDX, R13)
 269  	RORXQ(Imm(18), RDX, R14)
 270  	ADDQ(Mem{Base: SP}.Offset(frame_YFER), R11)
 271  	ORQ(RCX, RDI)
 272  	MOVQ(R9, R15)
 273  	RORXQ(Imm(34), RAX, R12)
 274  
 275  	XORQ(R14, R13)
 276  	XORQ(R10, R15)
 277  	RORXQ(Imm(14), RDX, R14)
 278  
 279  	ANDQ(RDX, R15)
 280  	XORQ(R14, R13)
 281  	RORXQ(Imm(39), RAX, R14)
 282  	ADDQ(R11, R8)
 283  
 284  	ANDQ(RBX, RDI)
 285  	XORQ(R12, R14)
 286  	RORXQ(Imm(28), RAX, R12)
 287  
 288  	XORQ(R10, R15)
 289  	XORQ(R12, R14)
 290  	MOVQ(RAX, R12)
 291  	ANDQ(RCX, R12)
 292  
 293  	ADDQ(R13, R15)
 294  	ORQ(R12, RDI)
 295  	ADDQ(R14, R11)
 296  
 297  	ADDQ(R15, R8)
 298  
 299  	ADDQ(R15, R11)
 300  	ADDQ(RDI, R11)
 301  
 302  	VPSRLQ(Imm(8), Y1, Y2)
 303  	VPSLLQ(Imm(64-8), Y1, Y1)
 304  	VPOR(Y2, Y1, Y1)
 305  
 306  	VPXOR(Y8, Y3, Y3)
 307  	VPXOR(Y1, Y3, Y1)
 308  
 309  	VPADDQ(Y1, Y0, Y0)
 310  
 311  	VPERM2F128(Imm(0x0), Y0, Y0, Y4)
 312  
 313  	MASK_YMM_LO := MASK_YMM_LO_DATA()
 314  	VPAND(MASK_YMM_LO, Y0, Y0)
 315  
 316  	VPERM2F128(Imm(0x11), Y7, Y7, Y2)
 317  	VPSRLQ(Imm(6), Y2, Y8)
 318  
 319  	MOVQ(R11, RDI)
 320  	RORXQ(Imm(41), R8, R13)
 321  	RORXQ(Imm(18), R8, R14)
 322  	ADDQ(Mem{Base: SP}.Offset(1*8+frame_YFER), R10)
 323  	ORQ(RBX, RDI)
 324  
 325  	MOVQ(RDX, R15)
 326  	RORXQ(Imm(34), R11, R12)
 327  	XORQ(R14, R13)
 328  	XORQ(R9, R15)
 329  
 330  	RORXQ(Imm(14), R8, R14)
 331  	XORQ(R14, R13)
 332  	RORXQ(Imm(39), R11, R14)
 333  	ANDQ(R8, R15)
 334  	ADDQ(R10, RCX)
 335  
 336  	ANDQ(RAX, RDI)
 337  	XORQ(R12, R14)
 338  
 339  	RORXQ(Imm(28), R11, R12)
 340  	XORQ(R9, R15)
 341  
 342  	XORQ(R12, R14)
 343  	MOVQ(R11, R12)
 344  	ANDQ(RBX, R12)
 345  	ADDQ(R13, R15)
 346  
 347  	ORQ(R12, RDI)
 348  	ADDQ(R14, R10)
 349  
 350  	ADDQ(R15, RCX)
 351  	ADDQ(R15, R10)
 352  	ADDQ(RDI, R10)
 353  
 354  	VPSRLQ(Imm(19), Y2, Y3)
 355  	VPSLLQ(Imm(64-19), Y2, Y1)
 356  	VPOR(Y1, Y3, Y3)
 357  	VPXOR(Y3, Y8, Y8)
 358  	VPSRLQ(Imm(61), Y2, Y3)
 359  	VPSLLQ(Imm(64-61), Y2, Y1)
 360  	VPOR(Y1, Y3, Y3)
 361  	VPXOR(Y3, Y8, Y8)
 362  
 363  	VPADDQ(Y8, Y4, Y4)
 364  
 365  	VPSRLQ(Imm(6), Y4, Y8)
 366  
 367  	MOVQ(R10, RDI)
 368  	RORXQ(Imm(41), RCX, R13)
 369  	ADDQ(Mem{Base: SP}.Offset(2*8+frame_YFER), R9)
 370  
 371  	RORXQ(Imm(18), RCX, R14)
 372  	ORQ(RAX, RDI)
 373  	MOVQ(R8, R15)
 374  	XORQ(RDX, R15)
 375  
 376  	RORXQ(Imm(34), R10, R12)
 377  	XORQ(R14, R13)
 378  	ANDQ(RCX, R15)
 379  
 380  	RORXQ(Imm(14), RCX, R14)
 381  	ADDQ(R9, RBX)
 382  	ANDQ(R11, RDI)
 383  
 384  	XORQ(R14, R13)
 385  	RORXQ(Imm(39), R10, R14)
 386  	XORQ(RDX, R15)
 387  
 388  	XORQ(R12, R14)
 389  	RORXQ(Imm(28), R10, R12)
 390  
 391  	XORQ(R12, R14)
 392  	MOVQ(R10, R12)
 393  	ANDQ(RAX, R12)
 394  	ADDQ(R13, R15)
 395  
 396  	ORQ(R12, RDI)
 397  	ADDQ(R14, R9)
 398  	ADDQ(R15, RBX)
 399  	ADDQ(R15, R9)
 400  
 401  	ADDQ(RDI, R9)
 402  
 403  	VPSRLQ(Imm(19), Y4, Y3)
 404  	VPSLLQ(Imm(64-19), Y4, Y1)
 405  	VPOR(Y1, Y3, Y3)
 406  	VPXOR(Y3, Y8, Y8)
 407  	VPSRLQ(Imm(61), Y4, Y3)
 408  	VPSLLQ(Imm(64-61), Y4, Y1)
 409  	VPOR(Y1, Y3, Y3)
 410  	VPXOR(Y3, Y8, Y8)
 411  
 412  	VPADDQ(Y8, Y0, Y2)
 413  
 414  	VPBLENDD(Imm(0xF0), Y2, Y4, Y4)
 415  
 416  	MOVQ(R9, RDI)
 417  	RORXQ(Imm(41), RBX, R13)
 418  	RORXQ(Imm(18), RBX, R14)
 419  	ADDQ(Mem{Base: SP}.Offset(3*8+frame_YFER), RDX)
 420  	ORQ(R11, RDI)
 421  
 422  	MOVQ(RCX, R15)
 423  	RORXQ(Imm(34), R9, R12)
 424  	XORQ(R14, R13)
 425  	XORQ(R8, R15)
 426  
 427  	RORXQ(Imm(14), RBX, R14)
 428  	ANDQ(RBX, R15)
 429  	ADDQ(RDX, RAX)
 430  	ANDQ(R10, RDI)
 431  
 432  	XORQ(R14, R13)
 433  	XORQ(R8, R15)
 434  
 435  	RORXQ(Imm(39), R9, R14)
 436  	ADDQ(R13, R15)
 437  
 438  	XORQ(R12, R14)
 439  	ADDQ(R15, RAX)
 440  
 441  	RORXQ(Imm(28), R9, R12)
 442  
 443  	XORQ(R12, R14)
 444  	MOVQ(R9, R12)
 445  	ANDQ(R11, R12)
 446  	ORQ(R12, RDI)
 447  
 448  	ADDQ(R14, RDX)
 449  	ADDQ(R15, RDX)
 450  	ADDQ(RDI, RDX)
 451  
 452  	VPADDQ(Mem{Base: BP}.Offset(1*32), Y5, Y0)
 453  	VMOVDQU(Y0, Mem{Base: SP}.Offset(frame_YFER))
 454  
 455  	MY_VPALIGNR(Y0, Y4, Y7, 8)
 456  
 457  	VPADDQ(Y5, Y0, Y0)
 458  
 459  	MY_VPALIGNR(Y1, Y6, Y5, 8)
 460  
 461  	VPSRLQ(Imm(1), Y1, Y2)
 462  	VPSLLQ(Imm(64-1), Y1, Y3)
 463  	VPOR(Y2, Y3, Y3)
 464  
 465  	VPSRLQ(Imm(7), Y1, Y8)
 466  
 467  	MOVQ(RDX, RDI)
 468  	RORXQ(Imm(41), RAX, R13)
 469  	RORXQ(Imm(18), RAX, R14)
 470  	ADDQ(Mem{Base: SP}.Offset(frame_YFER), R8)
 471  	ORQ(R10, RDI)
 472  	MOVQ(RBX, R15)
 473  	RORXQ(Imm(34), RDX, R12)
 474  
 475  	XORQ(R14, R13)
 476  	XORQ(RCX, R15)
 477  	RORXQ(Imm(14), RAX, R14)
 478  
 479  	ANDQ(RAX, R15)
 480  	XORQ(R14, R13)
 481  	RORXQ(Imm(39), RDX, R14)
 482  	ADDQ(R8, R11)
 483  
 484  	ANDQ(R9, RDI)
 485  	XORQ(R12, R14)
 486  	RORXQ(Imm(28), RDX, R12)
 487  
 488  	XORQ(RCX, R15)
 489  	XORQ(R12, R14)
 490  	MOVQ(RDX, R12)
 491  	ANDQ(R10, R12)
 492  
 493  	ADDQ(R13, R15)
 494  	ORQ(R12, RDI)
 495  	ADDQ(R14, R8)
 496  
 497  	ADDQ(R15, R11)
 498  
 499  	ADDQ(R15, R8)
 500  	ADDQ(RDI, R8)
 501  
 502  	VPSRLQ(Imm(8), Y1, Y2)
 503  	VPSLLQ(Imm(64-8), Y1, Y1)
 504  	VPOR(Y2, Y1, Y1)
 505  
 506  	VPXOR(Y8, Y3, Y3)
 507  	VPXOR(Y1, Y3, Y1)
 508  
 509  	VPADDQ(Y1, Y0, Y0)
 510  
 511  	VPERM2F128(Imm(0x0), Y0, Y0, Y5)
 512  
 513  	VPAND(MASK_YMM_LO, Y0, Y0)
 514  
 515  	VPERM2F128(Imm(0x11), Y4, Y4, Y2)
 516  	VPSRLQ(Imm(6), Y2, Y8)
 517  
 518  	MOVQ(R8, RDI)
 519  	RORXQ(Imm(41), R11, R13)
 520  	RORXQ(Imm(18), R11, R14)
 521  	ADDQ(Mem{Base: SP}.Offset(1*8+frame_YFER), RCX)
 522  	ORQ(R9, RDI)
 523  
 524  	MOVQ(RAX, R15)
 525  	RORXQ(Imm(34), R8, R12)
 526  	XORQ(R14, R13)
 527  	XORQ(RBX, R15)
 528  
 529  	RORXQ(Imm(14), R11, R14)
 530  	XORQ(R14, R13)
 531  	RORXQ(Imm(39), R8, R14)
 532  	ANDQ(R11, R15)
 533  	ADDQ(RCX, R10)
 534  
 535  	ANDQ(RDX, RDI)
 536  	XORQ(R12, R14)
 537  
 538  	RORXQ(Imm(28), R8, R12)
 539  	XORQ(RBX, R15)
 540  
 541  	XORQ(R12, R14)
 542  	MOVQ(R8, R12)
 543  	ANDQ(R9, R12)
 544  	ADDQ(R13, R15)
 545  
 546  	ORQ(R12, RDI)
 547  	ADDQ(R14, RCX)
 548  
 549  	ADDQ(R15, R10)
 550  	ADDQ(R15, RCX)
 551  	ADDQ(RDI, RCX)
 552  
 553  	VPSRLQ(Imm(19), Y2, Y3)
 554  	VPSLLQ(Imm(64-19), Y2, Y1)
 555  	VPOR(Y1, Y3, Y3)
 556  	VPXOR(Y3, Y8, Y8)
 557  	VPSRLQ(Imm(61), Y2, Y3)
 558  	VPSLLQ(Imm(64-61), Y2, Y1)
 559  	VPOR(Y1, Y3, Y3)
 560  	VPXOR(Y3, Y8, Y8)
 561  
 562  	VPADDQ(Y8, Y5, Y5)
 563  
 564  	VPSRLQ(Imm(6), Y5, Y8)
 565  
 566  	MOVQ(RCX, RDI)
 567  	RORXQ(Imm(41), R10, R13)
 568  	ADDQ(Mem{Base: SP}.Offset(2*8+frame_YFER), RBX)
 569  
 570  	RORXQ(Imm(18), R10, R14)
 571  	ORQ(RDX, RDI)
 572  	MOVQ(R11, R15)
 573  	XORQ(RAX, R15)
 574  
 575  	RORXQ(Imm(34), RCX, R12)
 576  	XORQ(R14, R13)
 577  	ANDQ(R10, R15)
 578  
 579  	RORXQ(Imm(14), R10, R14)
 580  	ADDQ(RBX, R9)
 581  	ANDQ(R8, RDI)
 582  
 583  	XORQ(R14, R13)
 584  	RORXQ(Imm(39), RCX, R14)
 585  	XORQ(RAX, R15)
 586  
 587  	XORQ(R12, R14)
 588  	RORXQ(Imm(28), RCX, R12)
 589  
 590  	XORQ(R12, R14)
 591  	MOVQ(RCX, R12)
 592  	ANDQ(RDX, R12)
 593  	ADDQ(R13, R15)
 594  
 595  	ORQ(R12, RDI)
 596  	ADDQ(R14, RBX)
 597  	ADDQ(R15, R9)
 598  	ADDQ(R15, RBX)
 599  
 600  	ADDQ(RDI, RBX)
 601  
 602  	VPSRLQ(Imm(19), Y5, Y3)
 603  	VPSLLQ(Imm(64-19), Y5, Y1)
 604  	VPOR(Y1, Y3, Y3)
 605  	VPXOR(Y3, Y8, Y8)
 606  	VPSRLQ(Imm(61), Y5, Y3)
 607  	VPSLLQ(Imm(64-61), Y5, Y1)
 608  	VPOR(Y1, Y3, Y3)
 609  	VPXOR(Y3, Y8, Y8)
 610  
 611  	VPADDQ(Y8, Y0, Y2)
 612  
 613  	VPBLENDD(Imm(0xF0), Y2, Y5, Y5)
 614  
 615  	MOVQ(RBX, RDI)
 616  	RORXQ(Imm(41), R9, R13)
 617  	RORXQ(Imm(18), R9, R14)
 618  	ADDQ(Mem{Base: SP}.Offset(3*8+frame_YFER), RAX)
 619  	ORQ(R8, RDI)
 620  
 621  	MOVQ(R10, R15)
 622  	RORXQ(Imm(34), RBX, R12)
 623  	XORQ(R14, R13)
 624  	XORQ(R11, R15)
 625  
 626  	RORXQ(Imm(14), R9, R14)
 627  	ANDQ(R9, R15)
 628  	ADDQ(RAX, RDX)
 629  	ANDQ(RCX, RDI)
 630  
 631  	XORQ(R14, R13)
 632  	XORQ(R11, R15)
 633  
 634  	RORXQ(Imm(39), RBX, R14)
 635  	ADDQ(R13, R15)
 636  
 637  	XORQ(R12, R14)
 638  	ADDQ(R15, RDX)
 639  
 640  	RORXQ(Imm(28), RBX, R12)
 641  
 642  	XORQ(R12, R14)
 643  	MOVQ(RBX, R12)
 644  	ANDQ(R8, R12)
 645  	ORQ(R12, RDI)
 646  
 647  	ADDQ(R14, RAX)
 648  	ADDQ(R15, RAX)
 649  	ADDQ(RDI, RAX)
 650  
 651  	VPADDQ(Mem{Base: BP}.Offset(2*32), Y6, Y0)
 652  	VMOVDQU(Y0, Mem{Base: SP}.Offset(frame_YFER))
 653  
 654  	MY_VPALIGNR(Y0, Y5, Y4, 8)
 655  
 656  	VPADDQ(Y6, Y0, Y0)
 657  
 658  	MY_VPALIGNR(Y1, Y7, Y6, 8)
 659  
 660  	VPSRLQ(Imm(1), Y1, Y2)
 661  	VPSLLQ(Imm(64-1), Y1, Y3)
 662  	VPOR(Y2, Y3, Y3)
 663  
 664  	VPSRLQ(Imm(7), Y1, Y8)
 665  
 666  	MOVQ(RAX, RDI)
 667  	RORXQ(Imm(41), RDX, R13)
 668  	RORXQ(Imm(18), RDX, R14)
 669  	ADDQ(Mem{Base: SP}.Offset(frame_YFER), R11)
 670  	ORQ(RCX, RDI)
 671  	MOVQ(R9, R15)
 672  	RORXQ(Imm(34), RAX, R12)
 673  
 674  	XORQ(R14, R13)
 675  	XORQ(R10, R15)
 676  	RORXQ(Imm(14), RDX, R14)
 677  
 678  	ANDQ(RDX, R15)
 679  	XORQ(R14, R13)
 680  	RORXQ(Imm(39), RAX, R14)
 681  	ADDQ(R11, R8)
 682  
 683  	ANDQ(RBX, RDI)
 684  	XORQ(R12, R14)
 685  	RORXQ(Imm(28), RAX, R12)
 686  
 687  	XORQ(R10, R15)
 688  	XORQ(R12, R14)
 689  	MOVQ(RAX, R12)
 690  	ANDQ(RCX, R12)
 691  
 692  	ADDQ(R13, R15)
 693  	ORQ(R12, RDI)
 694  	ADDQ(R14, R11)
 695  
 696  	ADDQ(R15, R8)
 697  
 698  	ADDQ(R15, R11)
 699  	ADDQ(RDI, R11)
 700  
 701  	VPSRLQ(Imm(8), Y1, Y2)
 702  	VPSLLQ(Imm(64-8), Y1, Y1)
 703  	VPOR(Y2, Y1, Y1)
 704  
 705  	VPXOR(Y8, Y3, Y3)
 706  	VPXOR(Y1, Y3, Y1)
 707  
 708  	VPADDQ(Y1, Y0, Y0)
 709  
 710  	VPERM2F128(Imm(0x0), Y0, Y0, Y6)
 711  
 712  	VPAND(MASK_YMM_LO, Y0, Y0)
 713  
 714  	VPERM2F128(Imm(0x11), Y5, Y5, Y2)
 715  	VPSRLQ(Imm(6), Y2, Y8)
 716  
 717  	MOVQ(R11, RDI)
 718  	RORXQ(Imm(41), R8, R13)
 719  	RORXQ(Imm(18), R8, R14)
 720  	ADDQ(Mem{Base: SP}.Offset(1*8+frame_YFER), R10)
 721  	ORQ(RBX, RDI)
 722  
 723  	MOVQ(RDX, R15)
 724  	RORXQ(Imm(34), R11, R12)
 725  	XORQ(R14, R13)
 726  	XORQ(R9, R15)
 727  
 728  	RORXQ(Imm(14), R8, R14)
 729  	XORQ(R14, R13)
 730  	RORXQ(Imm(39), R11, R14)
 731  	ANDQ(R8, R15)
 732  	ADDQ(R10, RCX)
 733  
 734  	ANDQ(RAX, RDI)
 735  	XORQ(R12, R14)
 736  
 737  	RORXQ(Imm(28), R11, R12)
 738  	XORQ(R9, R15)
 739  
 740  	XORQ(R12, R14)
 741  	MOVQ(R11, R12)
 742  	ANDQ(RBX, R12)
 743  	ADDQ(R13, R15)
 744  
 745  	ORQ(R12, RDI)
 746  	ADDQ(R14, R10)
 747  
 748  	ADDQ(R15, RCX)
 749  	ADDQ(R15, R10)
 750  	ADDQ(RDI, R10)
 751  
 752  	VPSRLQ(Imm(19), Y2, Y3)
 753  	VPSLLQ(Imm(64-19), Y2, Y1)
 754  	VPOR(Y1, Y3, Y3)
 755  	VPXOR(Y3, Y8, Y8)
 756  	VPSRLQ(Imm(61), Y2, Y3)
 757  	VPSLLQ(Imm(64-61), Y2, Y1)
 758  	VPOR(Y1, Y3, Y3)
 759  	VPXOR(Y3, Y8, Y8)
 760  
 761  	VPADDQ(Y8, Y6, Y6)
 762  
 763  	VPSRLQ(Imm(6), Y6, Y8)
 764  
 765  	MOVQ(R10, RDI)
 766  	RORXQ(Imm(41), RCX, R13)
 767  	ADDQ(Mem{Base: SP}.Offset(2*8+frame_YFER), R9)
 768  
 769  	RORXQ(Imm(18), RCX, R14)
 770  	ORQ(RAX, RDI)
 771  	MOVQ(R8, R15)
 772  	XORQ(RDX, R15)
 773  
 774  	RORXQ(Imm(34), R10, R12)
 775  	XORQ(R14, R13)
 776  	ANDQ(RCX, R15)
 777  
 778  	RORXQ(Imm(14), RCX, R14)
 779  	ADDQ(R9, RBX)
 780  	ANDQ(R11, RDI)
 781  
 782  	XORQ(R14, R13)
 783  	RORXQ(Imm(39), R10, R14)
 784  	XORQ(RDX, R15)
 785  
 786  	XORQ(R12, R14)
 787  	RORXQ(Imm(28), R10, R12)
 788  
 789  	XORQ(R12, R14)
 790  	MOVQ(R10, R12)
 791  	ANDQ(RAX, R12)
 792  	ADDQ(R13, R15)
 793  
 794  	ORQ(R12, RDI)
 795  	ADDQ(R14, R9)
 796  	ADDQ(R15, RBX)
 797  	ADDQ(R15, R9)
 798  
 799  	ADDQ(RDI, R9)
 800  
 801  	VPSRLQ(Imm(19), Y6, Y3)
 802  	VPSLLQ(Imm(64-19), Y6, Y1)
 803  	VPOR(Y1, Y3, Y3)
 804  	VPXOR(Y3, Y8, Y8)
 805  	VPSRLQ(Imm(61), Y6, Y3)
 806  	VPSLLQ(Imm(64-61), Y6, Y1)
 807  	VPOR(Y1, Y3, Y3)
 808  	VPXOR(Y3, Y8, Y8)
 809  
 810  	VPADDQ(Y8, Y0, Y2)
 811  
 812  	VPBLENDD(Imm(0xF0), Y2, Y6, Y6)
 813  
 814  	MOVQ(R9, RDI)
 815  	RORXQ(Imm(41), RBX, R13)
 816  	RORXQ(Imm(18), RBX, R14)
 817  	ADDQ(Mem{Base: SP}.Offset(3*8+frame_YFER), RDX)
 818  	ORQ(R11, RDI)
 819  
 820  	MOVQ(RCX, R15)
 821  	RORXQ(Imm(34), R9, R12)
 822  	XORQ(R14, R13)
 823  	XORQ(R8, R15)
 824  
 825  	RORXQ(Imm(14), RBX, R14)
 826  	ANDQ(RBX, R15)
 827  	ADDQ(RDX, RAX)
 828  	ANDQ(R10, RDI)
 829  
 830  	XORQ(R14, R13)
 831  	XORQ(R8, R15)
 832  
 833  	RORXQ(Imm(39), R9, R14)
 834  	ADDQ(R13, R15)
 835  
 836  	XORQ(R12, R14)
 837  	ADDQ(R15, RAX)
 838  
 839  	RORXQ(Imm(28), R9, R12)
 840  
 841  	XORQ(R12, R14)
 842  	MOVQ(R9, R12)
 843  	ANDQ(R11, R12)
 844  	ORQ(R12, RDI)
 845  
 846  	ADDQ(R14, RDX)
 847  	ADDQ(R15, RDX)
 848  	ADDQ(RDI, RDX)
 849  
 850  	VPADDQ(Mem{Base: BP}.Offset(3*32), Y7, Y0)
 851  	VMOVDQU(Y0, Mem{Base: SP}.Offset(frame_YFER))
 852  	ADDQ(U8(4*32), RBP)
 853  
 854  	MY_VPALIGNR(Y0, Y6, Y5, 8)
 855  
 856  	VPADDQ(Y7, Y0, Y0)
 857  
 858  	MY_VPALIGNR(Y1, Y4, Y7, 8)
 859  
 860  	VPSRLQ(Imm(1), Y1, Y2)
 861  	VPSLLQ(Imm(64-1), Y1, Y3)
 862  	VPOR(Y2, Y3, Y3)
 863  
 864  	VPSRLQ(Imm(7), Y1, Y8)
 865  
 866  	MOVQ(RDX, RDI)
 867  	RORXQ(Imm(41), RAX, R13)
 868  	RORXQ(Imm(18), RAX, R14)
 869  	ADDQ(Mem{Base: SP}.Offset(frame_YFER), R8)
 870  	ORQ(R10, RDI)
 871  	MOVQ(RBX, R15)
 872  	RORXQ(Imm(34), RDX, R12)
 873  
 874  	XORQ(R14, R13)
 875  	XORQ(RCX, R15)
 876  	RORXQ(Imm(14), RAX, R14)
 877  
 878  	ANDQ(RAX, R15)
 879  	XORQ(R14, R13)
 880  	RORXQ(Imm(39), RDX, R14)
 881  	ADDQ(R8, R11)
 882  
 883  	ANDQ(R9, RDI)
 884  	XORQ(R12, R14)
 885  	RORXQ(Imm(28), RDX, R12)
 886  
 887  	XORQ(RCX, R15)
 888  	XORQ(R12, R14)
 889  	MOVQ(RDX, R12)
 890  	ANDQ(R10, R12)
 891  
 892  	ADDQ(R13, R15)
 893  	ORQ(R12, RDI)
 894  	ADDQ(R14, R8)
 895  
 896  	ADDQ(R15, R11)
 897  
 898  	ADDQ(R15, R8)
 899  	ADDQ(RDI, R8)
 900  
 901  	VPSRLQ(Imm(8), Y1, Y2)
 902  	VPSLLQ(Imm(64-8), Y1, Y1)
 903  	VPOR(Y2, Y1, Y1)
 904  
 905  	VPXOR(Y8, Y3, Y3)
 906  	VPXOR(Y1, Y3, Y1)
 907  
 908  	VPADDQ(Y1, Y0, Y0)
 909  
 910  	VPERM2F128(Imm(0x0), Y0, Y0, Y7)
 911  
 912  	VPAND(MASK_YMM_LO, Y0, Y0)
 913  
 914  	VPERM2F128(Imm(0x11), Y6, Y6, Y2)
 915  	VPSRLQ(Imm(6), Y2, Y8)
 916  
 917  	MOVQ(R8, RDI)
 918  	RORXQ(Imm(41), R11, R13)
 919  	RORXQ(Imm(18), R11, R14)
 920  	ADDQ(Mem{Base: SP}.Offset(1*8+frame_YFER), RCX)
 921  	ORQ(R9, RDI)
 922  
 923  	MOVQ(RAX, R15)
 924  	RORXQ(Imm(34), R8, R12)
 925  	XORQ(R14, R13)
 926  	XORQ(RBX, R15)
 927  
 928  	RORXQ(Imm(14), R11, R14)
 929  	XORQ(R14, R13)
 930  	RORXQ(Imm(39), R8, R14)
 931  	ANDQ(R11, R15)
 932  	ADDQ(RCX, R10)
 933  
 934  	ANDQ(RDX, RDI)
 935  	XORQ(R12, R14)
 936  
 937  	RORXQ(Imm(28), R8, R12)
 938  	XORQ(RBX, R15)
 939  
 940  	XORQ(R12, R14)
 941  	MOVQ(R8, R12)
 942  	ANDQ(R9, R12)
 943  	ADDQ(R13, R15)
 944  
 945  	ORQ(R12, RDI)
 946  	ADDQ(R14, RCX)
 947  
 948  	ADDQ(R15, R10)
 949  	ADDQ(R15, RCX)
 950  	ADDQ(RDI, RCX)
 951  
 952  	VPSRLQ(Imm(19), Y2, Y3)
 953  	VPSLLQ(Imm(64-19), Y2, Y1)
 954  	VPOR(Y1, Y3, Y3)
 955  	VPXOR(Y3, Y8, Y8)
 956  	VPSRLQ(Imm(61), Y2, Y3)
 957  	VPSLLQ(Imm(64-61), Y2, Y1)
 958  	VPOR(Y1, Y3, Y3)
 959  	VPXOR(Y3, Y8, Y8)
 960  
 961  	VPADDQ(Y8, Y7, Y7)
 962  
 963  	VPSRLQ(Imm(6), Y7, Y8)
 964  
 965  	MOVQ(RCX, RDI)
 966  	RORXQ(Imm(41), R10, R13)
 967  	ADDQ(Mem{Base: SP}.Offset(2*8+frame_YFER), RBX)
 968  
 969  	RORXQ(Imm(18), R10, R14)
 970  	ORQ(RDX, RDI)
 971  	MOVQ(R11, R15)
 972  	XORQ(RAX, R15)
 973  
 974  	RORXQ(Imm(34), RCX, R12)
 975  	XORQ(R14, R13)
 976  	ANDQ(R10, R15)
 977  
 978  	RORXQ(Imm(14), R10, R14)
 979  	ADDQ(RBX, R9)
 980  	ANDQ(R8, RDI)
 981  
 982  	XORQ(R14, R13)
 983  	RORXQ(Imm(39), RCX, R14)
 984  	XORQ(RAX, R15)
 985  
 986  	XORQ(R12, R14)
 987  	RORXQ(Imm(28), RCX, R12)
 988  
 989  	XORQ(R12, R14)
 990  	MOVQ(RCX, R12)
 991  	ANDQ(RDX, R12)
 992  	ADDQ(R13, R15)
 993  
 994  	ORQ(R12, RDI)
 995  	ADDQ(R14, RBX)
 996  	ADDQ(R15, R9)
 997  	ADDQ(R15, RBX)
 998  
 999  	ADDQ(RDI, RBX)
1000  
1001  	VPSRLQ(Imm(19), Y7, Y3)
1002  	VPSLLQ(Imm(64-19), Y7, Y1)
1003  	VPOR(Y1, Y3, Y3)
1004  	VPXOR(Y3, Y8, Y8)
1005  	VPSRLQ(Imm(61), Y7, Y3)
1006  	VPSLLQ(Imm(64-61), Y7, Y1)
1007  	VPOR(Y1, Y3, Y3)
1008  	VPXOR(Y3, Y8, Y8)
1009  
1010  	VPADDQ(Y8, Y0, Y2)
1011  
1012  	VPBLENDD(Imm(0xF0), Y2, Y7, Y7)
1013  
1014  	MOVQ(RBX, RDI)
1015  	RORXQ(Imm(41), R9, R13)
1016  	RORXQ(Imm(18), R9, R14)
1017  	ADDQ(Mem{Base: SP}.Offset(3*8+frame_YFER), RAX)
1018  	ORQ(R8, RDI)
1019  
1020  	MOVQ(R10, R15)
1021  	RORXQ(Imm(34), RBX, R12)
1022  	XORQ(R14, R13)
1023  	XORQ(R11, R15)
1024  
1025  	RORXQ(Imm(14), R9, R14)
1026  	ANDQ(R9, R15)
1027  	ADDQ(RAX, RDX)
1028  	ANDQ(RCX, RDI)
1029  
1030  	XORQ(R14, R13)
1031  	XORQ(R11, R15)
1032  
1033  	RORXQ(Imm(39), RBX, R14)
1034  	ADDQ(R13, R15)
1035  
1036  	XORQ(R12, R14)
1037  	ADDQ(R15, RDX)
1038  
1039  	RORXQ(Imm(28), RBX, R12)
1040  
1041  	XORQ(R12, R14)
1042  	MOVQ(RBX, R12)
1043  	ANDQ(R8, R12)
1044  	ORQ(R12, RDI)
1045  
1046  	ADDQ(R14, RAX)
1047  	ADDQ(R15, RAX)
1048  	ADDQ(RDI, RAX)
1049  
1050  	SUBQ(Imm(1), Mem{Base: SP}.Offset(frame_SRND))
1051  	JNE(LabelRef("loop1"))
1052  
1053  	MOVQ(U32(2), Mem{Base: SP}.Offset(frame_SRND))
1054  }
1055  
1056  // Line 1164
1057  func loop2() {
1058  	Label("loop2")
1059  	VPADDQ(Mem{Base: BP}, Y4, Y0)
1060  	VMOVDQU(Y0, Mem{Base: SP}.Offset(frame_YFER))
1061  
1062  	MOVQ(R9, R15)
1063  	RORXQ(Imm(41), RDX, R13)
1064  	RORXQ(Imm(18), RDX, R14)
1065  	XORQ(R10, R15)
1066  
1067  	XORQ(R14, R13)
1068  	RORXQ(Imm(14), RDX, R14)
1069  	ANDQ(RDX, R15)
1070  
1071  	XORQ(R14, R13)
1072  	RORXQ(Imm(34), RAX, R12)
1073  	XORQ(R10, R15)
1074  	RORXQ(Imm(39), RAX, R14)
1075  	MOVQ(RAX, RDI)
1076  
1077  	XORQ(R12, R14)
1078  	RORXQ(Imm(28), RAX, R12)
1079  	ADDQ(Mem{Base: SP}.Offset(frame_YFER), R11)
1080  	ORQ(RCX, RDI)
1081  
1082  	XORQ(R12, R14)
1083  	MOVQ(RAX, R12)
1084  	ANDQ(RBX, RDI)
1085  	ANDQ(RCX, R12)
1086  	ADDQ(R13, R15)
1087  
1088  	ADDQ(R11, R8)
1089  	ORQ(R12, RDI)
1090  	ADDQ(R14, R11)
1091  
1092  	ADDQ(R15, R8)
1093  
1094  	ADDQ(R15, R11)
1095  	MOVQ(RDX, R15)
1096  	RORXQ(Imm(41), R8, R13)
1097  	RORXQ(Imm(18), R8, R14)
1098  	XORQ(R9, R15)
1099  
1100  	XORQ(R14, R13)
1101  	RORXQ(Imm(14), R8, R14)
1102  	ANDQ(R8, R15)
1103  	ADDQ(RDI, R11)
1104  
1105  	XORQ(R14, R13)
1106  	RORXQ(Imm(34), R11, R12)
1107  	XORQ(R9, R15)
1108  	RORXQ(Imm(39), R11, R14)
1109  	MOVQ(R11, RDI)
1110  
1111  	XORQ(R12, R14)
1112  	RORXQ(Imm(28), R11, R12)
1113  	ADDQ(Mem{Base: SP}.Offset(8*1+frame_YFER), R10)
1114  	ORQ(RBX, RDI)
1115  
1116  	XORQ(R12, R14)
1117  	MOVQ(R11, R12)
1118  	ANDQ(RAX, RDI)
1119  	ANDQ(RBX, R12)
1120  	ADDQ(R13, R15)
1121  
1122  	ADDQ(R10, RCX)
1123  	ORQ(R12, RDI)
1124  	ADDQ(R14, R10)
1125  
1126  	ADDQ(R15, RCX)
1127  
1128  	ADDQ(R15, R10)
1129  	MOVQ(R8, R15)
1130  	RORXQ(Imm(41), RCX, R13)
1131  	RORXQ(Imm(18), RCX, R14)
1132  	XORQ(RDX, R15)
1133  
1134  	XORQ(R14, R13)
1135  	RORXQ(Imm(14), RCX, R14)
1136  	ANDQ(RCX, R15)
1137  	ADDQ(RDI, R10)
1138  
1139  	XORQ(R14, R13)
1140  	RORXQ(Imm(34), R10, R12)
1141  	XORQ(RDX, R15)
1142  	RORXQ(Imm(39), R10, R14)
1143  	MOVQ(R10, RDI)
1144  
1145  	XORQ(R12, R14)
1146  	RORXQ(Imm(28), R10, R12)
1147  	ADDQ(Mem{Base: SP}.Offset(8*2+frame_YFER), R9)
1148  	ORQ(RAX, RDI)
1149  
1150  	XORQ(R12, R14)
1151  	MOVQ(R10, R12)
1152  	ANDQ(R11, RDI)
1153  	ANDQ(RAX, R12)
1154  	ADDQ(R13, R15)
1155  
1156  	ADDQ(R9, RBX)
1157  	ORQ(R12, RDI)
1158  	ADDQ(R14, R9)
1159  
1160  	ADDQ(R15, RBX)
1161  
1162  	ADDQ(R15, R9)
1163  	MOVQ(RCX, R15)
1164  	RORXQ(Imm(41), RBX, R13)
1165  	RORXQ(Imm(18), RBX, R14)
1166  	XORQ(R8, R15)
1167  
1168  	XORQ(R14, R13)
1169  	RORXQ(Imm(14), RBX, R14)
1170  	ANDQ(RBX, R15)
1171  	ADDQ(RDI, R9)
1172  
1173  	XORQ(R14, R13)
1174  	RORXQ(Imm(34), R9, R12)
1175  	XORQ(R8, R15)
1176  	RORXQ(Imm(39), R9, R14)
1177  	MOVQ(R9, RDI)
1178  
1179  	XORQ(R12, R14)
1180  	RORXQ(Imm(28), R9, R12)
1181  	ADDQ(Mem{Base: SP}.Offset(8*3+frame_YFER), RDX)
1182  	ORQ(R11, RDI)
1183  
1184  	XORQ(R12, R14)
1185  	MOVQ(R9, R12)
1186  	ANDQ(R10, RDI)
1187  	ANDQ(R11, R12)
1188  	ADDQ(R13, R15)
1189  
1190  	ADDQ(RDX, RAX)
1191  	ORQ(R12, RDI)
1192  	ADDQ(R14, RDX)
1193  
1194  	ADDQ(R15, RAX)
1195  
1196  	ADDQ(R15, RDX)
1197  
1198  	ADDQ(RDI, RDX)
1199  
1200  	VPADDQ(Mem{Base: BP}.Offset(1*32), Y5, Y0)
1201  	VMOVDQU(Y0, Mem{Base: SP}.Offset(frame_YFER))
1202  	ADDQ(U8(2*32), RBP)
1203  
1204  	MOVQ(RBX, R15)
1205  	RORXQ(Imm(41), RAX, R13)
1206  	RORXQ(Imm(18), RAX, R14)
1207  	XORQ(RCX, R15)
1208  
1209  	XORQ(R14, R13)
1210  	RORXQ(Imm(14), RAX, R14)
1211  	ANDQ(RAX, R15)
1212  
1213  	XORQ(R14, R13)
1214  	RORXQ(Imm(34), RDX, R12)
1215  	XORQ(RCX, R15)
1216  	RORXQ(Imm(39), RDX, R14)
1217  	MOVQ(RDX, RDI)
1218  
1219  	XORQ(R12, R14)
1220  	RORXQ(Imm(28), RDX, R12)
1221  	ADDQ(Mem{Base: SP}.Offset(frame_YFER), R8)
1222  	ORQ(R10, RDI)
1223  
1224  	XORQ(R12, R14)
1225  	MOVQ(RDX, R12)
1226  	ANDQ(R9, RDI)
1227  	ANDQ(R10, R12)
1228  	ADDQ(R13, R15)
1229  
1230  	ADDQ(R8, R11)
1231  	ORQ(R12, RDI)
1232  	ADDQ(R14, R8)
1233  
1234  	ADDQ(R15, R11)
1235  
1236  	ADDQ(R15, R8)
1237  	MOVQ(RAX, R15)
1238  	RORXQ(Imm(41), R11, R13)
1239  	RORXQ(Imm(18), R11, R14)
1240  	XORQ(RBX, R15)
1241  
1242  	XORQ(R14, R13)
1243  	RORXQ(Imm(14), R11, R14)
1244  	ANDQ(R11, R15)
1245  	ADDQ(RDI, R8)
1246  
1247  	XORQ(R14, R13)
1248  	RORXQ(Imm(34), R8, R12)
1249  	XORQ(RBX, R15)
1250  	RORXQ(Imm(39), R8, R14)
1251  	MOVQ(R8, RDI)
1252  
1253  	XORQ(R12, R14)
1254  	RORXQ(Imm(28), R8, R12)
1255  	ADDQ(Mem{Base: SP}.Offset(8*1+frame_YFER), RCX)
1256  	ORQ(R9, RDI)
1257  
1258  	XORQ(R12, R14)
1259  	MOVQ(R8, R12)
1260  	ANDQ(RDX, RDI)
1261  	ANDQ(R9, R12)
1262  	ADDQ(R13, R15)
1263  
1264  	ADDQ(RCX, R10)
1265  	ORQ(R12, RDI)
1266  	ADDQ(R14, RCX)
1267  
1268  	ADDQ(R15, R10)
1269  
1270  	ADDQ(R15, RCX)
1271  	MOVQ(R11, R15)
1272  	RORXQ(Imm(41), R10, R13)
1273  	RORXQ(Imm(18), R10, R14)
1274  	XORQ(RAX, R15)
1275  
1276  	XORQ(R14, R13)
1277  	RORXQ(Imm(14), R10, R14)
1278  	ANDQ(R10, R15)
1279  	ADDQ(RDI, RCX)
1280  
1281  	XORQ(R14, R13)
1282  	RORXQ(Imm(34), RCX, R12)
1283  	XORQ(RAX, R15)
1284  	RORXQ(Imm(39), RCX, R14)
1285  	MOVQ(RCX, RDI)
1286  
1287  	XORQ(R12, R14)
1288  	RORXQ(Imm(28), RCX, R12)
1289  	ADDQ(Mem{Base: SP}.Offset(8*2+frame_YFER), RBX)
1290  	ORQ(RDX, RDI)
1291  
1292  	XORQ(R12, R14)
1293  	MOVQ(RCX, R12)
1294  	ANDQ(R8, RDI)
1295  	ANDQ(RDX, R12)
1296  	ADDQ(R13, R15)
1297  
1298  	ADDQ(RBX, R9)
1299  	ORQ(R12, RDI)
1300  	ADDQ(R14, RBX)
1301  
1302  	ADDQ(R15, R9)
1303  
1304  	ADDQ(R15, RBX)
1305  	MOVQ(R10, R15)
1306  	RORXQ(Imm(41), R9, R13)
1307  	RORXQ(Imm(18), R9, R14)
1308  	XORQ(R11, R15)
1309  
1310  	XORQ(R14, R13)
1311  	RORXQ(Imm(14), R9, R14)
1312  	ANDQ(R9, R15)
1313  	ADDQ(RDI, RBX)
1314  
1315  	XORQ(R14, R13)
1316  	RORXQ(Imm(34), RBX, R12)
1317  	XORQ(R11, R15)
1318  	RORXQ(Imm(39), RBX, R14)
1319  	MOVQ(RBX, RDI)
1320  
1321  	XORQ(R12, R14)
1322  	RORXQ(Imm(28), RBX, R12)
1323  	ADDQ(Mem{Base: SP}.Offset(8*3+frame_YFER), RAX)
1324  	ORQ(R8, RDI)
1325  
1326  	XORQ(R12, R14)
1327  	MOVQ(RBX, R12)
1328  	ANDQ(RCX, RDI)
1329  	ANDQ(R8, R12)
1330  	ADDQ(R13, R15)
1331  
1332  	ADDQ(RAX, RDX)
1333  	ORQ(R12, RDI)
1334  	ADDQ(R14, RAX)
1335  
1336  	ADDQ(R15, RDX)
1337  
1338  	ADDQ(R15, RAX)
1339  
1340  	ADDQ(RDI, RAX)
1341  
1342  	VMOVDQU(Y6, Y4)
1343  	VMOVDQU(Y7, Y5)
1344  
1345  	SUBQ(Imm(1), Mem{Base: SP}.Offset(frame_SRND))
1346  	JNE(LabelRef("loop2"))
1347  
1348  	addm(Mem{Base: SI}.Offset(8*0), RAX)
1349  	addm(Mem{Base: SI}.Offset(8*1), RBX)
1350  	addm(Mem{Base: SI}.Offset(8*2), RCX)
1351  	addm(Mem{Base: SI}.Offset(8*3), R8)
1352  	addm(Mem{Base: SI}.Offset(8*4), RDX)
1353  	addm(Mem{Base: SI}.Offset(8*5), R9)
1354  	addm(Mem{Base: SI}.Offset(8*6), R10)
1355  	addm(Mem{Base: SI}.Offset(8*7), R11)
1356  
1357  	MOVQ(Mem{Base: SP}.Offset(frame_INP), RDI)
1358  	ADDQ(Imm(128), RDI)
1359  	CMPQ(RDI, Mem{Base: SP}.Offset(frame_INPEND))
1360  	JNE(LabelRef("loop0"))
1361  }
1362  
1363  // Line 1468
1364  func done_hash() {
1365  	Label("done_hash")
1366  	VZEROUPPER()
1367  	RET()
1368  }
1369  
1370  // ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~DATA SECTION~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~##
1371  
1372  // Pointers for memoizing Data section symbols
1373  var PSHUFFLE_BYTE_FLIP_MASK_DATA_ptr, MASK_YMM_LO_ptr *Mem
1374  
1375  // Line 310
1376  func PSHUFFLE_BYTE_FLIP_MASK_DATA() Mem {
1377  	if PSHUFFLE_BYTE_FLIP_MASK_DATA_ptr != nil {
1378  		return *PSHUFFLE_BYTE_FLIP_MASK_DATA_ptr
1379  	}
1380  
1381  	PSHUFFLE_BYTE_FLIP_MASK_DATA := GLOBL("PSHUFFLE_BYTE_FLIP_MASK", NOPTR|RODATA)
1382  	PSHUFFLE_BYTE_FLIP_MASK_DATA_ptr = &PSHUFFLE_BYTE_FLIP_MASK_DATA
1383  	DATA(0x00, U64(0x0001020304050607))
1384  	DATA(0x08, U64(0x08090a0b0c0d0e0f))
1385  	DATA(0x10, U64(0x1011121314151617))
1386  	DATA(0x18, U64(0x18191a1b1c1d1e1f))
1387  	return PSHUFFLE_BYTE_FLIP_MASK_DATA
1388  }
1389  
1390  // Line 317
1391  func MASK_YMM_LO_DATA() Mem {
1392  	if MASK_YMM_LO_ptr != nil {
1393  		return *MASK_YMM_LO_ptr
1394  	}
1395  
1396  	MASK_YMM_LO := GLOBL("MASK_YMM_LO", NOPTR|RODATA)
1397  	MASK_YMM_LO_ptr = &MASK_YMM_LO
1398  	DATA(0x00, U64(0x0000000000000000))
1399  	DATA(0x08, U64(0x0000000000000000))
1400  	DATA(0x10, U64(0xFFFFFFFFFFFFFFFF))
1401  	DATA(0x18, U64(0xFFFFFFFFFFFFFFFF))
1402  	return MASK_YMM_LO
1403  }
1404