Source file src/crypto/internal/fips140/sha512/_asm/sha512block_amd64_asm.go

     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  

View as plain text