gitee.com/quant1x/gox@v1.7.6/num/asm/matrix.go (about)

     1  package main
     2  
     3  import (
     4  	. "github.com/mmcloughlin/avo/build"
     5  	. "github.com/mmcloughlin/avo/operand"
     6  	. "github.com/mmcloughlin/avo/reg"
     7  )
     8  
     9  func genMat4Mul_F64() {
    10  
    11  	TEXT("Mat4Mul_AVX2_F64", NOSPLIT, "func(x, y, z []float64)")
    12  	Pragma("noescape")
    13  	Load(Param("x").Base(), RDI)
    14  	Load(Param("y").Base(), RSI)
    15  	Load(Param("z").Base(), RDX)
    16  
    17  	VBROADCASTSD(Mem{Base: RSI}, Y0)
    18  	VMOVUPD(Mem{Base: RDX}, Y1)
    19  	VMOVUPD(Mem{Base: RDX}.Offset(32), Y2)
    20  	VMOVUPD(Mem{Base: RDX}.Offset(64), Y3)
    21  	VMOVUPD(Mem{Base: RDX}.Offset(96), Y4)
    22  	VMULPD(Y0, Y1, Y0)
    23  	VBROADCASTSD(Mem{Base: RSI}.Offset(8), Y5)
    24  	VFMADD213PD(Y0, Y2, Y5)
    25  	VBROADCASTSD(Mem{Base: RSI}.Offset(16), Y0)
    26  	VFMADD213PD(Y5, Y3, Y0)
    27  	VBROADCASTSD(Mem{Base: RSI}.Offset(24), Y5)
    28  	VFMADD213PD(Y0, Y4, Y5)
    29  	VMOVUPD(Y5, Mem{Base: RDI})
    30  	VBROADCASTSD(Mem{Base: RSI}.Offset(32), Y0)
    31  	VMULPD(Y0, Y1, Y0)
    32  	VBROADCASTSD(Mem{Base: RSI}.Offset(40), Y1)
    33  	VFMADD213PD(Y0, Y2, Y1)
    34  	VBROADCASTSD(Mem{Base: RSI}.Offset(48), Y0)
    35  	VFMADD213PD(Y1, Y3, Y0)
    36  	VBROADCASTSD(Mem{Base: RSI}.Offset(56), Y1)
    37  	VFMADD213PD(Y0, Y4, Y1)
    38  	VMOVUPD(Y1, Mem{Base: RDI}.Offset(32))
    39  	VBROADCASTSD(Mem{Base: RSI}.Offset(64), Y0)
    40  	VMOVUPD(Mem{Base: RDX}, Y1)
    41  	VMOVUPD(Mem{Base: RDX}.Offset(32), Y2)
    42  	VMOVUPD(Mem{Base: RDX}.Offset(64), Y3)
    43  	VMOVUPD(Mem{Base: RDX}.Offset(96), Y4)
    44  	VMULPD(Y0, Y1, Y0)
    45  	VBROADCASTSD(Mem{Base: RSI}.Offset(72), Y5)
    46  	VFMADD213PD(Y0, Y2, Y5)
    47  	VBROADCASTSD(Mem{Base: RSI}.Offset(80), Y0)
    48  	VFMADD213PD(Y5, Y3, Y0)
    49  	VBROADCASTSD(Mem{Base: RSI}.Offset(88), Y5)
    50  	VFMADD213PD(Y0, Y4, Y5)
    51  	VMOVUPD(Y5, Mem{Base: RDI}.Offset(64))
    52  	VBROADCASTSD(Mem{Base: RSI}.Offset(96), Y0)
    53  	VMULPD(Y0, Y1, Y0)
    54  	VBROADCASTSD(Mem{Base: RSI}.Offset(104), Y1)
    55  	VFMADD213PD(Y0, Y2, Y1)
    56  	VBROADCASTSD(Mem{Base: RSI}.Offset(112), Y0)
    57  	VFMADD213PD(Y1, Y3, Y0)
    58  	VBROADCASTSD(Mem{Base: RSI}.Offset(120), Y1)
    59  	VFMADD213PD(Y0, Y4, Y1)
    60  	VMOVUPD(Y1, Mem{Base: RDI}.Offset(96))
    61  	VZEROUPPER()
    62  	RET()
    63  }
    64  
    65  func genMat4Mul_F32() {
    66  
    67  	TEXT("Mat4Mul_AVX2_F32", NOSPLIT, "func(x, y, z []float32)")
    68  	Pragma("noescape")
    69  	Load(Param("x").Base(), RDI)
    70  	Load(Param("y").Base(), RSI)
    71  	Load(Param("z").Base(), RDX)
    72  
    73  	VBROADCASTF128(Mem{Base: RDX}, Y0)
    74  	VBROADCASTF128(Mem{Base: RDX}.Offset(16), Y1)
    75  	VBROADCASTF128(Mem{Base: RDX}.Offset(32), Y2)
    76  	VBROADCASTF128(Mem{Base: RDX}.Offset(48), Y3)
    77  	VMOVSS(Mem{Base: RSI}.Offset(16), X4)
    78  	VMOVSS(Mem{Base: RSI}, X5)
    79  	VSHUFPS(Imm(0), X4, X5, X4)
    80  	VMOVSS(Mem{Base: RSI}.Offset(4), X5)
    81  	VMOVSS(Mem{Base: RSI}.Offset(8), X6)
    82  	VMOVSS(Mem{Base: RSI}.Offset(12), X7)
    83  	VPERMPD(Imm(80), Y4, Y4)
    84  	VMULPS(Y4, Y0, Y0)
    85  	VMOVSS(Mem{Base: RSI}.Offset(20), X4)
    86  	VSHUFPS(Imm(0), X4, X5, X4)
    87  	VPERMPD(Imm(80), Y4, Y4)
    88  	VFMADD213PS(Y0, Y1, Y4)
    89  	VMOVSS(Mem{Base: RSI}.Offset(24), X0)
    90  	VSHUFPS(Imm(0), X0, X6, X0)
    91  	VPERMPD(Imm(80), Y0, Y0)
    92  	VFMADD213PS(Y4, Y2, Y0)
    93  	VMOVSS(Mem{Base: RSI}.Offset(28), X1)
    94  	VSHUFPS(Imm(0), X1, X7, X1)
    95  	VPERMPD(Imm(80), Y1, Y1)
    96  	VFMADD213PS(Y0, Y3, Y1)
    97  	VBROADCASTF128(Mem{Base: RDX}, Y0)
    98  	VBROADCASTF128(Mem{Base: RDX}.Offset(16), Y2)
    99  	VBROADCASTF128(Mem{Base: RDX}.Offset(32), Y3)
   100  	VMOVUPS(Y1, Mem{Base: RDI})
   101  	VBROADCASTF128(Mem{Base: RDX}.Offset(48), Y1)
   102  	VMOVSS(Mem{Base: RSI}.Offset(48), X4)
   103  	VMOVSS(Mem{Base: RSI}.Offset(32), X5)
   104  	VSHUFPS(Imm(0), X4, X5, X4)
   105  	VMOVSS(Mem{Base: RSI}.Offset(36), X5)
   106  	VMOVSS(Mem{Base: RSI}.Offset(40), X6)
   107  	VMOVSS(Mem{Base: RSI}.Offset(44), X7)
   108  	VPERMPD(Imm(80), Y4, Y4)
   109  	VMULPS(Y4, Y0, Y0)
   110  	VMOVSS(Mem{Base: RSI}.Offset(52), X4)
   111  	VSHUFPS(Imm(0), X4, X5, X4)
   112  	VPERMPD(Imm(80), Y4, Y4)
   113  	VFMADD213PS(Y0, Y2, Y4)
   114  	VMOVSS(Mem{Base: RSI}.Offset(56), X0)
   115  	VSHUFPS(Imm(0), X0, X6, X0)
   116  	VPERMPD(Imm(80), Y0, Y0)
   117  	VFMADD213PS(Y4, Y3, Y0)
   118  	VMOVSS(Mem{Base: RSI}.Offset(60), X2)
   119  	VSHUFPS(Imm(0), X2, X7, X2)
   120  	VPERMPD(Imm(80), Y2, Y2)
   121  	VFMADD213PS(Y0, Y1, Y2)
   122  	VMOVUPS(Y2, Mem{Base: RDI}.Offset(32))
   123  	VZEROUPPER()
   124  	RET()
   125  }
   126  
   127  func genMatMul_F64() {
   128  
   129  	TEXT("MatMul_AVX2_F64", 0, "func(x, y, z []float64, a, b, c int)")
   130  	Pragma("noescape")
   131  	Load(Param("x").Base(), RDI)
   132  	Load(Param("y").Base(), RSI)
   133  	Load(Param("z").Base(), RDX)
   134  	Load(Param("a"), RCX)
   135  	Load(Param("b"), R8)
   136  	Load(Param("c"), R9)
   137  
   138  	PUSHQ(RBP)
   139  	PUSHQ(R15)
   140  	PUSHQ(R14)
   141  	PUSHQ(R13)
   142  	PUSHQ(R12)
   143  	PUSHQ(RBX)
   144  	MOVQ(RDX, Mem{Base: RSP}.Offset(-16))
   145  	MOVQ(RCX, Mem{Base: RSP}.Offset(-8))
   146  	TESTQ(RCX, RCX)
   147  	JE(LabelRef("LBB4_13"))
   148  	TESTQ(R8, R8)
   149  	JE(LabelRef("LBB4_13"))
   150  	TESTQ(R9, R9)
   151  	JE(LabelRef("LBB4_13"))
   152  	MOVQ(R9, R12)
   153  	ANDQ(I32(-16), R12)
   154  	MOVQ(Mem{Base: RSP}.Offset(-16), RAX)
   155  	LEAQ(Mem{Base: RAX}.Offset(96), RCX)
   156  	XORQ(R15, R15)
   157  	LEAQ(Mem{Base: R15}.Idx(R9, 8), R11)
   158  	LEAQ(Mem{Base: RDI}.Offset(96), RBX)
   159  	XORL(R14L, R14L)
   160  	JMP(LabelRef("LBB4_4"))
   161  
   162  	Label("LBB4_12")
   163  	{
   164  		ADDQ(Imm(1), R14)
   165  		ADDQ(R11, RBX)
   166  		ADDQ(R11, RDI)
   167  		CMPQ(R14, Mem{Base: RSP}.Offset(-8))
   168  		JE(LabelRef("LBB4_13"))
   169  	}
   170  
   171  	Label("LBB4_4")
   172  	{
   173  		MOVQ(R14, R15)
   174  		IMULQ(R8, R15)
   175  		MOVQ(Mem{Base: RSP}.Offset(-16), R13)
   176  		MOVQ(RCX, RAX)
   177  		XORL(EBP, EBP)
   178  		JMP(LabelRef("LBB4_5"))
   179  	}
   180  
   181  	Label("LBB4_11")
   182  	{
   183  		ADDQ(Imm(1), RBP)
   184  		ADDQ(R11, RAX)
   185  		ADDQ(R11, R13)
   186  		CMPQ(RBP, R8)
   187  		JE(LabelRef("LBB4_12"))
   188  	}
   189  
   190  	Label("LBB4_5")
   191  	{
   192  		LEAQ(Mem{Base: R15}.Idx(RBP, 1), RDX)
   193  		VMOVSD(Mem{Base: RSI}.Idx(RDX, 8), X0)
   194  		CMPQ(R9, Imm(16))
   195  		JAE(LabelRef("LBB4_7"))
   196  		XORL(EDX, EDX)
   197  		JMP(LabelRef("LBB4_10"))
   198  	}
   199  
   200  	Label("LBB4_7")
   201  	{
   202  		VBROADCASTSD(X0, Y1)
   203  		XORL(R10L, R10L)
   204  	}
   205  
   206  	Label("LBB4_8")
   207  	{
   208  		VMOVUPD(Mem{Base: RAX}.Idx(R10, 8).Offset(-96), Y2)
   209  		VMOVUPD(Mem{Base: RAX}.Idx(R10, 8).Offset(-64), Y3)
   210  		VMOVUPD(Mem{Base: RAX}.Idx(R10, 8).Offset(-32), Y4)
   211  		VMOVUPD(Mem{Base: RAX}.Idx(R10, 8), Y5)
   212  		VFMADD213PD(Mem{Base: RBX}.Idx(R10, 8).Offset(-96), Y1, Y2)
   213  		VFMADD213PD(Mem{Base: RBX}.Idx(R10, 8).Offset(-64), Y1, Y3)
   214  		VFMADD213PD(Mem{Base: RBX}.Idx(R10, 8).Offset(-32), Y1, Y4)
   215  		VFMADD213PD(Mem{Base: RBX}.Idx(R10, 8), Y1, Y5)
   216  		VMOVUPD(Y2, Mem{Base: RBX}.Idx(R10, 8).Offset(-96))
   217  		VMOVUPD(Y3, Mem{Base: RBX}.Idx(R10, 8).Offset(-64))
   218  		VMOVUPD(Y4, Mem{Base: RBX}.Idx(R10, 8).Offset(-32))
   219  		VMOVUPD(Y5, Mem{Base: RBX}.Idx(R10, 8))
   220  		ADDQ(Imm(16), R10)
   221  		CMPQ(R12, R10)
   222  		JNE(LabelRef("LBB4_8"))
   223  		MOVQ(R12, RDX)
   224  		CMPQ(R12, R9)
   225  		JE(LabelRef("LBB4_11"))
   226  	}
   227  
   228  	Label("LBB4_10")
   229  	{
   230  		VMOVSD(Mem{Base: R13}.Idx(RDX, 8), X1)
   231  		VFMADD213SD(Mem{Base: RDI}.Idx(RDX, 8), X0, X1)
   232  		VMOVSD(X1, Mem{Base: RDI}.Idx(RDX, 8))
   233  		ADDQ(Imm(1), RDX)
   234  		CMPQ(R9, RDX)
   235  		JNE(LabelRef("LBB4_10"))
   236  		JMP(LabelRef("LBB4_11"))
   237  	}
   238  
   239  	Label("LBB4_13")
   240  	{
   241  		POPQ(RBX)
   242  		POPQ(R12)
   243  		POPQ(R13)
   244  		POPQ(R14)
   245  		POPQ(R15)
   246  		POPQ(RBP)
   247  		VZEROUPPER()
   248  		RET()
   249  	}
   250  }
   251  
   252  func genMatMul_F32() {
   253  
   254  	TEXT("MatMul_AVX2_F32", 0, "func(x, y, z []float32, a, b, c int)")
   255  	Pragma("noescape")
   256  	Load(Param("x").Base(), RDI)
   257  	Load(Param("y").Base(), RSI)
   258  	Load(Param("z").Base(), RDX)
   259  	Load(Param("a"), RCX)
   260  	Load(Param("b"), R8)
   261  	Load(Param("c"), R9)
   262  
   263  	PUSHQ(RBP)
   264  	PUSHQ(R15)
   265  	PUSHQ(R14)
   266  	PUSHQ(R13)
   267  	PUSHQ(R12)
   268  	PUSHQ(RBX)
   269  	MOVQ(RDX, Mem{Base: RSP}.Offset(-16))
   270  	MOVQ(RCX, Mem{Base: RSP}.Offset(-8))
   271  	TESTQ(RCX, RCX)
   272  	JE(LabelRef("LBB5_13"))
   273  	TESTQ(R8, R8)
   274  	JE(LabelRef("LBB5_13"))
   275  	TESTQ(R9, R9)
   276  	JE(LabelRef("LBB5_13"))
   277  	MOVQ(R9, R12)
   278  	ANDQ(I32(-32), R12)
   279  	MOVQ(Mem{Base: RSP}.Offset(-16), RAX)
   280  	LEAQ(Mem{Base: RAX}.Offset(96), RCX)
   281  	XORQ(R15, R15)
   282  	LEAQ(Mem{Base: R15}.Idx(R9, 4), R11)
   283  	LEAQ(Mem{Base: RDI}.Offset(96), RBX)
   284  	XORL(R14L, R14L)
   285  	JMP(LabelRef("LBB5_4"))
   286  
   287  	Label("LBB5_12")
   288  	{
   289  		ADDQ(Imm(1), R14)
   290  		ADDQ(R11, RBX)
   291  		ADDQ(R11, RDI)
   292  		CMPQ(R14, Mem{Base: RSP}.Offset(-8))
   293  		JE(LabelRef("LBB5_13"))
   294  	}
   295  
   296  	Label("LBB5_4")
   297  	{
   298  		MOVQ(R14, R15)
   299  		IMULQ(R8, R15)
   300  		MOVQ(Mem{Base: RSP}.Offset(-16), R13)
   301  		MOVQ(RCX, RAX)
   302  		XORL(EBP, EBP)
   303  		JMP(LabelRef("LBB5_5"))
   304  	}
   305  
   306  	Label("LBB5_11")
   307  	{
   308  		ADDQ(Imm(1), RBP)
   309  		ADDQ(R11, RAX)
   310  		ADDQ(R11, R13)
   311  		CMPQ(RBP, R8)
   312  		JE(LabelRef("LBB5_12"))
   313  	}
   314  
   315  	Label("LBB5_5")
   316  	{
   317  		LEAQ(Mem{Base: R15}.Idx(RBP, 1), RDX)
   318  		VMOVSS(Mem{Base: RSI}.Idx(RDX, 4), X0)
   319  		CMPQ(R9, Imm(32))
   320  		JAE(LabelRef("LBB5_7"))
   321  		XORL(EDX, EDX)
   322  		JMP(LabelRef("LBB5_10"))
   323  	}
   324  
   325  	Label("LBB5_7")
   326  	{
   327  		VBROADCASTSS(X0, Y1)
   328  		XORL(R10L, R10L)
   329  	}
   330  
   331  	Label("LBB5_8")
   332  	{
   333  		VMOVUPS(Mem{Base: RAX}.Idx(R10, 4).Offset(-96), Y2)
   334  		VMOVUPS(Mem{Base: RAX}.Idx(R10, 4).Offset(-64), Y3)
   335  		VMOVUPS(Mem{Base: RAX}.Idx(R10, 4).Offset(-32), Y4)
   336  		VMOVUPS(Mem{Base: RAX}.Idx(R10, 4), Y5)
   337  		VFMADD213PS(Mem{Base: RBX}.Idx(R10, 4).Offset(-96), Y1, Y2)
   338  		VFMADD213PS(Mem{Base: RBX}.Idx(R10, 4).Offset(-64), Y1, Y3)
   339  		VFMADD213PS(Mem{Base: RBX}.Idx(R10, 4).Offset(-32), Y1, Y4)
   340  		VFMADD213PS(Mem{Base: RBX}.Idx(R10, 4), Y1, Y5)
   341  		VMOVUPS(Y2, Mem{Base: RBX}.Idx(R10, 4).Offset(-96))
   342  		VMOVUPS(Y3, Mem{Base: RBX}.Idx(R10, 4).Offset(-64))
   343  		VMOVUPS(Y4, Mem{Base: RBX}.Idx(R10, 4).Offset(-32))
   344  		VMOVUPS(Y5, Mem{Base: RBX}.Idx(R10, 4))
   345  		ADDQ(Imm(32), R10)
   346  		CMPQ(R12, R10)
   347  		JNE(LabelRef("LBB5_8"))
   348  		MOVQ(R12, RDX)
   349  		CMPQ(R12, R9)
   350  		JE(LabelRef("LBB5_11"))
   351  	}
   352  
   353  	Label("LBB5_10")
   354  	{
   355  		VMOVSS(Mem{Base: R13}.Idx(RDX, 4), X1)
   356  		VFMADD213SS(Mem{Base: RDI}.Idx(RDX, 4), X0, X1)
   357  		VMOVSS(X1, Mem{Base: RDI}.Idx(RDX, 4))
   358  		ADDQ(Imm(1), RDX)
   359  		CMPQ(R9, RDX)
   360  		JNE(LabelRef("LBB5_10"))
   361  		JMP(LabelRef("LBB5_11"))
   362  	}
   363  
   364  	Label("LBB5_13")
   365  	{
   366  		POPQ(RBX)
   367  		POPQ(R12)
   368  		POPQ(R13)
   369  		POPQ(R14)
   370  		POPQ(R15)
   371  		POPQ(RBP)
   372  		VZEROUPPER()
   373  		RET()
   374  	}
   375  }
   376  
   377  func genMatMulVec_F64() {
   378  
   379  	TEXT("MatMulVec_AVX2_F64", 0, "func(x, y, z []float64, a, b int)")
   380  	Pragma("noescape")
   381  	Load(Param("x").Base(), RDI)
   382  	Load(Param("y").Base(), RSI)
   383  	Load(Param("z").Base(), RDX)
   384  	Load(Param("a"), RCX)
   385  	Load(Param("b"), R8)
   386  
   387  	PUSHQ(RBX)
   388  	TESTQ(RCX, RCX)
   389  	JE(LabelRef("LBB6_10"))
   390  	TESTQ(R8, R8)
   391  	JE(LabelRef("LBB6_10"))
   392  	MOVQ(R8, R9)
   393  	ANDQ(I32(-16), R9)
   394  	LEAQ(Mem{Base: RSI}.Offset(96), RAX)
   395  	XORQ(R10, R10)
   396  	LEAQ(Mem{Base: R10}.Idx(R8, 8), R10)
   397  	XORL(R11L, R11L)
   398  	JMP(LabelRef("LBB6_3"))
   399  
   400  	Label("LBB6_9")
   401  	{
   402  		VMOVSD(X0, Mem{Base: RDI}.Idx(R11, 8))
   403  		ADDQ(Imm(1), R11)
   404  		ADDQ(R10, RAX)
   405  		ADDQ(R10, RSI)
   406  		CMPQ(R11, RCX)
   407  		JE(LabelRef("LBB6_10"))
   408  	}
   409  
   410  	Label("LBB6_3")
   411  	{
   412  		VMOVQ(Mem{Base: RDI}.Idx(R11, 8), X0)
   413  		CMPQ(R8, Imm(16))
   414  		JAE(LabelRef("LBB6_5"))
   415  		XORL(EBX, EBX)
   416  		JMP(LabelRef("LBB6_8"))
   417  	}
   418  
   419  	Label("LBB6_5")
   420  	{
   421  		VMOVQ(X0, X0)
   422  		VXORPD(X1, X1, X1)
   423  		XORL(EBX, EBX)
   424  		VXORPD(X2, X2, X2)
   425  		VXORPD(X3, X3, X3)
   426  	}
   427  
   428  	Label("LBB6_6")
   429  	{
   430  		VMOVUPD(Mem{Base: RDX}.Idx(RBX, 8), Y4)
   431  		VMOVUPD(Mem{Base: RDX}.Idx(RBX, 8).Offset(32), Y5)
   432  		VMOVUPD(Mem{Base: RDX}.Idx(RBX, 8).Offset(64), Y6)
   433  		VMOVUPD(Mem{Base: RDX}.Idx(RBX, 8).Offset(96), Y7)
   434  		VFMADD231PD(Mem{Base: RAX}.Idx(RBX, 8).Offset(-96), Y4, Y0)
   435  		VFMADD231PD(Mem{Base: RAX}.Idx(RBX, 8).Offset(-64), Y5, Y1)
   436  		VFMADD231PD(Mem{Base: RAX}.Idx(RBX, 8).Offset(-32), Y6, Y2)
   437  		VFMADD231PD(Mem{Base: RAX}.Idx(RBX, 8), Y7, Y3)
   438  		ADDQ(Imm(16), RBX)
   439  		CMPQ(R9, RBX)
   440  		JNE(LabelRef("LBB6_6"))
   441  		VADDPD(Y0, Y1, Y0)
   442  		VADDPD(Y0, Y2, Y0)
   443  		VADDPD(Y0, Y3, Y0)
   444  		VEXTRACTF128(Imm(1), Y0, X1)
   445  		VADDPD(X1, X0, X0)
   446  		VPERMILPD(Imm(1), X0, X1)
   447  		VADDSD(X1, X0, X0)
   448  		MOVQ(R9, RBX)
   449  		CMPQ(R9, R8)
   450  		JE(LabelRef("LBB6_9"))
   451  	}
   452  
   453  	Label("LBB6_8")
   454  	{
   455  		VMOVSD(Mem{Base: RDX}.Idx(RBX, 8), X1)
   456  		VFMADD231SD(Mem{Base: RSI}.Idx(RBX, 8), X1, X0)
   457  		ADDQ(Imm(1), RBX)
   458  		CMPQ(R8, RBX)
   459  		JNE(LabelRef("LBB6_8"))
   460  		JMP(LabelRef("LBB6_9"))
   461  	}
   462  
   463  	Label("LBB6_10")
   464  	{
   465  		POPQ(RBX)
   466  		VZEROUPPER()
   467  		RET()
   468  	}
   469  }
   470  
   471  func genMatMulVec_F32() {
   472  
   473  	TEXT("MatMulVec_AVX2_F32", 0, "func(x, y, z []float32, a, b int)")
   474  	Pragma("noescape")
   475  	Load(Param("x").Base(), RDI)
   476  	Load(Param("y").Base(), RSI)
   477  	Load(Param("z").Base(), RDX)
   478  	Load(Param("a"), RCX)
   479  	Load(Param("b"), R8)
   480  
   481  	PUSHQ(RBX)
   482  	TESTQ(RCX, RCX)
   483  	JE(LabelRef("LBB7_10"))
   484  	TESTQ(R8, R8)
   485  	JE(LabelRef("LBB7_10"))
   486  	MOVQ(R8, R9)
   487  	ANDQ(I32(-32), R9)
   488  	LEAQ(Mem{Base: RSI}.Offset(96), RAX)
   489  	XORQ(R10, R10)
   490  	LEAQ(Mem{Base: R10}.Idx(R8, 4), R10)
   491  	XORL(R11L, R11L)
   492  	VXORPS(X0, X0, X0)
   493  	JMP(LabelRef("LBB7_3"))
   494  
   495  	Label("LBB7_9")
   496  	{
   497  		VMOVSS(X1, Mem{Base: RDI}.Idx(R11, 4))
   498  		ADDQ(Imm(1), R11)
   499  		ADDQ(R10, RAX)
   500  		ADDQ(R10, RSI)
   501  		CMPQ(R11, RCX)
   502  		JE(LabelRef("LBB7_10"))
   503  	}
   504  
   505  	Label("LBB7_3")
   506  	{
   507  		VMOVSS(Mem{Base: RDI}.Idx(R11, 4), X1)
   508  		CMPQ(R8, Imm(32))
   509  		JAE(LabelRef("LBB7_5"))
   510  		XORL(EBX, EBX)
   511  		JMP(LabelRef("LBB7_8"))
   512  	}
   513  
   514  	Label("LBB7_5")
   515  	{
   516  		VBLENDPS(Imm(1), X1, X0, X1)
   517  		VXORPS(X2, X2, X2)
   518  		XORL(EBX, EBX)
   519  		VXORPS(X3, X3, X3)
   520  		VXORPS(X4, X4, X4)
   521  	}
   522  
   523  	Label("LBB7_6")
   524  	{
   525  		VMOVUPS(Mem{Base: RDX}.Idx(RBX, 4), Y5)
   526  		VMOVUPS(Mem{Base: RDX}.Idx(RBX, 4).Offset(32), Y6)
   527  		VMOVUPS(Mem{Base: RDX}.Idx(RBX, 4).Offset(64), Y7)
   528  		VMOVUPS(Mem{Base: RDX}.Idx(RBX, 4).Offset(96), Y8)
   529  		VFMADD231PS(Mem{Base: RAX}.Idx(RBX, 4).Offset(-96), Y5, Y1)
   530  		VFMADD231PS(Mem{Base: RAX}.Idx(RBX, 4).Offset(-64), Y6, Y2)
   531  		VFMADD231PS(Mem{Base: RAX}.Idx(RBX, 4).Offset(-32), Y7, Y3)
   532  		VFMADD231PS(Mem{Base: RAX}.Idx(RBX, 4), Y8, Y4)
   533  		ADDQ(Imm(32), RBX)
   534  		CMPQ(R9, RBX)
   535  		JNE(LabelRef("LBB7_6"))
   536  		VADDPS(Y1, Y2, Y1)
   537  		VADDPS(Y1, Y3, Y1)
   538  		VADDPS(Y1, Y4, Y1)
   539  		VEXTRACTF128(Imm(1), Y1, X2)
   540  		VADDPS(X2, X1, X1)
   541  		VPERMILPD(Imm(1), X1, X2)
   542  		VADDPS(X2, X1, X1)
   543  		VMOVSHDUP(X1, X2)
   544  		VADDSS(X2, X1, X1)
   545  		MOVQ(R9, RBX)
   546  		CMPQ(R9, R8)
   547  		JE(LabelRef("LBB7_9"))
   548  	}
   549  
   550  	Label("LBB7_8")
   551  	{
   552  		VMOVSS(Mem{Base: RDX}.Idx(RBX, 4), X2)
   553  		VFMADD231SS(Mem{Base: RSI}.Idx(RBX, 4), X2, X1)
   554  		ADDQ(Imm(1), RBX)
   555  		CMPQ(R8, RBX)
   556  		JNE(LabelRef("LBB7_8"))
   557  		JMP(LabelRef("LBB7_9"))
   558  	}
   559  
   560  	Label("LBB7_10")
   561  	{
   562  		POPQ(RBX)
   563  		VZEROUPPER()
   564  		RET()
   565  	}
   566  }
   567  
   568  func genMatMulTiled_F64() {
   569  
   570  	TEXT("MatMulTiled_AVX2_F64", 0, "func(x, y, z []float64, a, b, c int)")
   571  	Pragma("noescape")
   572  	Load(Param("x").Base(), RDI)
   573  	Load(Param("y").Base(), RSI)
   574  	Load(Param("z").Base(), RDX)
   575  	Load(Param("a"), RCX)
   576  	Load(Param("b"), R8)
   577  	Load(Param("c"), R9)
   578  
   579  	PUSHQ(RBP)
   580  	PUSHQ(R15)
   581  	PUSHQ(R14)
   582  	PUSHQ(R13)
   583  	PUSHQ(R12)
   584  	PUSHQ(RBX)
   585  	SUBQ(Imm(72), RSP)
   586  	MOVQ(R9, Mem{Base: RSP}.Offset(-128))
   587  	MOVQ(R8, Mem{Base: RSP}.Offset(-104))
   588  	MOVQ(RDX, Mem{Base: RSP}.Offset(-88))
   589  	MOVQ(RDI, Mem{Base: RSP}.Offset(-112))
   590  	MOVQ(RCX, Mem{Base: RSP}.Offset(-64))
   591  	ADDQ(Imm(7), RCX)
   592  	MOVQ(RCX, Mem{Base: RSP}.Offset(-72))
   593  	JE(LabelRef("LBB8_21"))
   594  	MOVQ(Mem{Base: RSP}.Offset(-104), RAX)
   595  	ADDQ(Imm(255), RAX)
   596  	MOVQ(RAX, Mem{Base: RSP}.Offset(8))
   597  	JE(LabelRef("LBB8_21"))
   598  	MOVQ(Mem{Base: RSP}.Offset(-128), RAX)
   599  	ADDQ(Imm(255), RAX)
   600  	MOVQ(RAX, Mem{Base: RSP}.Offset(-40))
   601  	JE(LabelRef("LBB8_21"))
   602  	MOVQ(Mem{Base: RSP}.Offset(-88), RAX)
   603  	ADDQ(Imm(96), RAX)
   604  	MOVQ(RAX, Mem{Base: RSP}.Offset(-48))
   605  	MOVQ(Mem{Base: RSP}.Offset(-128), RAX)
   606  	XORQ(R15, R15)
   607  	LEAQ(Mem{Base: R15}.Idx(RAX, 8), RBX)
   608  	MOVQ(Mem{Base: RSP}.Offset(-112), RCX)
   609  	ADDQ(Imm(96), RCX)
   610  	MOVQ(RCX, Mem{Base: RSP}.Offset(-96))
   611  	SHLQ(Imm(6), RAX)
   612  	MOVQ(RAX, Mem{Base: RSP}.Offset(-80))
   613  	XORL(EDX, EDX)
   614  	JMP(LabelRef("LBB8_4"))
   615  
   616  	Label("LBB8_20")
   617  	{
   618  		MOVQ(Mem{Base: RSP}.Offset(-80), RAX)
   619  		ADDQ(RAX, Mem{Base: RSP}.Offset(-96))
   620  		ADDQ(RAX, Mem{Base: RSP}.Offset(-112))
   621  		MOVQ(Mem{Base: RSP}.Offset(-56), RAX)
   622  		MOVQ(RAX, RDX)
   623  		CMPQ(RAX, Mem{Base: RSP}.Offset(-72))
   624  		JAE(LabelRef("LBB8_21"))
   625  	}
   626  
   627  	Label("LBB8_4")
   628  	{
   629  		LEAQ(Mem{Base: RDX}.Offset(8), RAX)
   630  		MOVQ(Mem{Base: RSP}.Offset(-64), RCX)
   631  		CMPQ(RAX, RCX)
   632  		MOVQ(RAX, Mem{Base: RSP}.Offset(-56))
   633  		CMOVQGT(RCX, RAX)
   634  		CDQE()
   635  		MOVQ(RDX, Mem{Base: RSP}.Offset(-16))
   636  		MOVQ(RAX, Mem{Base: RSP}.Offset(24))
   637  		CMPQ(RDX, RAX)
   638  		JAE(LabelRef("LBB8_20"))
   639  		XORL(EAX, EAX)
   640  		MOVQ(RAX, Mem{Base: RSP}.Offset(-120))
   641  		MOVL(I32(256), EDX)
   642  		XORL(EAX, EAX)
   643  		JMP(LabelRef("LBB8_6"))
   644  	}
   645  
   646  	Label("LBB8_19")
   647  	{
   648  		MOVQ(Mem{Base: RSP}.Offset(-120), RAX)
   649  		ADDL(Imm(1), EAX)
   650  		MOVQ(RAX, Mem{Base: RSP}.Offset(-120))
   651  		MOVQ(Mem{Base: RSP}.Offset(-24), RDX)
   652  		ADDQ(I32(256), RDX)
   653  		MOVQ(Mem{Base: RSP}.Offset(-32), RAX)
   654  		CMPQ(RAX, Mem{Base: RSP}.Offset(-40))
   655  		JAE(LabelRef("LBB8_20"))
   656  	}
   657  
   658  	Label("LBB8_6")
   659  	{
   660  		MOVL(EAX, EDI)
   661  		MOVQ(Mem{Base: RSP}.Offset(-128), RBP)
   662  		CMPQ(RBP, RDX)
   663  		MOVQ(RDX, Mem{Base: RSP}.Offset(-24))
   664  		CMOVQLT(RBP, RDX)
   665  		ADDQ(I32(256), RAX)
   666  		CMPQ(RBP, RAX)
   667  		MOVQ(RAX, RCX)
   668  		CMOVQLT(RBP, RCX)
   669  		MOVQ(RAX, Mem{Base: RSP}.Offset(-32))
   670  		CMOVQLT(RBP, RAX)
   671  		CMPL(EDI, EAX)
   672  		JGE(LabelRef("LBB8_19"))
   673  		MOVLQSX(EDI, R14)
   674  		MOVQ(Mem{Base: RSP}.Offset(-96), RDI)
   675  		LEAQ(Mem{Base: RDI}.Idx(R14, 8), RDI)
   676  		MOVQ(RDI, Mem{Base: RSP})
   677  		MOVLQSX(EDX, R11)
   678  		SUBQ(R14, R11)
   679  		ANDQ(I32(-16), R11)
   680  		MOVLQSX(ECX, R12)
   681  		MOVQ(Mem{Base: RSP}.Offset(-120), RCX)
   682  		SHLL(Imm(8), ECX)
   683  		MOVLQSX(ECX, RCX)
   684  		SUBQ(RCX, R12)
   685  		MOVLQSX(EAX, RDX)
   686  		MOVQ(R12, RCX)
   687  		ANDQ(I32(-16), RCX)
   688  		MOVQ(Mem{Base: RSP}.Offset(-48), RAX)
   689  		LEAQ(Mem{Base: RAX}.Idx(R14, 8), RAX)
   690  		MOVQ(RAX, Mem{Base: RSP}.Offset(-8))
   691  		MOVQ(R14, R13)
   692  		MOVQ(RCX, Mem{Base: RSP}.Offset(64))
   693  		ADDQ(RCX, R13)
   694  		XORL(EAX, EAX)
   695  		JMP(LabelRef("LBB8_8"))
   696  	}
   697  
   698  	Label("LBB8_18")
   699  	{
   700  		MOVQ(Mem{Base: RSP}.Offset(16), RAX)
   701  		CMPQ(RAX, Mem{Base: RSP}.Offset(8))
   702  		JAE(LabelRef("LBB8_19"))
   703  	}
   704  
   705  	Label("LBB8_8")
   706  	{
   707  		MOVL(EAX, ECX)
   708  		ADDQ(I32(256), RAX)
   709  		MOVQ(Mem{Base: RSP}.Offset(-104), RDI)
   710  		CMPQ(RAX, RDI)
   711  		MOVQ(RAX, Mem{Base: RSP}.Offset(16))
   712  		CMOVQGT(RDI, RAX)
   713  		CMPL(ECX, EAX)
   714  		JGE(LabelRef("LBB8_18"))
   715  		MOVLQSX(ECX, RDI)
   716  		MOVQ(Mem{Base: RSP}.Offset(-128), RCX)
   717  		MOVQ(RDI, Mem{Base: RSP}.Offset(48))
   718  		IMULQ(RDI, RCX)
   719  		MOVQ(Mem{Base: RSP}.Offset(-88), RDI)
   720  		LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RDI)
   721  		MOVQ(RDI, Mem{Base: RSP}.Offset(40))
   722  		MOVQ(Mem{Base: RSP}.Offset(-8), RDI)
   723  		LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RCX)
   724  		MOVQ(RCX, Mem{Base: RSP}.Offset(32))
   725  		CDQE()
   726  		MOVQ(Mem{Base: RSP}.Offset(-112), RCX)
   727  		MOVQ(Mem{Base: RSP}, R10)
   728  		MOVQ(Mem{Base: RSP}.Offset(-16), R8)
   729  		JMP(LabelRef("LBB8_10"))
   730  	}
   731  
   732  	Label("LBB8_17")
   733  	{
   734  		MOVQ(Mem{Base: RSP}.Offset(56), R8)
   735  		ADDQ(Imm(1), R8)
   736  		ADDQ(RBX, R10)
   737  		ADDQ(RBX, RCX)
   738  		CMPQ(R8, Mem{Base: RSP}.Offset(24))
   739  		JAE(LabelRef("LBB8_18"))
   740  	}
   741  
   742  	Label("LBB8_10")
   743  	{
   744  		MOVQ(R8, Mem{Base: RSP}.Offset(56))
   745  		IMULQ(Mem{Base: RSP}.Offset(-104), R8)
   746  		MOVQ(Mem{Base: RSP}.Offset(40), R15)
   747  		MOVQ(Mem{Base: RSP}.Offset(32), RDI)
   748  		MOVQ(Mem{Base: RSP}.Offset(48), R9)
   749  		JMP(LabelRef("LBB8_11"))
   750  	}
   751  
   752  	Label("LBB8_16")
   753  	{
   754  		ADDQ(Imm(1), R9)
   755  		ADDQ(RBX, RDI)
   756  		ADDQ(RBX, R15)
   757  		CMPQ(R9, RAX)
   758  		JGE(LabelRef("LBB8_17"))
   759  	}
   760  
   761  	Label("LBB8_11")
   762  	{
   763  		LEAQ(Mem{Base: R9}.Idx(R8, 1), RBP)
   764  		VMOVSD(Mem{Base: RSI}.Idx(RBP, 8), X0)
   765  		MOVQ(R14, RBP)
   766  		CMPQ(R12, Imm(16))
   767  		JB(LabelRef("LBB8_15"))
   768  		VBROADCASTSD(X0, Y1)
   769  		XORL(EBP, EBP)
   770  	}
   771  
   772  	Label("LBB8_13")
   773  	{
   774  		VMOVUPD(Mem{Base: RDI}.Idx(RBP, 8).Offset(-96), Y2)
   775  		VMOVUPD(Mem{Base: RDI}.Idx(RBP, 8).Offset(-64), Y3)
   776  		VMOVUPD(Mem{Base: RDI}.Idx(RBP, 8).Offset(-32), Y4)
   777  		VMOVUPD(Mem{Base: RDI}.Idx(RBP, 8), Y5)
   778  		VFMADD213PD(Mem{Base: R10}.Idx(RBP, 8).Offset(-96), Y1, Y2)
   779  		VFMADD213PD(Mem{Base: R10}.Idx(RBP, 8).Offset(-64), Y1, Y3)
   780  		VFMADD213PD(Mem{Base: R10}.Idx(RBP, 8).Offset(-32), Y1, Y4)
   781  		VFMADD213PD(Mem{Base: R10}.Idx(RBP, 8), Y1, Y5)
   782  		VMOVUPD(Y2, Mem{Base: R10}.Idx(RBP, 8).Offset(-96))
   783  		VMOVUPD(Y3, Mem{Base: R10}.Idx(RBP, 8).Offset(-64))
   784  		VMOVUPD(Y4, Mem{Base: R10}.Idx(RBP, 8).Offset(-32))
   785  		VMOVUPD(Y5, Mem{Base: R10}.Idx(RBP, 8))
   786  		ADDQ(Imm(16), RBP)
   787  		CMPQ(R11, RBP)
   788  		JNE(LabelRef("LBB8_13"))
   789  		MOVQ(R13, RBP)
   790  		CMPQ(R12, Mem{Base: RSP}.Offset(64))
   791  		JE(LabelRef("LBB8_16"))
   792  	}
   793  
   794  	Label("LBB8_15")
   795  	{
   796  		VMOVSD(Mem{Base: R15}.Idx(RBP, 8), X1)
   797  		VFMADD213SD(Mem{Base: RCX}.Idx(RBP, 8), X0, X1)
   798  		VMOVSD(X1, Mem{Base: RCX}.Idx(RBP, 8))
   799  		ADDQ(Imm(1), RBP)
   800  		CMPQ(RBP, RDX)
   801  		JL(LabelRef("LBB8_15"))
   802  		JMP(LabelRef("LBB8_16"))
   803  	}
   804  
   805  	Label("LBB8_21")
   806  	{
   807  		ADDQ(Imm(72), RSP)
   808  		POPQ(RBX)
   809  		POPQ(R12)
   810  		POPQ(R13)
   811  		POPQ(R14)
   812  		POPQ(R15)
   813  		POPQ(RBP)
   814  		VZEROUPPER()
   815  		RET()
   816  	}
   817  }
   818  
   819  func genMatMulTiled_F32() {
   820  
   821  	TEXT("MatMulTiled_AVX2_F32", 0, "func(x, y, z []float32, a, b, c int)")
   822  	Pragma("noescape")
   823  	Load(Param("x").Base(), RDI)
   824  	Load(Param("y").Base(), RSI)
   825  	Load(Param("z").Base(), RDX)
   826  	Load(Param("a"), RCX)
   827  	Load(Param("b"), R8)
   828  	Load(Param("c"), R9)
   829  
   830  	PUSHQ(RBP)
   831  	PUSHQ(R15)
   832  	PUSHQ(R14)
   833  	PUSHQ(R13)
   834  	PUSHQ(R12)
   835  	PUSHQ(RBX)
   836  	SUBQ(Imm(72), RSP)
   837  	MOVQ(R9, Mem{Base: RSP}.Offset(-128))
   838  	MOVQ(R8, Mem{Base: RSP}.Offset(-104))
   839  	MOVQ(RDX, Mem{Base: RSP}.Offset(-88))
   840  	MOVQ(RDI, Mem{Base: RSP}.Offset(-112))
   841  	MOVQ(RCX, Mem{Base: RSP}.Offset(-64))
   842  	ADDQ(Imm(7), RCX)
   843  	MOVQ(RCX, Mem{Base: RSP}.Offset(-72))
   844  	JE(LabelRef("LBB9_21"))
   845  	MOVQ(Mem{Base: RSP}.Offset(-104), RAX)
   846  	ADDQ(Imm(255), RAX)
   847  	MOVQ(RAX, Mem{Base: RSP}.Offset(8))
   848  	JE(LabelRef("LBB9_21"))
   849  	MOVQ(Mem{Base: RSP}.Offset(-128), RAX)
   850  	ADDQ(Imm(255), RAX)
   851  	MOVQ(RAX, Mem{Base: RSP}.Offset(-40))
   852  	JE(LabelRef("LBB9_21"))
   853  	MOVQ(Mem{Base: RSP}.Offset(-88), RAX)
   854  	ADDQ(Imm(96), RAX)
   855  	MOVQ(RAX, Mem{Base: RSP}.Offset(-48))
   856  	MOVQ(Mem{Base: RSP}.Offset(-128), RAX)
   857  	XORQ(R15, R15)
   858  	LEAQ(Mem{Base: R15}.Idx(RAX, 4), RBX)
   859  	MOVQ(Mem{Base: RSP}.Offset(-112), RCX)
   860  	ADDQ(Imm(96), RCX)
   861  	MOVQ(RCX, Mem{Base: RSP}.Offset(-96))
   862  	SHLQ(Imm(5), RAX)
   863  	MOVQ(RAX, Mem{Base: RSP}.Offset(-80))
   864  	XORL(EDX, EDX)
   865  	JMP(LabelRef("LBB9_4"))
   866  
   867  	Label("LBB9_20")
   868  	{
   869  		MOVQ(Mem{Base: RSP}.Offset(-80), RAX)
   870  		ADDQ(RAX, Mem{Base: RSP}.Offset(-96))
   871  		ADDQ(RAX, Mem{Base: RSP}.Offset(-112))
   872  		MOVQ(Mem{Base: RSP}.Offset(-56), RAX)
   873  		MOVQ(RAX, RDX)
   874  		CMPQ(RAX, Mem{Base: RSP}.Offset(-72))
   875  		JAE(LabelRef("LBB9_21"))
   876  	}
   877  
   878  	Label("LBB9_4")
   879  	{
   880  		LEAQ(Mem{Base: RDX}.Offset(8), RAX)
   881  		MOVQ(Mem{Base: RSP}.Offset(-64), RCX)
   882  		CMPQ(RAX, RCX)
   883  		MOVQ(RAX, Mem{Base: RSP}.Offset(-56))
   884  		CMOVQGT(RCX, RAX)
   885  		CDQE()
   886  		MOVQ(RDX, Mem{Base: RSP}.Offset(-16))
   887  		MOVQ(RAX, Mem{Base: RSP}.Offset(24))
   888  		CMPQ(RDX, RAX)
   889  		JAE(LabelRef("LBB9_20"))
   890  		XORL(EAX, EAX)
   891  		MOVQ(RAX, Mem{Base: RSP}.Offset(-120))
   892  		MOVL(I32(256), EDX)
   893  		XORL(EAX, EAX)
   894  		JMP(LabelRef("LBB9_6"))
   895  	}
   896  
   897  	Label("LBB9_19")
   898  	{
   899  		MOVQ(Mem{Base: RSP}.Offset(-120), RAX)
   900  		ADDL(Imm(1), EAX)
   901  		MOVQ(RAX, Mem{Base: RSP}.Offset(-120))
   902  		MOVQ(Mem{Base: RSP}.Offset(-24), RDX)
   903  		ADDQ(I32(256), RDX)
   904  		MOVQ(Mem{Base: RSP}.Offset(-32), RAX)
   905  		CMPQ(RAX, Mem{Base: RSP}.Offset(-40))
   906  		JAE(LabelRef("LBB9_20"))
   907  	}
   908  
   909  	Label("LBB9_6")
   910  	{
   911  		MOVL(EAX, EDI)
   912  		MOVQ(Mem{Base: RSP}.Offset(-128), RBP)
   913  		CMPQ(RBP, RDX)
   914  		MOVQ(RDX, Mem{Base: RSP}.Offset(-24))
   915  		CMOVQLT(RBP, RDX)
   916  		ADDQ(I32(256), RAX)
   917  		CMPQ(RBP, RAX)
   918  		MOVQ(RAX, RCX)
   919  		CMOVQLT(RBP, RCX)
   920  		MOVQ(RAX, Mem{Base: RSP}.Offset(-32))
   921  		CMOVQLT(RBP, RAX)
   922  		CMPL(EDI, EAX)
   923  		JGE(LabelRef("LBB9_19"))
   924  		MOVLQSX(EDI, R14)
   925  		MOVQ(Mem{Base: RSP}.Offset(-96), RDI)
   926  		LEAQ(Mem{Base: RDI}.Idx(R14, 4), RDI)
   927  		MOVQ(RDI, Mem{Base: RSP})
   928  		MOVLQSX(EDX, R11)
   929  		SUBQ(R14, R11)
   930  		ANDQ(I32(-32), R11)
   931  		MOVLQSX(ECX, R12)
   932  		MOVQ(Mem{Base: RSP}.Offset(-120), RCX)
   933  		SHLL(Imm(8), ECX)
   934  		MOVLQSX(ECX, RCX)
   935  		SUBQ(RCX, R12)
   936  		MOVLQSX(EAX, RDX)
   937  		MOVQ(R12, RCX)
   938  		ANDQ(I32(-32), RCX)
   939  		MOVQ(Mem{Base: RSP}.Offset(-48), RAX)
   940  		LEAQ(Mem{Base: RAX}.Idx(R14, 4), RAX)
   941  		MOVQ(RAX, Mem{Base: RSP}.Offset(-8))
   942  		MOVQ(R14, R13)
   943  		MOVQ(RCX, Mem{Base: RSP}.Offset(64))
   944  		ADDQ(RCX, R13)
   945  		XORL(EAX, EAX)
   946  		JMP(LabelRef("LBB9_8"))
   947  	}
   948  
   949  	Label("LBB9_18")
   950  	{
   951  		MOVQ(Mem{Base: RSP}.Offset(16), RAX)
   952  		CMPQ(RAX, Mem{Base: RSP}.Offset(8))
   953  		JAE(LabelRef("LBB9_19"))
   954  	}
   955  
   956  	Label("LBB9_8")
   957  	{
   958  		MOVL(EAX, ECX)
   959  		ADDQ(I32(256), RAX)
   960  		MOVQ(Mem{Base: RSP}.Offset(-104), RDI)
   961  		CMPQ(RAX, RDI)
   962  		MOVQ(RAX, Mem{Base: RSP}.Offset(16))
   963  		CMOVQGT(RDI, RAX)
   964  		CMPL(ECX, EAX)
   965  		JGE(LabelRef("LBB9_18"))
   966  		MOVLQSX(ECX, RDI)
   967  		MOVQ(Mem{Base: RSP}.Offset(-128), RCX)
   968  		MOVQ(RDI, Mem{Base: RSP}.Offset(48))
   969  		IMULQ(RDI, RCX)
   970  		MOVQ(Mem{Base: RSP}.Offset(-88), RDI)
   971  		LEAQ(Mem{Base: RDI}.Idx(RCX, 4), RDI)
   972  		MOVQ(RDI, Mem{Base: RSP}.Offset(40))
   973  		MOVQ(Mem{Base: RSP}.Offset(-8), RDI)
   974  		LEAQ(Mem{Base: RDI}.Idx(RCX, 4), RCX)
   975  		MOVQ(RCX, Mem{Base: RSP}.Offset(32))
   976  		CDQE()
   977  		MOVQ(Mem{Base: RSP}.Offset(-112), RCX)
   978  		MOVQ(Mem{Base: RSP}, R10)
   979  		MOVQ(Mem{Base: RSP}.Offset(-16), R8)
   980  		JMP(LabelRef("LBB9_10"))
   981  	}
   982  
   983  	Label("LBB9_17")
   984  	{
   985  		MOVQ(Mem{Base: RSP}.Offset(56), R8)
   986  		ADDQ(Imm(1), R8)
   987  		ADDQ(RBX, R10)
   988  		ADDQ(RBX, RCX)
   989  		CMPQ(R8, Mem{Base: RSP}.Offset(24))
   990  		JAE(LabelRef("LBB9_18"))
   991  	}
   992  
   993  	Label("LBB9_10")
   994  	{
   995  		MOVQ(R8, Mem{Base: RSP}.Offset(56))
   996  		IMULQ(Mem{Base: RSP}.Offset(-104), R8)
   997  		MOVQ(Mem{Base: RSP}.Offset(40), R15)
   998  		MOVQ(Mem{Base: RSP}.Offset(32), RDI)
   999  		MOVQ(Mem{Base: RSP}.Offset(48), R9)
  1000  		JMP(LabelRef("LBB9_11"))
  1001  	}
  1002  
  1003  	Label("LBB9_16")
  1004  	{
  1005  		ADDQ(Imm(1), R9)
  1006  		ADDQ(RBX, RDI)
  1007  		ADDQ(RBX, R15)
  1008  		CMPQ(R9, RAX)
  1009  		JGE(LabelRef("LBB9_17"))
  1010  	}
  1011  
  1012  	Label("LBB9_11")
  1013  	{
  1014  		LEAQ(Mem{Base: R9}.Idx(R8, 1), RBP)
  1015  		VMOVSS(Mem{Base: RSI}.Idx(RBP, 4), X0)
  1016  		MOVQ(R14, RBP)
  1017  		CMPQ(R12, Imm(32))
  1018  		JB(LabelRef("LBB9_15"))
  1019  		VBROADCASTSS(X0, Y1)
  1020  		XORL(EBP, EBP)
  1021  	}
  1022  
  1023  	Label("LBB9_13")
  1024  	{
  1025  		VMOVUPS(Mem{Base: RDI}.Idx(RBP, 4).Offset(-96), Y2)
  1026  		VMOVUPS(Mem{Base: RDI}.Idx(RBP, 4).Offset(-64), Y3)
  1027  		VMOVUPS(Mem{Base: RDI}.Idx(RBP, 4).Offset(-32), Y4)
  1028  		VMOVUPS(Mem{Base: RDI}.Idx(RBP, 4), Y5)
  1029  		VFMADD213PS(Mem{Base: R10}.Idx(RBP, 4).Offset(-96), Y1, Y2)
  1030  		VFMADD213PS(Mem{Base: R10}.Idx(RBP, 4).Offset(-64), Y1, Y3)
  1031  		VFMADD213PS(Mem{Base: R10}.Idx(RBP, 4).Offset(-32), Y1, Y4)
  1032  		VFMADD213PS(Mem{Base: R10}.Idx(RBP, 4), Y1, Y5)
  1033  		VMOVUPS(Y2, Mem{Base: R10}.Idx(RBP, 4).Offset(-96))
  1034  		VMOVUPS(Y3, Mem{Base: R10}.Idx(RBP, 4).Offset(-64))
  1035  		VMOVUPS(Y4, Mem{Base: R10}.Idx(RBP, 4).Offset(-32))
  1036  		VMOVUPS(Y5, Mem{Base: R10}.Idx(RBP, 4))
  1037  		ADDQ(Imm(32), RBP)
  1038  		CMPQ(R11, RBP)
  1039  		JNE(LabelRef("LBB9_13"))
  1040  		MOVQ(R13, RBP)
  1041  		CMPQ(R12, Mem{Base: RSP}.Offset(64))
  1042  		JE(LabelRef("LBB9_16"))
  1043  	}
  1044  
  1045  	Label("LBB9_15")
  1046  	{
  1047  		VMOVSS(Mem{Base: R15}.Idx(RBP, 4), X1)
  1048  		VFMADD213SS(Mem{Base: RCX}.Idx(RBP, 4), X0, X1)
  1049  		VMOVSS(X1, Mem{Base: RCX}.Idx(RBP, 4))
  1050  		ADDQ(Imm(1), RBP)
  1051  		CMPQ(RBP, RDX)
  1052  		JL(LabelRef("LBB9_15"))
  1053  		JMP(LabelRef("LBB9_16"))
  1054  	}
  1055  
  1056  	Label("LBB9_21")
  1057  	{
  1058  		ADDQ(Imm(72), RSP)
  1059  		POPQ(RBX)
  1060  		POPQ(R12)
  1061  		POPQ(R13)
  1062  		POPQ(R14)
  1063  		POPQ(R15)
  1064  		POPQ(RBP)
  1065  		VZEROUPPER()
  1066  		RET()
  1067  	}
  1068  }