gitee.com/quant1x/gox@v1.7.6/num/asm/aggregates.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 genSum_F64() {
    10  
    11  	TEXT("Sum_AVX2_F64", NOSPLIT, "func(x []float64) float64")
    12  	Pragma("noescape")
    13  	Load(Param("x").Base(), RDI)
    14  	Load(Param("x").Len(), RSI)
    15  
    16  	TESTQ(RSI, RSI)
    17  	JE(LabelRef("LBB0_1"))
    18  	CMPQ(RSI, Imm(16))
    19  	JAE(LabelRef("LBB0_4"))
    20  	VXORPD(X0, X0, X0)
    21  	XORL(EAX, EAX)
    22  	JMP(LabelRef("LBB0_11"))
    23  
    24  	Label("LBB0_1")
    25  	{
    26  		VXORPS(X0, X0, X0)
    27  		Store(X0, ReturnIndex(0))
    28  		RET()
    29  	}
    30  
    31  	Label("LBB0_4")
    32  	{
    33  		MOVQ(RSI, RAX)
    34  		ANDQ(I32(-16), RAX)
    35  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
    36  		MOVQ(RCX, R8)
    37  		SHRQ(Imm(4), R8)
    38  		ADDQ(Imm(1), R8)
    39  		TESTQ(RCX, RCX)
    40  		JE(LabelRef("LBB0_5"))
    41  		MOVQ(R8, RCX)
    42  		ANDQ(I32(-2), RCX)
    43  		VXORPD(X0, X0, X0)
    44  		XORL(EDX, EDX)
    45  		VXORPD(X1, X1, X1)
    46  		VXORPD(X2, X2, X2)
    47  		VXORPD(X3, X3, X3)
    48  	}
    49  
    50  	Label("LBB0_7")
    51  	{
    52  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0)
    53  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1)
    54  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2)
    55  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3)
    56  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(128), Y0, Y0)
    57  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(160), Y1, Y1)
    58  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(192), Y2, Y2)
    59  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(224), Y3, Y3)
    60  		ADDQ(Imm(32), RDX)
    61  		ADDQ(I32(-2), RCX)
    62  		JNE(LabelRef("LBB0_7"))
    63  		TESTB(Imm(1), R8B)
    64  		JE(LabelRef("LBB0_10"))
    65  	}
    66  
    67  	Label("LBB0_9")
    68  	{
    69  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0)
    70  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1)
    71  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2)
    72  		VADDPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3)
    73  	}
    74  
    75  	Label("LBB0_10")
    76  	{
    77  		VADDPD(Y3, Y1, Y1)
    78  		VADDPD(Y2, Y0, Y0)
    79  		VADDPD(Y1, Y0, Y0)
    80  		VEXTRACTF128(Imm(1), Y0, X1)
    81  		VADDPD(X1, X0, X0)
    82  		VPERMILPD(Imm(1), X0, X1)
    83  		VADDSD(X1, X0, X0)
    84  		CMPQ(RAX, RSI)
    85  		JE(LabelRef("LBB0_12"))
    86  	}
    87  
    88  	Label("LBB0_11")
    89  	{
    90  		VADDSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X0)
    91  		ADDQ(Imm(1), RAX)
    92  		CMPQ(RSI, RAX)
    93  		JNE(LabelRef("LBB0_11"))
    94  	}
    95  
    96  	Label("LBB0_12")
    97  	{
    98  		VZEROUPPER()
    99  		Store(X0, ReturnIndex(0))
   100  		RET()
   101  	}
   102  
   103  	Label("LBB0_5")
   104  	{
   105  		VXORPD(X0, X0, X0)
   106  		XORL(EDX, EDX)
   107  		VXORPD(X1, X1, X1)
   108  		VXORPD(X2, X2, X2)
   109  		VXORPD(X3, X3, X3)
   110  		TESTB(Imm(1), R8B)
   111  		JNE(LabelRef("LBB0_9"))
   112  		JMP(LabelRef("LBB0_10"))
   113  	}
   114  }
   115  
   116  func genSum_F32() {
   117  
   118  	TEXT("Sum_AVX2_F32", NOSPLIT, "func(x []float32) float32")
   119  	Pragma("noescape")
   120  	Load(Param("x").Base(), RDI)
   121  	Load(Param("x").Len(), RSI)
   122  
   123  	TESTQ(RSI, RSI)
   124  	JE(LabelRef("LBB1_1"))
   125  	CMPQ(RSI, Imm(32))
   126  	JAE(LabelRef("LBB1_4"))
   127  	VXORPS(X0, X0, X0)
   128  	XORL(EAX, EAX)
   129  	JMP(LabelRef("LBB1_11"))
   130  
   131  	Label("LBB1_1")
   132  	{
   133  		VXORPS(X0, X0, X0)
   134  		Store(X0, ReturnIndex(0))
   135  		RET()
   136  	}
   137  
   138  	Label("LBB1_4")
   139  	{
   140  		MOVQ(RSI, RAX)
   141  		ANDQ(I32(-32), RAX)
   142  		LEAQ(Mem{Base: RAX}.Offset(-32), RCX)
   143  		MOVQ(RCX, R8)
   144  		SHRQ(Imm(5), R8)
   145  		ADDQ(Imm(1), R8)
   146  		TESTQ(RCX, RCX)
   147  		JE(LabelRef("LBB1_5"))
   148  		MOVQ(R8, RCX)
   149  		ANDQ(I32(-2), RCX)
   150  		VXORPS(X0, X0, X0)
   151  		XORL(EDX, EDX)
   152  		VXORPS(X1, X1, X1)
   153  		VXORPS(X2, X2, X2)
   154  		VXORPS(X3, X3, X3)
   155  	}
   156  
   157  	Label("LBB1_7")
   158  	{
   159  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0)
   160  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1)
   161  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2)
   162  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3)
   163  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(128), Y0, Y0)
   164  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(160), Y1, Y1)
   165  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(192), Y2, Y2)
   166  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(224), Y3, Y3)
   167  		ADDQ(Imm(64), RDX)
   168  		ADDQ(I32(-2), RCX)
   169  		JNE(LabelRef("LBB1_7"))
   170  		TESTB(Imm(1), R8B)
   171  		JE(LabelRef("LBB1_10"))
   172  	}
   173  
   174  	Label("LBB1_9")
   175  	{
   176  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0)
   177  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1)
   178  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2)
   179  		VADDPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3)
   180  	}
   181  
   182  	Label("LBB1_10")
   183  	{
   184  		VADDPS(Y3, Y1, Y1)
   185  		VADDPS(Y2, Y0, Y0)
   186  		VADDPS(Y1, Y0, Y0)
   187  		VEXTRACTF128(Imm(1), Y0, X1)
   188  		VADDPS(X1, X0, X0)
   189  		VPERMILPD(Imm(1), X0, X1)
   190  		VADDPS(X1, X0, X0)
   191  		VMOVSHDUP(X0, X1)
   192  		VADDSS(X1, X0, X0)
   193  		CMPQ(RAX, RSI)
   194  		JE(LabelRef("LBB1_12"))
   195  	}
   196  
   197  	Label("LBB1_11")
   198  	{
   199  		VADDSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X0)
   200  		ADDQ(Imm(1), RAX)
   201  		CMPQ(RSI, RAX)
   202  		JNE(LabelRef("LBB1_11"))
   203  	}
   204  
   205  	Label("LBB1_12")
   206  	{
   207  		VZEROUPPER()
   208  		Store(X0, ReturnIndex(0))
   209  		RET()
   210  	}
   211  
   212  	Label("LBB1_5")
   213  	{
   214  		VXORPS(X0, X0, X0)
   215  		XORL(EDX, EDX)
   216  		VXORPS(X1, X1, X1)
   217  		VXORPS(X2, X2, X2)
   218  		VXORPS(X3, X3, X3)
   219  		TESTB(Imm(1), R8B)
   220  		JNE(LabelRef("LBB1_9"))
   221  		JMP(LabelRef("LBB1_10"))
   222  	}
   223  }
   224  
   225  func genCumSum_F64() {
   226  
   227  	TEXT("CumSum_AVX2_F64", NOSPLIT, "func(x []float64)")
   228  	Pragma("noescape")
   229  	Load(Param("x").Base(), RDI)
   230  	Load(Param("x").Len(), RSI)
   231  
   232  	TESTQ(RSI, RSI)
   233  	JE(LabelRef("LBB2_8"))
   234  	LEAQ(Mem{Base: RSI}.Offset(-1), RCX)
   235  	MOVL(ESI, EAX)
   236  	ANDL(Imm(3), EAX)
   237  	CMPQ(RCX, Imm(3))
   238  	JAE(LabelRef("LBB2_3"))
   239  	VXORPD(X0, X0, X0)
   240  	XORL(ECX, ECX)
   241  	JMP(LabelRef("LBB2_5"))
   242  
   243  	Label("LBB2_3")
   244  	{
   245  		ANDQ(I32(-4), RSI)
   246  		VXORPD(X0, X0, X0)
   247  		XORL(ECX, ECX)
   248  	}
   249  
   250  	Label("LBB2_4")
   251  	{
   252  		VADDSD(Mem{Base: RDI}.Idx(RCX, 8), X0, X0)
   253  		VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8))
   254  		VADDSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(8), X0, X0)
   255  		VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(8))
   256  		VADDSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(16), X0, X0)
   257  		VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(16))
   258  		VADDSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(24), X0, X0)
   259  		VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(24))
   260  		ADDQ(Imm(4), RCX)
   261  		CMPQ(RSI, RCX)
   262  		JNE(LabelRef("LBB2_4"))
   263  	}
   264  
   265  	Label("LBB2_5")
   266  	{
   267  		TESTQ(RAX, RAX)
   268  		JE(LabelRef("LBB2_8"))
   269  		LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RCX)
   270  		XORL(EDX, EDX)
   271  	}
   272  
   273  	Label("LBB2_7")
   274  	{
   275  		VADDSD(Mem{Base: RCX}.Idx(RDX, 8), X0, X0)
   276  		VMOVSD(X0, Mem{Base: RCX}.Idx(RDX, 8))
   277  		ADDQ(Imm(1), RDX)
   278  		CMPQ(RAX, RDX)
   279  		JNE(LabelRef("LBB2_7"))
   280  	}
   281  
   282  	Label("LBB2_8")
   283  	{
   284  		RET()
   285  	}
   286  }
   287  
   288  func genCumSum_F32() {
   289  
   290  	TEXT("CumSum_AVX2_F32", NOSPLIT, "func(x []float32)")
   291  	Pragma("noescape")
   292  	Load(Param("x").Base(), RDI)
   293  	Load(Param("x").Len(), RSI)
   294  
   295  	TESTQ(RSI, RSI)
   296  	JE(LabelRef("LBB3_8"))
   297  	LEAQ(Mem{Base: RSI}.Offset(-1), RCX)
   298  	MOVL(ESI, EAX)
   299  	ANDL(Imm(3), EAX)
   300  	CMPQ(RCX, Imm(3))
   301  	JAE(LabelRef("LBB3_3"))
   302  	VXORPS(X0, X0, X0)
   303  	XORL(ECX, ECX)
   304  	JMP(LabelRef("LBB3_5"))
   305  
   306  	Label("LBB3_3")
   307  	{
   308  		ANDQ(I32(-4), RSI)
   309  		VXORPS(X0, X0, X0)
   310  		XORL(ECX, ECX)
   311  	}
   312  
   313  	Label("LBB3_4")
   314  	{
   315  		VADDSS(Mem{Base: RDI}.Idx(RCX, 4), X0, X0)
   316  		VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4))
   317  		VADDSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(4), X0, X0)
   318  		VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(4))
   319  		VADDSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(8), X0, X0)
   320  		VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(8))
   321  		VADDSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(12), X0, X0)
   322  		VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(12))
   323  		ADDQ(Imm(4), RCX)
   324  		CMPQ(RSI, RCX)
   325  		JNE(LabelRef("LBB3_4"))
   326  	}
   327  
   328  	Label("LBB3_5")
   329  	{
   330  		TESTQ(RAX, RAX)
   331  		JE(LabelRef("LBB3_8"))
   332  		LEAQ(Mem{Base: RDI}.Idx(RCX, 4), RCX)
   333  		XORL(EDX, EDX)
   334  	}
   335  
   336  	Label("LBB3_7")
   337  	{
   338  		VADDSS(Mem{Base: RCX}.Idx(RDX, 4), X0, X0)
   339  		VMOVSS(X0, Mem{Base: RCX}.Idx(RDX, 4))
   340  		ADDQ(Imm(1), RDX)
   341  		CMPQ(RAX, RDX)
   342  		JNE(LabelRef("LBB3_7"))
   343  	}
   344  
   345  	Label("LBB3_8")
   346  	{
   347  		RET()
   348  	}
   349  }
   350  
   351  func genProd_F64() {
   352  
   353  	data := GLOBL("dataProdF64", RODATA|NOPTR)
   354  	DATA(0, U64(0x3ff0000000000000))
   355  
   356  	TEXT("Prod_AVX2_F64", NOSPLIT, "func(x []float64) float64")
   357  	Pragma("noescape")
   358  	Load(Param("x").Base(), RDI)
   359  	Load(Param("x").Len(), RSI)
   360  
   361  	TESTQ(RSI, RSI)
   362  	JE(LabelRef("LBB4_1"))
   363  	CMPQ(RSI, Imm(16))
   364  	JAE(LabelRef("LBB4_4"))
   365  	VMOVSD(data.Offset(0), X0)
   366  	XORL(EAX, EAX)
   367  	JMP(LabelRef("LBB4_11"))
   368  
   369  	Label("LBB4_1")
   370  	{
   371  		VMOVSD(data.Offset(0), X0)
   372  		Store(X0, ReturnIndex(0))
   373  		RET()
   374  	}
   375  
   376  	Label("LBB4_4")
   377  	{
   378  		MOVQ(RSI, RAX)
   379  		ANDQ(I32(-16), RAX)
   380  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
   381  		MOVQ(RCX, R8)
   382  		SHRQ(Imm(4), R8)
   383  		ADDQ(Imm(1), R8)
   384  		TESTQ(RCX, RCX)
   385  		JE(LabelRef("LBB4_5"))
   386  		MOVQ(R8, RCX)
   387  		ANDQ(I32(-2), RCX)
   388  		VBROADCASTSD(data.Offset(0), Y0)
   389  		XORL(EDX, EDX)
   390  		VMOVAPD(Y0, Y1)
   391  		VMOVAPD(Y0, Y2)
   392  		VMOVAPD(Y0, Y3)
   393  	}
   394  
   395  	Label("LBB4_7")
   396  	{
   397  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0)
   398  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1)
   399  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2)
   400  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3)
   401  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(128), Y0, Y0)
   402  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(160), Y1, Y1)
   403  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(192), Y2, Y2)
   404  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(224), Y3, Y3)
   405  		ADDQ(Imm(32), RDX)
   406  		ADDQ(I32(-2), RCX)
   407  		JNE(LabelRef("LBB4_7"))
   408  		TESTB(Imm(1), R8B)
   409  		JE(LabelRef("LBB4_10"))
   410  	}
   411  
   412  	Label("LBB4_9")
   413  	{
   414  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0)
   415  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1)
   416  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2)
   417  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3)
   418  	}
   419  
   420  	Label("LBB4_10")
   421  	{
   422  		VMULPD(Y3, Y1, Y1)
   423  		VMULPD(Y2, Y0, Y0)
   424  		VMULPD(Y1, Y0, Y0)
   425  		VEXTRACTF128(Imm(1), Y0, X1)
   426  		VMULPD(X1, X0, X0)
   427  		VPERMILPD(Imm(1), X0, X1)
   428  		VMULSD(X1, X0, X0)
   429  		CMPQ(RAX, RSI)
   430  		JE(LabelRef("LBB4_12"))
   431  	}
   432  
   433  	Label("LBB4_11")
   434  	{
   435  		VMULSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X0)
   436  		ADDQ(Imm(1), RAX)
   437  		CMPQ(RSI, RAX)
   438  		JNE(LabelRef("LBB4_11"))
   439  	}
   440  
   441  	Label("LBB4_12")
   442  	{
   443  		VZEROUPPER()
   444  		Store(X0, ReturnIndex(0))
   445  		RET()
   446  	}
   447  
   448  	Label("LBB4_5")
   449  	{
   450  		VBROADCASTSD(data.Offset(0), Y0)
   451  		XORL(EDX, EDX)
   452  		VMOVAPD(Y0, Y1)
   453  		VMOVAPD(Y0, Y2)
   454  		VMOVAPD(Y0, Y3)
   455  		TESTB(Imm(1), R8B)
   456  		JNE(LabelRef("LBB4_9"))
   457  		JMP(LabelRef("LBB4_10"))
   458  	}
   459  }
   460  
   461  func genProd_F32() {
   462  
   463  	data := GLOBL("dataProdF32", RODATA|NOPTR)
   464  	DATA(0, U32(0x3f800000))
   465  
   466  	TEXT("Prod_AVX2_F32", NOSPLIT, "func(x []float32) float32")
   467  	Pragma("noescape")
   468  	Load(Param("x").Base(), RDI)
   469  	Load(Param("x").Len(), RSI)
   470  
   471  	TESTQ(RSI, RSI)
   472  	JE(LabelRef("LBB5_1"))
   473  	CMPQ(RSI, Imm(32))
   474  	JAE(LabelRef("LBB5_4"))
   475  	VMOVSS(data.Offset(0), X0)
   476  	XORL(EAX, EAX)
   477  	JMP(LabelRef("LBB5_11"))
   478  
   479  	Label("LBB5_1")
   480  	{
   481  		VMOVSS(data.Offset(0), X0)
   482  		Store(X0, ReturnIndex(0))
   483  		RET()
   484  	}
   485  
   486  	Label("LBB5_4")
   487  	{
   488  		MOVQ(RSI, RAX)
   489  		ANDQ(I32(-32), RAX)
   490  		LEAQ(Mem{Base: RAX}.Offset(-32), RCX)
   491  		MOVQ(RCX, R8)
   492  		SHRQ(Imm(5), R8)
   493  		ADDQ(Imm(1), R8)
   494  		TESTQ(RCX, RCX)
   495  		JE(LabelRef("LBB5_5"))
   496  		MOVQ(R8, RCX)
   497  		ANDQ(I32(-2), RCX)
   498  		VBROADCASTSS(data.Offset(0), Y0)
   499  		XORL(EDX, EDX)
   500  		VMOVAPS(Y0, Y1)
   501  		VMOVAPS(Y0, Y2)
   502  		VMOVAPS(Y0, Y3)
   503  	}
   504  
   505  	Label("LBB5_7")
   506  	{
   507  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0)
   508  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1)
   509  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2)
   510  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3)
   511  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(128), Y0, Y0)
   512  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(160), Y1, Y1)
   513  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(192), Y2, Y2)
   514  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(224), Y3, Y3)
   515  		ADDQ(Imm(64), RDX)
   516  		ADDQ(I32(-2), RCX)
   517  		JNE(LabelRef("LBB5_7"))
   518  		TESTB(Imm(1), R8B)
   519  		JE(LabelRef("LBB5_10"))
   520  	}
   521  
   522  	Label("LBB5_9")
   523  	{
   524  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0)
   525  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1)
   526  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2)
   527  		VMULPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3)
   528  	}
   529  
   530  	Label("LBB5_10")
   531  	{
   532  		VMULPS(Y3, Y1, Y1)
   533  		VMULPS(Y2, Y0, Y0)
   534  		VMULPS(Y1, Y0, Y0)
   535  		VEXTRACTF128(Imm(1), Y0, X1)
   536  		VMULPS(X1, X0, X0)
   537  		VPERMILPD(Imm(1), X0, X1)
   538  		VMULPS(X1, X0, X0)
   539  		VMOVSHDUP(X0, X1)
   540  		VMULSS(X1, X0, X0)
   541  		CMPQ(RAX, RSI)
   542  		JE(LabelRef("LBB5_12"))
   543  	}
   544  
   545  	Label("LBB5_11")
   546  	{
   547  		VMULSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X0)
   548  		ADDQ(Imm(1), RAX)
   549  		CMPQ(RSI, RAX)
   550  		JNE(LabelRef("LBB5_11"))
   551  	}
   552  
   553  	Label("LBB5_12")
   554  	{
   555  		VZEROUPPER()
   556  		Store(X0, ReturnIndex(0))
   557  		RET()
   558  	}
   559  
   560  	Label("LBB5_5")
   561  	{
   562  		VBROADCASTSS(data.Offset(0), Y0)
   563  		XORL(EDX, EDX)
   564  		VMOVAPS(Y0, Y1)
   565  		VMOVAPS(Y0, Y2)
   566  		VMOVAPS(Y0, Y3)
   567  		TESTB(Imm(1), R8B)
   568  		JNE(LabelRef("LBB5_9"))
   569  		JMP(LabelRef("LBB5_10"))
   570  	}
   571  }
   572  
   573  func genCumProd_F64() {
   574  
   575  	data := GLOBL("dataCumProdF64", RODATA|NOPTR)
   576  	DATA(0, U64(0x3ff0000000000000))
   577  
   578  	TEXT("CumProd_AVX2_F64", NOSPLIT, "func(x []float64)")
   579  	Pragma("noescape")
   580  	Load(Param("x").Base(), RDI)
   581  	Load(Param("x").Len(), RSI)
   582  
   583  	TESTQ(RSI, RSI)
   584  	JE(LabelRef("LBB6_8"))
   585  	LEAQ(Mem{Base: RSI}.Offset(-1), RCX)
   586  	MOVL(ESI, EAX)
   587  	ANDL(Imm(3), EAX)
   588  	CMPQ(RCX, Imm(3))
   589  	JAE(LabelRef("LBB6_3"))
   590  	VMOVSD(data.Offset(0), X0)
   591  	XORL(ECX, ECX)
   592  	JMP(LabelRef("LBB6_5"))
   593  
   594  	Label("LBB6_3")
   595  	{
   596  		ANDQ(I32(-4), RSI)
   597  		VMOVSD(data.Offset(0), X0)
   598  		XORL(ECX, ECX)
   599  	}
   600  
   601  	Label("LBB6_4")
   602  	{
   603  		VMULSD(Mem{Base: RDI}.Idx(RCX, 8), X0, X0)
   604  		VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8))
   605  		VMULSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(8), X0, X0)
   606  		VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(8))
   607  		VMULSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(16), X0, X0)
   608  		VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(16))
   609  		VMULSD(Mem{Base: RDI}.Idx(RCX, 8).Offset(24), X0, X0)
   610  		VMOVSD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(24))
   611  		ADDQ(Imm(4), RCX)
   612  		CMPQ(RSI, RCX)
   613  		JNE(LabelRef("LBB6_4"))
   614  	}
   615  
   616  	Label("LBB6_5")
   617  	{
   618  		TESTQ(RAX, RAX)
   619  		JE(LabelRef("LBB6_8"))
   620  		LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RCX)
   621  		XORL(EDX, EDX)
   622  	}
   623  
   624  	Label("LBB6_7")
   625  	{
   626  		VMULSD(Mem{Base: RCX}.Idx(RDX, 8), X0, X0)
   627  		VMOVSD(X0, Mem{Base: RCX}.Idx(RDX, 8))
   628  		ADDQ(Imm(1), RDX)
   629  		CMPQ(RAX, RDX)
   630  		JNE(LabelRef("LBB6_7"))
   631  	}
   632  
   633  	Label("LBB6_8")
   634  	{
   635  		RET()
   636  	}
   637  }
   638  
   639  func genCumProd_F32() {
   640  	data := GLOBL("dataCumProdF32", RODATA|NOPTR)
   641  	DATA(0, U32(0x3f800000))
   642  
   643  	TEXT("CumProd_AVX2_F32", NOSPLIT, "func(x []float32)")
   644  	Pragma("noescape")
   645  	Load(Param("x").Base(), RDI)
   646  	Load(Param("x").Len(), RSI)
   647  
   648  	TESTQ(RSI, RSI)
   649  	JE(LabelRef("LBB7_8"))
   650  	LEAQ(Mem{Base: RSI}.Offset(-1), RCX)
   651  	MOVL(ESI, EAX)
   652  	ANDL(Imm(3), EAX)
   653  	CMPQ(RCX, Imm(3))
   654  	JAE(LabelRef("LBB7_3"))
   655  	VMOVSS(data.Offset(0), X0)
   656  	XORL(ECX, ECX)
   657  	JMP(LabelRef("LBB7_5"))
   658  
   659  	Label("LBB7_3")
   660  	{
   661  		ANDQ(I32(-4), RSI)
   662  		VMOVSS(data.Offset(0), X0)
   663  		XORL(ECX, ECX)
   664  	}
   665  
   666  	Label("LBB7_4")
   667  	{
   668  		VMULSS(Mem{Base: RDI}.Idx(RCX, 4), X0, X0)
   669  		VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4))
   670  		VMULSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(4), X0, X0)
   671  		VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(4))
   672  		VMULSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(8), X0, X0)
   673  		VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(8))
   674  		VMULSS(Mem{Base: RDI}.Idx(RCX, 4).Offset(12), X0, X0)
   675  		VMOVSS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(12))
   676  		ADDQ(Imm(4), RCX)
   677  		CMPQ(RSI, RCX)
   678  		JNE(LabelRef("LBB7_4"))
   679  	}
   680  
   681  	Label("LBB7_5")
   682  	{
   683  		TESTQ(RAX, RAX)
   684  		JE(LabelRef("LBB7_8"))
   685  		LEAQ(Mem{Base: RDI}.Idx(RCX, 4), RCX)
   686  		XORL(EDX, EDX)
   687  	}
   688  
   689  	Label("LBB7_7")
   690  	{
   691  		VMULSS(Mem{Base: RCX}.Idx(RDX, 4), X0, X0)
   692  		VMOVSS(X0, Mem{Base: RCX}.Idx(RDX, 4))
   693  		ADDQ(Imm(1), RDX)
   694  		CMPQ(RAX, RDX)
   695  		JNE(LabelRef("LBB7_7"))
   696  	}
   697  
   698  	Label("LBB7_8")
   699  	{
   700  		RET()
   701  	}
   702  }