gitee.com/quant1x/gox@v1.7.6/num/asm/arithmetic.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 genAdd_F64() {
    10  
    11  	TEXT("Add_AVX2_F64", NOSPLIT, "func(x, y []float64)")
    12  	Pragma("noescape")
    13  	Load(Param("x").Base(), RDI)
    14  	Load(Param("y").Base(), RSI)
    15  	Load(Param("x").Len(), RDX)
    16  
    17  	TESTQ(RDX, RDX)
    18  	JE(LabelRef("LBB0_7"))
    19  	CMPQ(RDX, Imm(16))
    20  	JAE(LabelRef("LBB0_3"))
    21  	XORL(EAX, EAX)
    22  	JMP(LabelRef("LBB0_6"))
    23  
    24  	Label("LBB0_3")
    25  	{
    26  		MOVQ(RDX, RAX)
    27  		ANDQ(I32(-16), RAX)
    28  		XORL(ECX, ECX)
    29  	}
    30  
    31  	Label("LBB0_4")
    32  	{
    33  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y0)
    34  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1)
    35  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y2)
    36  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y3)
    37  		VADDPD(Mem{Base: RSI}.Idx(RCX, 8), Y0, Y0)
    38  		VADDPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y1, Y1)
    39  		VADDPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), Y2, Y2)
    40  		VADDPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), Y3, Y3)
    41  		VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8))
    42  		VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
    43  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
    44  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
    45  		ADDQ(Imm(16), RCX)
    46  		CMPQ(RAX, RCX)
    47  		JNE(LabelRef("LBB0_4"))
    48  		CMPQ(RAX, RDX)
    49  		JE(LabelRef("LBB0_7"))
    50  	}
    51  
    52  	Label("LBB0_6")
    53  	{
    54  		VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X0)
    55  		VADDSD(Mem{Base: RSI}.Idx(RAX, 8), X0, X0)
    56  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
    57  		ADDQ(Imm(1), RAX)
    58  		CMPQ(RDX, RAX)
    59  		JNE(LabelRef("LBB0_6"))
    60  	}
    61  
    62  	Label("LBB0_7")
    63  	{
    64  		VZEROUPPER()
    65  		RET()
    66  	}
    67  }
    68  
    69  func genAdd_F32() {
    70  
    71  	TEXT("Add_AVX2_F32", NOSPLIT, "func(x, y []float32)")
    72  	Pragma("noescape")
    73  	Load(Param("x").Base(), RDI)
    74  	Load(Param("y").Base(), RSI)
    75  	Load(Param("x").Len(), RDX)
    76  
    77  	TESTQ(RDX, RDX)
    78  	JE(LabelRef("LBB1_7"))
    79  	CMPQ(RDX, Imm(32))
    80  	JAE(LabelRef("LBB1_3"))
    81  	XORL(EAX, EAX)
    82  	JMP(LabelRef("LBB1_6"))
    83  
    84  	Label("LBB1_3")
    85  	{
    86  		MOVQ(RDX, RAX)
    87  		ANDQ(I32(-32), RAX)
    88  		XORL(ECX, ECX)
    89  	}
    90  
    91  	Label("LBB1_4")
    92  	{
    93  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y0)
    94  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1)
    95  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y2)
    96  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y3)
    97  		VADDPS(Mem{Base: RSI}.Idx(RCX, 4), Y0, Y0)
    98  		VADDPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1, Y1)
    99  		VADDPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2, Y2)
   100  		VADDPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3, Y3)
   101  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4))
   102  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   103  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   104  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   105  		ADDQ(Imm(32), RCX)
   106  		CMPQ(RAX, RCX)
   107  		JNE(LabelRef("LBB1_4"))
   108  		CMPQ(RAX, RDX)
   109  		JE(LabelRef("LBB1_7"))
   110  	}
   111  
   112  	Label("LBB1_6")
   113  	{
   114  		VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X0)
   115  		VADDSS(Mem{Base: RSI}.Idx(RAX, 4), X0, X0)
   116  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   117  		ADDQ(Imm(1), RAX)
   118  		CMPQ(RDX, RAX)
   119  		JNE(LabelRef("LBB1_6"))
   120  	}
   121  
   122  	Label("LBB1_7")
   123  	{
   124  		VZEROUPPER()
   125  		RET()
   126  	}
   127  }
   128  
   129  func genAddNumber_F64() {
   130  
   131  	TEXT("AddNumber_AVX2_F64", NOSPLIT, "func(x []float64, a float64)")
   132  	Pragma("noescape")
   133  	Load(Param("x").Base(), RDI)
   134  	Load(Param("a"), X0)
   135  	Load(Param("x").Len(), RSI)
   136  
   137  	TESTQ(RSI, RSI)
   138  	JE(LabelRef("LBB2_11"))
   139  	CMPQ(RSI, Imm(16))
   140  	JAE(LabelRef("LBB2_3"))
   141  	XORL(EAX, EAX)
   142  	JMP(LabelRef("LBB2_10"))
   143  
   144  	Label("LBB2_3")
   145  	{
   146  		MOVQ(RSI, RAX)
   147  		ANDQ(I32(-16), RAX)
   148  		VBROADCASTSD(X0, Y1)
   149  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
   150  		MOVQ(RCX, R8)
   151  		SHRQ(Imm(4), R8)
   152  		ADDQ(Imm(1), R8)
   153  		TESTQ(RCX, RCX)
   154  		JE(LabelRef("LBB2_4"))
   155  		MOVQ(R8, RDX)
   156  		ANDQ(I32(-2), RDX)
   157  		XORL(ECX, ECX)
   158  	}
   159  
   160  	Label("LBB2_6")
   161  	{
   162  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8), Y1, Y2)
   163  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1, Y3)
   164  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y1, Y4)
   165  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y1, Y5)
   166  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8))
   167  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
   168  		VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
   169  		VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
   170  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(128), Y1, Y2)
   171  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(160), Y1, Y3)
   172  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(192), Y1, Y4)
   173  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(224), Y1, Y5)
   174  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(128))
   175  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(160))
   176  		VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(192))
   177  		VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(224))
   178  		ADDQ(Imm(32), RCX)
   179  		ADDQ(I32(-2), RDX)
   180  		JNE(LabelRef("LBB2_6"))
   181  		TESTB(Imm(1), R8B)
   182  		JE(LabelRef("LBB2_9"))
   183  	}
   184  
   185  	Label("LBB2_8")
   186  	{
   187  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8), Y1, Y2)
   188  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1, Y3)
   189  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y1, Y4)
   190  		VADDPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y1, Y1)
   191  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8))
   192  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
   193  		VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
   194  		VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
   195  	}
   196  
   197  	Label("LBB2_9")
   198  	{
   199  		CMPQ(RAX, RSI)
   200  		JE(LabelRef("LBB2_11"))
   201  	}
   202  
   203  	Label("LBB2_10")
   204  	{
   205  		VADDSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X1)
   206  		VMOVSD(X1, Mem{Base: RDI}.Idx(RAX, 8))
   207  		ADDQ(Imm(1), RAX)
   208  		CMPQ(RSI, RAX)
   209  		JNE(LabelRef("LBB2_10"))
   210  	}
   211  
   212  	Label("LBB2_11")
   213  	{
   214  		VZEROUPPER()
   215  		RET()
   216  	}
   217  
   218  	Label("LBB2_4")
   219  	{
   220  		XORL(ECX, ECX)
   221  		TESTB(Imm(1), R8B)
   222  		JNE(LabelRef("LBB2_8"))
   223  		JMP(LabelRef("LBB2_9"))
   224  	}
   225  }
   226  
   227  func genAddNumber_F32() {
   228  
   229  	TEXT("AddNumber_AVX2_F32", NOSPLIT, "func(x []float32, a float32)")
   230  	Pragma("noescape")
   231  	Load(Param("x").Base(), RDI)
   232  	Load(Param("a"), X0)
   233  	Load(Param("x").Len(), RSI)
   234  
   235  	TESTQ(RSI, RSI)
   236  	JE(LabelRef("LBB3_11"))
   237  	CMPQ(RSI, Imm(32))
   238  	JAE(LabelRef("LBB3_3"))
   239  	XORL(EAX, EAX)
   240  	JMP(LabelRef("LBB3_10"))
   241  
   242  	Label("LBB3_3")
   243  	{
   244  		MOVQ(RSI, RAX)
   245  		ANDQ(I32(-32), RAX)
   246  		VBROADCASTSS(X0, Y1)
   247  		LEAQ(Mem{Base: RAX}.Offset(-32), RCX)
   248  		MOVQ(RCX, R8)
   249  		SHRQ(Imm(5), R8)
   250  		ADDQ(Imm(1), R8)
   251  		TESTQ(RCX, RCX)
   252  		JE(LabelRef("LBB3_4"))
   253  		MOVQ(R8, RDX)
   254  		ANDQ(I32(-2), RDX)
   255  		XORL(ECX, ECX)
   256  	}
   257  
   258  	Label("LBB3_6")
   259  	{
   260  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4), Y1, Y2)
   261  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1, Y3)
   262  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y1, Y4)
   263  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y1, Y5)
   264  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4))
   265  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   266  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   267  		VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   268  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(128), Y1, Y2)
   269  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(160), Y1, Y3)
   270  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(192), Y1, Y4)
   271  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(224), Y1, Y5)
   272  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(128))
   273  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(160))
   274  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(192))
   275  		VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(224))
   276  		ADDQ(Imm(64), RCX)
   277  		ADDQ(I32(-2), RDX)
   278  		JNE(LabelRef("LBB3_6"))
   279  		TESTB(Imm(1), R8B)
   280  		JE(LabelRef("LBB3_9"))
   281  	}
   282  
   283  	Label("LBB3_8")
   284  	{
   285  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4), Y1, Y2)
   286  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1, Y3)
   287  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y1, Y4)
   288  		VADDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y1, Y1)
   289  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4))
   290  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   291  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   292  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   293  	}
   294  
   295  	Label("LBB3_9")
   296  	{
   297  		CMPQ(RAX, RSI)
   298  		JE(LabelRef("LBB3_11"))
   299  	}
   300  
   301  	Label("LBB3_10")
   302  	{
   303  		VADDSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X1)
   304  		VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4))
   305  		ADDQ(Imm(1), RAX)
   306  		CMPQ(RSI, RAX)
   307  		JNE(LabelRef("LBB3_10"))
   308  	}
   309  
   310  	Label("LBB3_11")
   311  	{
   312  		VZEROUPPER()
   313  		RET()
   314  	}
   315  
   316  	Label("LBB3_4")
   317  	{
   318  		XORL(ECX, ECX)
   319  		TESTB(Imm(1), R8B)
   320  		JNE(LabelRef("LBB3_8"))
   321  		JMP(LabelRef("LBB3_9"))
   322  	}
   323  }
   324  
   325  func genSub_F64() {
   326  
   327  	TEXT("Sub_AVX2_F64", NOSPLIT, "func(x, y []float64)")
   328  	Pragma("noescape")
   329  	Load(Param("x").Base(), RDI)
   330  	Load(Param("y").Base(), RSI)
   331  	Load(Param("x").Len(), RDX)
   332  
   333  	TESTQ(RDX, RDX)
   334  	JE(LabelRef("LBB4_7"))
   335  	CMPQ(RDX, Imm(16))
   336  	JAE(LabelRef("LBB4_3"))
   337  	XORL(EAX, EAX)
   338  	JMP(LabelRef("LBB4_6"))
   339  
   340  	Label("LBB4_3")
   341  	{
   342  		MOVQ(RDX, RAX)
   343  		ANDQ(I32(-16), RAX)
   344  		XORL(ECX, ECX)
   345  	}
   346  
   347  	Label("LBB4_4")
   348  	{
   349  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y0)
   350  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1)
   351  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y2)
   352  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y3)
   353  		VSUBPD(Mem{Base: RSI}.Idx(RCX, 8), Y0, Y0)
   354  		VSUBPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y1, Y1)
   355  		VSUBPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), Y2, Y2)
   356  		VSUBPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), Y3, Y3)
   357  		VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8))
   358  		VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
   359  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
   360  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
   361  		ADDQ(Imm(16), RCX)
   362  		CMPQ(RAX, RCX)
   363  		JNE(LabelRef("LBB4_4"))
   364  		CMPQ(RAX, RDX)
   365  		JE(LabelRef("LBB4_7"))
   366  	}
   367  
   368  	Label("LBB4_6")
   369  	{
   370  		VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X0)
   371  		VSUBSD(Mem{Base: RSI}.Idx(RAX, 8), X0, X0)
   372  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   373  		ADDQ(Imm(1), RAX)
   374  		CMPQ(RDX, RAX)
   375  		JNE(LabelRef("LBB4_6"))
   376  	}
   377  
   378  	Label("LBB4_7")
   379  	{
   380  		VZEROUPPER()
   381  		RET()
   382  	}
   383  }
   384  
   385  func genSub_F32() {
   386  
   387  	TEXT("Sub_AVX2_F32", NOSPLIT, "func(x, y []float32)")
   388  	Pragma("noescape")
   389  	Load(Param("x").Base(), RDI)
   390  	Load(Param("y").Base(), RSI)
   391  	Load(Param("x").Len(), RDX)
   392  
   393  	TESTQ(RDX, RDX)
   394  	JE(LabelRef("LBB5_7"))
   395  	CMPQ(RDX, Imm(32))
   396  	JAE(LabelRef("LBB5_3"))
   397  	XORL(EAX, EAX)
   398  	JMP(LabelRef("LBB5_6"))
   399  
   400  	Label("LBB5_3")
   401  	{
   402  		MOVQ(RDX, RAX)
   403  		ANDQ(I32(-32), RAX)
   404  		XORL(ECX, ECX)
   405  	}
   406  
   407  	Label("LBB5_4")
   408  	{
   409  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y0)
   410  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1)
   411  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y2)
   412  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y3)
   413  		VSUBPS(Mem{Base: RSI}.Idx(RCX, 4), Y0, Y0)
   414  		VSUBPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1, Y1)
   415  		VSUBPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2, Y2)
   416  		VSUBPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3, Y3)
   417  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4))
   418  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   419  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   420  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   421  		ADDQ(Imm(32), RCX)
   422  		CMPQ(RAX, RCX)
   423  		JNE(LabelRef("LBB5_4"))
   424  		CMPQ(RAX, RDX)
   425  		JE(LabelRef("LBB5_7"))
   426  	}
   427  
   428  	Label("LBB5_6")
   429  	{
   430  		VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X0)
   431  		VSUBSS(Mem{Base: RSI}.Idx(RAX, 4), X0, X0)
   432  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   433  		ADDQ(Imm(1), RAX)
   434  		CMPQ(RDX, RAX)
   435  		JNE(LabelRef("LBB5_6"))
   436  	}
   437  
   438  	Label("LBB5_7")
   439  	{
   440  		VZEROUPPER()
   441  		RET()
   442  	}
   443  }
   444  
   445  func genSubNumber_F64() {
   446  
   447  	TEXT("SubNumber_AVX2_F64", NOSPLIT, "func(x []float64, a float64)")
   448  	Pragma("noescape")
   449  	Load(Param("x").Base(), RDI)
   450  	Load(Param("a"), X0)
   451  	Load(Param("x").Len(), RSI)
   452  
   453  	TESTQ(RSI, RSI)
   454  	JE(LabelRef("LBB6_11"))
   455  	CMPQ(RSI, Imm(16))
   456  	JAE(LabelRef("LBB6_3"))
   457  	XORL(EAX, EAX)
   458  	JMP(LabelRef("LBB6_10"))
   459  
   460  	Label("LBB6_3")
   461  	{
   462  		MOVQ(RSI, RAX)
   463  		ANDQ(I32(-16), RAX)
   464  		VBROADCASTSD(X0, Y1)
   465  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
   466  		MOVQ(RCX, R8)
   467  		SHRQ(Imm(4), R8)
   468  		ADDQ(Imm(1), R8)
   469  		TESTQ(RCX, RCX)
   470  		JE(LabelRef("LBB6_4"))
   471  		MOVQ(R8, RDX)
   472  		ANDQ(I32(-2), RDX)
   473  		XORL(ECX, ECX)
   474  	}
   475  
   476  	Label("LBB6_6")
   477  	{
   478  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y2)
   479  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y3)
   480  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y4)
   481  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y5)
   482  		VSUBPD(Y1, Y2, Y2)
   483  		VSUBPD(Y1, Y3, Y3)
   484  		VSUBPD(Y1, Y4, Y4)
   485  		VSUBPD(Y1, Y5, Y5)
   486  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8))
   487  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
   488  		VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
   489  		VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
   490  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(128), Y2)
   491  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(160), Y3)
   492  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(192), Y4)
   493  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(224), Y5)
   494  		VSUBPD(Y1, Y2, Y2)
   495  		VSUBPD(Y1, Y3, Y3)
   496  		VSUBPD(Y1, Y4, Y4)
   497  		VSUBPD(Y1, Y5, Y5)
   498  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(128))
   499  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(160))
   500  		VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(192))
   501  		VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(224))
   502  		ADDQ(Imm(32), RCX)
   503  		ADDQ(I32(-2), RDX)
   504  		JNE(LabelRef("LBB6_6"))
   505  		TESTB(Imm(1), R8B)
   506  		JE(LabelRef("LBB6_9"))
   507  	}
   508  
   509  	Label("LBB6_8")
   510  	{
   511  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y2)
   512  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y3)
   513  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y4)
   514  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y5)
   515  		VSUBPD(Y1, Y2, Y2)
   516  		VSUBPD(Y1, Y3, Y3)
   517  		VSUBPD(Y1, Y4, Y4)
   518  		VSUBPD(Y1, Y5, Y1)
   519  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8))
   520  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
   521  		VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
   522  		VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
   523  	}
   524  
   525  	Label("LBB6_9")
   526  	{
   527  		CMPQ(RAX, RSI)
   528  		JE(LabelRef("LBB6_11"))
   529  	}
   530  
   531  	Label("LBB6_10")
   532  	{
   533  		VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X1)
   534  		VSUBSD(X0, X1, X1)
   535  		VMOVSD(X1, Mem{Base: RDI}.Idx(RAX, 8))
   536  		ADDQ(Imm(1), RAX)
   537  		CMPQ(RSI, RAX)
   538  		JNE(LabelRef("LBB6_10"))
   539  	}
   540  
   541  	Label("LBB6_11")
   542  	{
   543  		VZEROUPPER()
   544  		RET()
   545  	}
   546  
   547  	Label("LBB6_4")
   548  	{
   549  		XORL(ECX, ECX)
   550  		TESTB(Imm(1), R8B)
   551  		JNE(LabelRef("LBB6_8"))
   552  		JMP(LabelRef("LBB6_9"))
   553  	}
   554  }
   555  
   556  func genSubNumber_F32() {
   557  
   558  	TEXT("SubNumber_AVX2_F32", NOSPLIT, "func(x []float32, a float32)")
   559  	Pragma("noescape")
   560  	Load(Param("x").Base(), RDI)
   561  	Load(Param("a"), X0)
   562  	Load(Param("x").Len(), RSI)
   563  
   564  	TESTQ(RSI, RSI)
   565  	JE(LabelRef("LBB7_11"))
   566  	CMPQ(RSI, Imm(32))
   567  	JAE(LabelRef("LBB7_3"))
   568  	XORL(EAX, EAX)
   569  	JMP(LabelRef("LBB7_10"))
   570  
   571  	Label("LBB7_3")
   572  	{
   573  		MOVQ(RSI, RAX)
   574  		ANDQ(I32(-32), RAX)
   575  		VBROADCASTSS(X0, Y1)
   576  		LEAQ(Mem{Base: RAX}.Offset(-32), RCX)
   577  		MOVQ(RCX, R8)
   578  		SHRQ(Imm(5), R8)
   579  		ADDQ(Imm(1), R8)
   580  		TESTQ(RCX, RCX)
   581  		JE(LabelRef("LBB7_4"))
   582  		MOVQ(R8, RDX)
   583  		ANDQ(I32(-2), RDX)
   584  		XORL(ECX, ECX)
   585  	}
   586  
   587  	Label("LBB7_6")
   588  	{
   589  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y2)
   590  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y3)
   591  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y4)
   592  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y5)
   593  		VSUBPS(Y1, Y2, Y2)
   594  		VSUBPS(Y1, Y3, Y3)
   595  		VSUBPS(Y1, Y4, Y4)
   596  		VSUBPS(Y1, Y5, Y5)
   597  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4))
   598  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   599  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   600  		VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   601  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(128), Y2)
   602  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(160), Y3)
   603  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(192), Y4)
   604  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(224), Y5)
   605  		VSUBPS(Y1, Y2, Y2)
   606  		VSUBPS(Y1, Y3, Y3)
   607  		VSUBPS(Y1, Y4, Y4)
   608  		VSUBPS(Y1, Y5, Y5)
   609  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(128))
   610  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(160))
   611  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(192))
   612  		VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(224))
   613  		ADDQ(Imm(64), RCX)
   614  		ADDQ(I32(-2), RDX)
   615  		JNE(LabelRef("LBB7_6"))
   616  		TESTB(Imm(1), R8B)
   617  		JE(LabelRef("LBB7_9"))
   618  	}
   619  
   620  	Label("LBB7_8")
   621  	{
   622  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y2)
   623  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y3)
   624  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y4)
   625  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y5)
   626  		VSUBPS(Y1, Y2, Y2)
   627  		VSUBPS(Y1, Y3, Y3)
   628  		VSUBPS(Y1, Y4, Y4)
   629  		VSUBPS(Y1, Y5, Y1)
   630  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4))
   631  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   632  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   633  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   634  	}
   635  
   636  	Label("LBB7_9")
   637  	{
   638  		CMPQ(RAX, RSI)
   639  		JE(LabelRef("LBB7_11"))
   640  	}
   641  
   642  	Label("LBB7_10")
   643  	{
   644  		VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X1)
   645  		VSUBSS(X0, X1, X1)
   646  		VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4))
   647  		ADDQ(Imm(1), RAX)
   648  		CMPQ(RSI, RAX)
   649  		JNE(LabelRef("LBB7_10"))
   650  	}
   651  
   652  	Label("LBB7_11")
   653  	{
   654  		VZEROUPPER()
   655  		RET()
   656  	}
   657  
   658  	Label("LBB7_4")
   659  	{
   660  		XORL(ECX, ECX)
   661  		TESTB(Imm(1), R8B)
   662  		JNE(LabelRef("LBB7_8"))
   663  		JMP(LabelRef("LBB7_9"))
   664  	}
   665  }
   666  
   667  func genMul_F64() {
   668  
   669  	TEXT("Mul_AVX2_F64", NOSPLIT, "func(x, y []float64)")
   670  	Pragma("noescape")
   671  	Load(Param("x").Base(), RDI)
   672  	Load(Param("y").Base(), RSI)
   673  	Load(Param("x").Len(), RDX)
   674  
   675  	TESTQ(RDX, RDX)
   676  	JE(LabelRef("LBB8_7"))
   677  	CMPQ(RDX, Imm(16))
   678  	JAE(LabelRef("LBB8_3"))
   679  	XORL(EAX, EAX)
   680  	JMP(LabelRef("LBB8_6"))
   681  
   682  	Label("LBB8_3")
   683  	{
   684  		MOVQ(RDX, RAX)
   685  		ANDQ(I32(-16), RAX)
   686  		XORL(ECX, ECX)
   687  	}
   688  
   689  	Label("LBB8_4")
   690  	{
   691  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y0)
   692  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1)
   693  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y2)
   694  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y3)
   695  		VMULPD(Mem{Base: RSI}.Idx(RCX, 8), Y0, Y0)
   696  		VMULPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y1, Y1)
   697  		VMULPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), Y2, Y2)
   698  		VMULPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), Y3, Y3)
   699  		VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8))
   700  		VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
   701  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
   702  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
   703  		ADDQ(Imm(16), RCX)
   704  		CMPQ(RAX, RCX)
   705  		JNE(LabelRef("LBB8_4"))
   706  		CMPQ(RAX, RDX)
   707  		JE(LabelRef("LBB8_7"))
   708  	}
   709  
   710  	Label("LBB8_6")
   711  	{
   712  		VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X0)
   713  		VMULSD(Mem{Base: RSI}.Idx(RAX, 8), X0, X0)
   714  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   715  		ADDQ(Imm(1), RAX)
   716  		CMPQ(RDX, RAX)
   717  		JNE(LabelRef("LBB8_6"))
   718  	}
   719  
   720  	Label("LBB8_7")
   721  	{
   722  		VZEROUPPER()
   723  		RET()
   724  	}
   725  }
   726  
   727  func genMul_F32() {
   728  
   729  	TEXT("Mul_AVX2_F32", NOSPLIT, "func(x, y []float32)")
   730  	Pragma("noescape")
   731  	Load(Param("x").Base(), RDI)
   732  	Load(Param("y").Base(), RSI)
   733  	Load(Param("x").Len(), RDX)
   734  
   735  	TESTQ(RDX, RDX)
   736  	JE(LabelRef("LBB9_7"))
   737  	CMPQ(RDX, Imm(32))
   738  	JAE(LabelRef("LBB9_3"))
   739  	XORL(EAX, EAX)
   740  	JMP(LabelRef("LBB9_6"))
   741  
   742  	Label("LBB9_3")
   743  	{
   744  		MOVQ(RDX, RAX)
   745  		ANDQ(I32(-32), RAX)
   746  		XORL(ECX, ECX)
   747  	}
   748  
   749  	Label("LBB9_4")
   750  	{
   751  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y0)
   752  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1)
   753  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y2)
   754  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y3)
   755  		VMULPS(Mem{Base: RSI}.Idx(RCX, 4), Y0, Y0)
   756  		VMULPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1, Y1)
   757  		VMULPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2, Y2)
   758  		VMULPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3, Y3)
   759  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4))
   760  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   761  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   762  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   763  		ADDQ(Imm(32), RCX)
   764  		CMPQ(RAX, RCX)
   765  		JNE(LabelRef("LBB9_4"))
   766  		CMPQ(RAX, RDX)
   767  		JE(LabelRef("LBB9_7"))
   768  	}
   769  
   770  	Label("LBB9_6")
   771  	{
   772  		VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X0)
   773  		VMULSS(Mem{Base: RSI}.Idx(RAX, 4), X0, X0)
   774  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   775  		ADDQ(Imm(1), RAX)
   776  		CMPQ(RDX, RAX)
   777  		JNE(LabelRef("LBB9_6"))
   778  	}
   779  
   780  	Label("LBB9_7")
   781  	{
   782  		VZEROUPPER()
   783  		RET()
   784  	}
   785  }
   786  
   787  func genMulNumber_F64() {
   788  
   789  	TEXT("MulNumber_AVX2_F64", NOSPLIT, "func(x []float64, a float64)")
   790  	Pragma("noescape")
   791  	Load(Param("x").Base(), RDI)
   792  	Load(Param("a"), X0)
   793  	Load(Param("x").Len(), RSI)
   794  
   795  	TESTQ(RSI, RSI)
   796  	JE(LabelRef("LBB10_11"))
   797  	CMPQ(RSI, Imm(16))
   798  	JAE(LabelRef("LBB10_3"))
   799  	XORL(EAX, EAX)
   800  	JMP(LabelRef("LBB10_10"))
   801  
   802  	Label("LBB10_3")
   803  	{
   804  		MOVQ(RSI, RAX)
   805  		ANDQ(I32(-16), RAX)
   806  		VBROADCASTSD(X0, Y1)
   807  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
   808  		MOVQ(RCX, R8)
   809  		SHRQ(Imm(4), R8)
   810  		ADDQ(Imm(1), R8)
   811  		TESTQ(RCX, RCX)
   812  		JE(LabelRef("LBB10_4"))
   813  		MOVQ(R8, RDX)
   814  		ANDQ(I32(-2), RDX)
   815  		XORL(ECX, ECX)
   816  	}
   817  
   818  	Label("LBB10_6")
   819  	{
   820  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8), Y1, Y2)
   821  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1, Y3)
   822  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y1, Y4)
   823  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y1, Y5)
   824  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8))
   825  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
   826  		VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
   827  		VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
   828  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(128), Y1, Y2)
   829  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(160), Y1, Y3)
   830  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(192), Y1, Y4)
   831  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(224), Y1, Y5)
   832  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(128))
   833  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(160))
   834  		VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(192))
   835  		VMOVUPD(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(224))
   836  		ADDQ(Imm(32), RCX)
   837  		ADDQ(I32(-2), RDX)
   838  		JNE(LabelRef("LBB10_6"))
   839  		TESTB(Imm(1), R8B)
   840  		JE(LabelRef("LBB10_9"))
   841  	}
   842  
   843  	Label("LBB10_8")
   844  	{
   845  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8), Y1, Y2)
   846  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1, Y3)
   847  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y1, Y4)
   848  		VMULPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y1, Y1)
   849  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8))
   850  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
   851  		VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
   852  		VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
   853  	}
   854  
   855  	Label("LBB10_9")
   856  	{
   857  		CMPQ(RAX, RSI)
   858  		JE(LabelRef("LBB10_11"))
   859  	}
   860  
   861  	Label("LBB10_10")
   862  	{
   863  		VMULSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X1)
   864  		VMOVSD(X1, Mem{Base: RDI}.Idx(RAX, 8))
   865  		ADDQ(Imm(1), RAX)
   866  		CMPQ(RSI, RAX)
   867  		JNE(LabelRef("LBB10_10"))
   868  	}
   869  
   870  	Label("LBB10_11")
   871  	{
   872  		VZEROUPPER()
   873  		RET()
   874  	}
   875  
   876  	Label("LBB10_4")
   877  	{
   878  		XORL(ECX, ECX)
   879  		TESTB(Imm(1), R8B)
   880  		JNE(LabelRef("LBB10_8"))
   881  		JMP(LabelRef("LBB10_9"))
   882  	}
   883  }
   884  
   885  func genMulNumber_F32() {
   886  
   887  	TEXT("MulNumber_AVX2_F32", NOSPLIT, "func(x []float32, a float32)")
   888  	Pragma("noescape")
   889  	Load(Param("x").Base(), RDI)
   890  	Load(Param("a"), X0)
   891  	Load(Param("x").Len(), RSI)
   892  
   893  	TESTQ(RSI, RSI)
   894  	JE(LabelRef("LBB11_11"))
   895  	CMPQ(RSI, Imm(32))
   896  	JAE(LabelRef("LBB11_3"))
   897  	XORL(EAX, EAX)
   898  	JMP(LabelRef("LBB11_10"))
   899  
   900  	Label("LBB11_3")
   901  	{
   902  		MOVQ(RSI, RAX)
   903  		ANDQ(I32(-32), RAX)
   904  		VBROADCASTSS(X0, Y1)
   905  		LEAQ(Mem{Base: RAX}.Offset(-32), RCX)
   906  		MOVQ(RCX, R8)
   907  		SHRQ(Imm(5), R8)
   908  		ADDQ(Imm(1), R8)
   909  		TESTQ(RCX, RCX)
   910  		JE(LabelRef("LBB11_4"))
   911  		MOVQ(R8, RDX)
   912  		ANDQ(I32(-2), RDX)
   913  		XORL(ECX, ECX)
   914  	}
   915  
   916  	Label("LBB11_6")
   917  	{
   918  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4), Y1, Y2)
   919  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1, Y3)
   920  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y1, Y4)
   921  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y1, Y5)
   922  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4))
   923  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   924  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   925  		VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   926  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(128), Y1, Y2)
   927  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(160), Y1, Y3)
   928  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(192), Y1, Y4)
   929  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(224), Y1, Y5)
   930  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(128))
   931  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(160))
   932  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(192))
   933  		VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(224))
   934  		ADDQ(Imm(64), RCX)
   935  		ADDQ(I32(-2), RDX)
   936  		JNE(LabelRef("LBB11_6"))
   937  		TESTB(Imm(1), R8B)
   938  		JE(LabelRef("LBB11_9"))
   939  	}
   940  
   941  	Label("LBB11_8")
   942  	{
   943  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4), Y1, Y2)
   944  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1, Y3)
   945  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y1, Y4)
   946  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y1, Y1)
   947  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4))
   948  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   949  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   950  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   951  	}
   952  
   953  	Label("LBB11_9")
   954  	{
   955  		CMPQ(RAX, RSI)
   956  		JE(LabelRef("LBB11_11"))
   957  	}
   958  
   959  	Label("LBB11_10")
   960  	{
   961  		VMULSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X1)
   962  		VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4))
   963  		ADDQ(Imm(1), RAX)
   964  		CMPQ(RSI, RAX)
   965  		JNE(LabelRef("LBB11_10"))
   966  	}
   967  
   968  	Label("LBB11_11")
   969  	{
   970  		VZEROUPPER()
   971  		RET()
   972  	}
   973  
   974  	Label("LBB11_4")
   975  	{
   976  		XORL(ECX, ECX)
   977  		TESTB(Imm(1), R8B)
   978  		JNE(LabelRef("LBB11_8"))
   979  		JMP(LabelRef("LBB11_9"))
   980  	}
   981  }
   982  
   983  func genDiv_F64() {
   984  
   985  	TEXT("Div_AVX2_F64", NOSPLIT, "func(x, y []float64)")
   986  	Pragma("noescape")
   987  	Load(Param("x").Base(), RDI)
   988  	Load(Param("y").Base(), RSI)
   989  	Load(Param("x").Len(), RDX)
   990  
   991  	TESTQ(RDX, RDX)
   992  	JE(LabelRef("LBB12_11"))
   993  	CMPQ(RDX, Imm(4))
   994  	JAE(LabelRef("LBB12_3"))
   995  	XORL(EAX, EAX)
   996  	JMP(LabelRef("LBB12_10"))
   997  
   998  	Label("LBB12_3")
   999  	{
  1000  		MOVQ(RDX, RAX)
  1001  		ANDQ(I32(-4), RAX)
  1002  		LEAQ(Mem{Base: RAX}.Offset(-4), RCX)
  1003  		MOVQ(RCX, R8)
  1004  		SHRQ(Imm(2), R8)
  1005  		ADDQ(Imm(1), R8)
  1006  		TESTQ(RCX, RCX)
  1007  		JE(LabelRef("LBB12_4"))
  1008  		MOVQ(R8, R9)
  1009  		ANDQ(I32(-2), R9)
  1010  		XORL(ECX, ECX)
  1011  	}
  1012  
  1013  	Label("LBB12_6")
  1014  	{
  1015  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y0)
  1016  		VDIVPD(Mem{Base: RSI}.Idx(RCX, 8), Y0, Y0)
  1017  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y1)
  1018  		VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8))
  1019  		VDIVPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y1, Y0)
  1020  		VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
  1021  		ADDQ(Imm(8), RCX)
  1022  		ADDQ(I32(-2), R9)
  1023  		JNE(LabelRef("LBB12_6"))
  1024  		TESTB(Imm(1), R8B)
  1025  		JE(LabelRef("LBB12_9"))
  1026  	}
  1027  
  1028  	Label("LBB12_8")
  1029  	{
  1030  		VMOVUPD(Mem{Base: RDI}.Idx(RCX, 8), Y0)
  1031  		VDIVPD(Mem{Base: RSI}.Idx(RCX, 8), Y0, Y0)
  1032  		VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8))
  1033  	}
  1034  
  1035  	Label("LBB12_9")
  1036  	{
  1037  		CMPQ(RAX, RDX)
  1038  		JE(LabelRef("LBB12_11"))
  1039  	}
  1040  
  1041  	Label("LBB12_10")
  1042  	{
  1043  		VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X0)
  1044  		VDIVSD(Mem{Base: RSI}.Idx(RAX, 8), X0, X0)
  1045  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
  1046  		ADDQ(Imm(1), RAX)
  1047  		CMPQ(RDX, RAX)
  1048  		JNE(LabelRef("LBB12_10"))
  1049  	}
  1050  
  1051  	Label("LBB12_11")
  1052  	{
  1053  		VZEROUPPER()
  1054  		RET()
  1055  	}
  1056  
  1057  	Label("LBB12_4")
  1058  	{
  1059  		XORL(ECX, ECX)
  1060  		TESTB(Imm(1), R8B)
  1061  		JNE(LabelRef("LBB12_8"))
  1062  		JMP(LabelRef("LBB12_9"))
  1063  	}
  1064  }
  1065  
  1066  func genDiv_F32() {
  1067  
  1068  	TEXT("Div_AVX2_F32", NOSPLIT, "func(x, y []float32)")
  1069  	Pragma("noescape")
  1070  	Load(Param("x").Base(), RDI)
  1071  	Load(Param("y").Base(), RSI)
  1072  	Load(Param("x").Len(), RDX)
  1073  
  1074  	TESTQ(RDX, RDX)
  1075  	JE(LabelRef("LBB13_7"))
  1076  	CMPQ(RDX, Imm(32))
  1077  	JAE(LabelRef("LBB13_3"))
  1078  	XORL(EAX, EAX)
  1079  	JMP(LabelRef("LBB13_6"))
  1080  
  1081  	Label("LBB13_3")
  1082  	{
  1083  		MOVQ(RDX, RAX)
  1084  		ANDQ(I32(-32), RAX)
  1085  		XORL(ECX, ECX)
  1086  	}
  1087  
  1088  	Label("LBB13_4")
  1089  	{
  1090  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4), Y0)
  1091  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1)
  1092  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2)
  1093  		VRCPPS(Y0, Y3)
  1094  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y4)
  1095  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y5)
  1096  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y6)
  1097  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y7)
  1098  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y8)
  1099  		VMULPS(Y3, Y5, Y9)
  1100  		VFMSUB213PS(Y5, Y9, Y0)
  1101  		VFNMADD213PS(Y9, Y3, Y0)
  1102  		VRCPPS(Y1, Y3)
  1103  		VMULPS(Y3, Y6, Y5)
  1104  		VFMSUB213PS(Y6, Y5, Y1)
  1105  		VRCPPS(Y2, Y6)
  1106  		VFNMADD213PS(Y5, Y3, Y1)
  1107  		VMULPS(Y6, Y7, Y3)
  1108  		VFMSUB213PS(Y7, Y3, Y2)
  1109  		VFNMADD213PS(Y3, Y6, Y2)
  1110  		VRCPPS(Y4, Y3)
  1111  		VMULPS(Y3, Y8, Y5)
  1112  		VFMSUB213PS(Y8, Y5, Y4)
  1113  		VFNMADD213PS(Y5, Y3, Y4)
  1114  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4))
  1115  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1116  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  1117  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  1118  		ADDQ(Imm(32), RCX)
  1119  		CMPQ(RAX, RCX)
  1120  		JNE(LabelRef("LBB13_4"))
  1121  		CMPQ(RAX, RDX)
  1122  		JE(LabelRef("LBB13_7"))
  1123  	}
  1124  
  1125  	Label("LBB13_6")
  1126  	{
  1127  		VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X0)
  1128  		VDIVSS(Mem{Base: RSI}.Idx(RAX, 4), X0, X0)
  1129  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
  1130  		ADDQ(Imm(1), RAX)
  1131  		CMPQ(RDX, RAX)
  1132  		JNE(LabelRef("LBB13_6"))
  1133  	}
  1134  
  1135  	Label("LBB13_7")
  1136  	{
  1137  		VZEROUPPER()
  1138  		RET()
  1139  	}
  1140  }
  1141  
  1142  func genDivNumber_F64() {
  1143  
  1144  	data := GLOBL("dataDivNumberF64", RODATA|NOPTR)
  1145  	DATA(0, U64(0x3ff0000000000000))
  1146  
  1147  	TEXT("DivNumber_AVX2_F64", NOSPLIT, "func(x []float64, a float64)")
  1148  	Pragma("noescape")
  1149  	Load(Param("x").Base(), RDI)
  1150  	Load(Param("a"), X0)
  1151  	Load(Param("x").Len(), RSI)
  1152  
  1153  	TESTQ(RSI, RSI)
  1154  	JE(LabelRef("LBB14_12"))
  1155  	CMPQ(RSI, Imm(4))
  1156  	JAE(LabelRef("LBB14_3"))
  1157  	XORL(EAX, EAX)
  1158  	JMP(LabelRef("LBB14_10"))
  1159  
  1160  	Label("LBB14_3")
  1161  	{
  1162  		MOVQ(RSI, RAX)
  1163  		ANDQ(I32(-4), RAX)
  1164  		VBROADCASTSD(X0, Y1)
  1165  		LEAQ(Mem{Base: RAX}.Offset(-4), RCX)
  1166  		MOVQ(RCX, R8)
  1167  		SHRQ(Imm(2), R8)
  1168  		ADDQ(Imm(1), R8)
  1169  		TESTQ(RCX, RCX)
  1170  		JE(LabelRef("LBB14_4"))
  1171  		MOVQ(R8, RCX)
  1172  		ANDQ(I32(-2), RCX)
  1173  		VBROADCASTSD(data.Offset(0), Y2)
  1174  		VDIVPD(Y1, Y2, Y2)
  1175  		XORL(EDX, EDX)
  1176  	}
  1177  
  1178  	Label("LBB14_6")
  1179  	{
  1180  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8), Y2, Y3)
  1181  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RDX, 8))
  1182  		VMULPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y2, Y3)
  1183  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RDX, 8).Offset(32))
  1184  		ADDQ(Imm(8), RDX)
  1185  		ADDQ(I32(-2), RCX)
  1186  		JNE(LabelRef("LBB14_6"))
  1187  		TESTB(Imm(1), R8B)
  1188  		JE(LabelRef("LBB14_9"))
  1189  	}
  1190  
  1191  	Label("LBB14_8")
  1192  	{
  1193  		VMOVUPD(Mem{Base: RDI}.Idx(RDX, 8), Y2)
  1194  		VDIVPD(Y1, Y2, Y1)
  1195  		VMOVUPD(Y1, Mem{Base: RDI}.Idx(RDX, 8))
  1196  	}
  1197  
  1198  	Label("LBB14_9")
  1199  	{
  1200  		CMPQ(RAX, RSI)
  1201  		JE(LabelRef("LBB14_12"))
  1202  	}
  1203  
  1204  	Label("LBB14_10")
  1205  	{
  1206  		VMOVSD(data.Offset(0), X1)
  1207  		VDIVSD(X0, X1, X0)
  1208  	}
  1209  
  1210  	Label("LBB14_11")
  1211  	{
  1212  		VMULSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X1)
  1213  		VMOVSD(X1, Mem{Base: RDI}.Idx(RAX, 8))
  1214  		ADDQ(Imm(1), RAX)
  1215  		CMPQ(RSI, RAX)
  1216  		JNE(LabelRef("LBB14_11"))
  1217  	}
  1218  
  1219  	Label("LBB14_12")
  1220  	{
  1221  		VZEROUPPER()
  1222  		RET()
  1223  	}
  1224  
  1225  	Label("LBB14_4")
  1226  	{
  1227  		XORL(EDX, EDX)
  1228  		TESTB(Imm(1), R8B)
  1229  		JNE(LabelRef("LBB14_8"))
  1230  		JMP(LabelRef("LBB14_9"))
  1231  	}
  1232  }
  1233  
  1234  func genDivNumber_F32() {
  1235  
  1236  	data := GLOBL("dataDivNumberF32", RODATA|NOPTR)
  1237  	DATA(0, U32(0x3f800000))
  1238  
  1239  	TEXT("DivNumber_AVX2_F32", NOSPLIT, "func(x []float32, a float32)")
  1240  	Pragma("noescape")
  1241  	Load(Param("x").Base(), RDI)
  1242  	Load(Param("a"), X0)
  1243  	Load(Param("x").Len(), RSI)
  1244  
  1245  	TESTQ(RSI, RSI)
  1246  	JE(LabelRef("LBB15_8"))
  1247  	CMPQ(RSI, Imm(32))
  1248  	JAE(LabelRef("LBB15_3"))
  1249  	XORL(EAX, EAX)
  1250  	JMP(LabelRef("LBB15_6"))
  1251  
  1252  	Label("LBB15_3")
  1253  	{
  1254  		MOVQ(RSI, RAX)
  1255  		ANDQ(I32(-32), RAX)
  1256  		VMOVSS(data.Offset(0), X1)
  1257  		VDIVSS(X0, X1, X1)
  1258  		VBROADCASTSS(X1, Y1)
  1259  		XORL(ECX, ECX)
  1260  	}
  1261  
  1262  	Label("LBB15_4")
  1263  	{
  1264  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4), Y1, Y2)
  1265  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y1, Y3)
  1266  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y1, Y4)
  1267  		VMULPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y1, Y5)
  1268  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4))
  1269  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1270  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  1271  		VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  1272  		ADDQ(Imm(32), RCX)
  1273  		CMPQ(RAX, RCX)
  1274  		JNE(LabelRef("LBB15_4"))
  1275  		CMPQ(RAX, RSI)
  1276  		JE(LabelRef("LBB15_8"))
  1277  	}
  1278  
  1279  	Label("LBB15_6")
  1280  	{
  1281  		VMOVSS(data.Offset(0), X1)
  1282  		VDIVSS(X0, X1, X0)
  1283  	}
  1284  
  1285  	Label("LBB15_7")
  1286  	{
  1287  		VMULSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X1)
  1288  		VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4))
  1289  		ADDQ(Imm(1), RAX)
  1290  		CMPQ(RSI, RAX)
  1291  		JNE(LabelRef("LBB15_7"))
  1292  	}
  1293  
  1294  	Label("LBB15_8")
  1295  	{
  1296  		VZEROUPPER()
  1297  		RET()
  1298  	}
  1299  }
  1300  
  1301  func genAbs_F64() {
  1302  
  1303  	data := GLOBL("dataAbsF64", RODATA|NOPTR)
  1304  	DATA(0, U64(0x7fffffffffffffff))
  1305  	DATA(8, U64(0x7fffffffffffffff))
  1306  	DATA(16, U64(0x7fffffffffffffff))
  1307  
  1308  	TEXT("Abs_AVX2_F64", NOSPLIT, "func(x []float64)")
  1309  	Pragma("noescape")
  1310  	Load(Param("x").Base(), RDI)
  1311  	Load(Param("x").Len(), RSI)
  1312  
  1313  	TESTQ(RSI, RSI)
  1314  	JE(LabelRef("LBB16_8"))
  1315  	CMPQ(RSI, Imm(16))
  1316  	JAE(LabelRef("LBB16_3"))
  1317  	XORL(EAX, EAX)
  1318  	JMP(LabelRef("LBB16_6"))
  1319  
  1320  	Label("LBB16_3")
  1321  	{
  1322  		MOVQ(RSI, RAX)
  1323  		ANDQ(I32(-16), RAX)
  1324  		XORL(ECX, ECX)
  1325  		VBROADCASTSD(data.Offset(0), Y0)
  1326  	}
  1327  
  1328  	Label("LBB16_4")
  1329  	{
  1330  		VANDPS(Mem{Base: RDI}.Idx(RCX, 8), Y0, Y1)
  1331  		VANDPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y0, Y2)
  1332  		VANDPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y0, Y3)
  1333  		VANDPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y0, Y4)
  1334  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8))
  1335  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
  1336  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
  1337  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
  1338  		ADDQ(Imm(16), RCX)
  1339  		CMPQ(RAX, RCX)
  1340  		JNE(LabelRef("LBB16_4"))
  1341  		CMPQ(RAX, RSI)
  1342  		JE(LabelRef("LBB16_8"))
  1343  	}
  1344  
  1345  	Label("LBB16_6")
  1346  	{
  1347  		VMOVUPS(data.Offset(8), X0)
  1348  	}
  1349  
  1350  	Label("LBB16_7")
  1351  	{
  1352  		VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X1)
  1353  		VANDPS(X0, X1, X1)
  1354  		VMOVLPS(X1, Mem{Base: RDI}.Idx(RAX, 8))
  1355  		ADDQ(Imm(1), RAX)
  1356  		CMPQ(RSI, RAX)
  1357  		JNE(LabelRef("LBB16_7"))
  1358  	}
  1359  
  1360  	Label("LBB16_8")
  1361  	{
  1362  		VZEROUPPER()
  1363  		RET()
  1364  	}
  1365  }
  1366  
  1367  func genAbs_F32() {
  1368  
  1369  	data := GLOBL("dataAbsF32", RODATA|NOPTR)
  1370  	DATA(0, U32(0x7fffffff))
  1371  
  1372  	TEXT("Abs_AVX2_F32", NOSPLIT, "func(x []float32)")
  1373  	Pragma("noescape")
  1374  	Load(Param("x").Base(), RDI)
  1375  	Load(Param("x").Len(), RSI)
  1376  
  1377  	TESTQ(RSI, RSI)
  1378  	JE(LabelRef("LBB17_8"))
  1379  	CMPQ(RSI, Imm(32))
  1380  	JAE(LabelRef("LBB17_3"))
  1381  	XORL(EAX, EAX)
  1382  	JMP(LabelRef("LBB17_6"))
  1383  
  1384  	Label("LBB17_3")
  1385  	{
  1386  		MOVQ(RSI, RAX)
  1387  		ANDQ(I32(-32), RAX)
  1388  		XORL(ECX, ECX)
  1389  		VBROADCASTSS(data.Offset(0), Y0)
  1390  	}
  1391  
  1392  	Label("LBB17_4")
  1393  	{
  1394  		VANDPS(Mem{Base: RDI}.Idx(RCX, 4), Y0, Y1)
  1395  		VANDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y0, Y2)
  1396  		VANDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y0, Y3)
  1397  		VANDPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y0, Y4)
  1398  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4))
  1399  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1400  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  1401  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  1402  		ADDQ(Imm(32), RCX)
  1403  		CMPQ(RAX, RCX)
  1404  		JNE(LabelRef("LBB17_4"))
  1405  		CMPQ(RAX, RSI)
  1406  		JE(LabelRef("LBB17_8"))
  1407  	}
  1408  
  1409  	Label("LBB17_6")
  1410  	{
  1411  		VBROADCASTSS(data.Offset(0), X0)
  1412  	}
  1413  
  1414  	Label("LBB17_7")
  1415  	{
  1416  		VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X1)
  1417  		VANDPS(X0, X1, X1)
  1418  		VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4))
  1419  		ADDQ(Imm(1), RAX)
  1420  		CMPQ(RSI, RAX)
  1421  		JNE(LabelRef("LBB17_7"))
  1422  	}
  1423  
  1424  	Label("LBB17_8")
  1425  	{
  1426  		VZEROUPPER()
  1427  		RET()
  1428  	}
  1429  }
  1430  
  1431  func genNeg_F64() {
  1432  
  1433  	data := GLOBL("dataNegF64", RODATA|NOPTR)
  1434  	DATA(0, U64(0x8000000000000000))
  1435  	DATA(8, U64(0x8000000000000000))
  1436  	DATA(16, U64(0x8000000000000000))
  1437  
  1438  	TEXT("Neg_AVX2_F64", NOSPLIT, "func(x []float64)")
  1439  	Pragma("noescape")
  1440  	Load(Param("x").Base(), RDI)
  1441  	Load(Param("x").Len(), RSI)
  1442  
  1443  	TESTQ(RSI, RSI)
  1444  	JE(LabelRef("LBB18_12"))
  1445  	CMPQ(RSI, Imm(16))
  1446  	JAE(LabelRef("LBB18_3"))
  1447  	XORL(EAX, EAX)
  1448  	JMP(LabelRef("LBB18_10"))
  1449  
  1450  	Label("LBB18_3")
  1451  	{
  1452  		MOVQ(RSI, RAX)
  1453  		ANDQ(I32(-16), RAX)
  1454  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
  1455  		MOVQ(RCX, R8)
  1456  		SHRQ(Imm(4), R8)
  1457  		ADDQ(Imm(1), R8)
  1458  		TESTQ(RCX, RCX)
  1459  		JE(LabelRef("LBB18_4"))
  1460  		MOVQ(R8, RDX)
  1461  		ANDQ(I32(-2), RDX)
  1462  		XORL(ECX, ECX)
  1463  		VBROADCASTSD(data.Offset(0), Y0)
  1464  	}
  1465  
  1466  	Label("LBB18_6")
  1467  	{
  1468  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8), Y0, Y1)
  1469  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y0, Y2)
  1470  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y0, Y3)
  1471  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y0, Y4)
  1472  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8))
  1473  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
  1474  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
  1475  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
  1476  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(128), Y0, Y1)
  1477  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(160), Y0, Y2)
  1478  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(192), Y0, Y3)
  1479  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(224), Y0, Y4)
  1480  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(128))
  1481  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(160))
  1482  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(192))
  1483  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(224))
  1484  		ADDQ(Imm(32), RCX)
  1485  		ADDQ(I32(-2), RDX)
  1486  		JNE(LabelRef("LBB18_6"))
  1487  		TESTB(Imm(1), R8B)
  1488  		JE(LabelRef("LBB18_9"))
  1489  	}
  1490  
  1491  	Label("LBB18_8")
  1492  	{
  1493  		VBROADCASTSD(data.Offset(0), Y0)
  1494  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8), Y0, Y1)
  1495  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(32), Y0, Y2)
  1496  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(64), Y0, Y3)
  1497  		VXORPS(Mem{Base: RDI}.Idx(RCX, 8).Offset(96), Y0, Y0)
  1498  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8))
  1499  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
  1500  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
  1501  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
  1502  	}
  1503  
  1504  	Label("LBB18_9")
  1505  	{
  1506  		CMPQ(RAX, RSI)
  1507  		JE(LabelRef("LBB18_12"))
  1508  	}
  1509  
  1510  	Label("LBB18_10")
  1511  	{
  1512  		VMOVUPS(data.Offset(8), X0)
  1513  	}
  1514  
  1515  	Label("LBB18_11")
  1516  	{
  1517  		VMOVSD(Mem{Base: RDI}.Idx(RAX, 8), X1)
  1518  		VXORPS(X0, X1, X1)
  1519  		VMOVLPS(X1, Mem{Base: RDI}.Idx(RAX, 8))
  1520  		ADDQ(Imm(1), RAX)
  1521  		CMPQ(RSI, RAX)
  1522  		JNE(LabelRef("LBB18_11"))
  1523  	}
  1524  
  1525  	Label("LBB18_12")
  1526  	{
  1527  		VZEROUPPER()
  1528  		RET()
  1529  	}
  1530  
  1531  	Label("LBB18_4")
  1532  	{
  1533  		XORL(ECX, ECX)
  1534  		TESTB(Imm(1), R8B)
  1535  		JNE(LabelRef("LBB18_8"))
  1536  		JMP(LabelRef("LBB18_9"))
  1537  	}
  1538  }
  1539  
  1540  func genNeg_F32() {
  1541  
  1542  	data := GLOBL("dataNegF32", RODATA|NOPTR)
  1543  	DATA(0, U32(0x80000000))
  1544  
  1545  	TEXT("Neg_AVX2_F32", NOSPLIT, "func(x []float32)")
  1546  	Pragma("noescape")
  1547  	Load(Param("x").Base(), RDI)
  1548  	Load(Param("x").Len(), RSI)
  1549  
  1550  	TESTQ(RSI, RSI)
  1551  	JE(LabelRef("LBB19_12"))
  1552  	CMPQ(RSI, Imm(32))
  1553  	JAE(LabelRef("LBB19_3"))
  1554  	XORL(EAX, EAX)
  1555  	JMP(LabelRef("LBB19_10"))
  1556  
  1557  	Label("LBB19_3")
  1558  	{
  1559  		MOVQ(RSI, RAX)
  1560  		ANDQ(I32(-32), RAX)
  1561  		LEAQ(Mem{Base: RAX}.Offset(-32), RCX)
  1562  		MOVQ(RCX, R8)
  1563  		SHRQ(Imm(5), R8)
  1564  		ADDQ(Imm(1), R8)
  1565  		TESTQ(RCX, RCX)
  1566  		JE(LabelRef("LBB19_4"))
  1567  		MOVQ(R8, RDX)
  1568  		ANDQ(I32(-2), RDX)
  1569  		XORL(ECX, ECX)
  1570  		VBROADCASTSS(data.Offset(0), Y0)
  1571  	}
  1572  
  1573  	Label("LBB19_6")
  1574  	{
  1575  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4), Y0, Y1)
  1576  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y0, Y2)
  1577  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y0, Y3)
  1578  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y0, Y4)
  1579  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4))
  1580  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1581  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  1582  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  1583  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(128), Y0, Y1)
  1584  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(160), Y0, Y2)
  1585  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(192), Y0, Y3)
  1586  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(224), Y0, Y4)
  1587  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(128))
  1588  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(160))
  1589  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(192))
  1590  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(224))
  1591  		ADDQ(Imm(64), RCX)
  1592  		ADDQ(I32(-2), RDX)
  1593  		JNE(LabelRef("LBB19_6"))
  1594  		TESTB(Imm(1), R8B)
  1595  		JE(LabelRef("LBB19_9"))
  1596  	}
  1597  
  1598  	Label("LBB19_8")
  1599  	{
  1600  		VBROADCASTSS(data.Offset(0), Y0)
  1601  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4), Y0, Y1)
  1602  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y0, Y2)
  1603  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y0, Y3)
  1604  		VXORPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y0, Y0)
  1605  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4))
  1606  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1607  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  1608  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  1609  	}
  1610  
  1611  	Label("LBB19_9")
  1612  	{
  1613  		CMPQ(RAX, RSI)
  1614  		JE(LabelRef("LBB19_12"))
  1615  	}
  1616  
  1617  	Label("LBB19_10")
  1618  	{
  1619  		VBROADCASTSS(data.Offset(0), X0)
  1620  	}
  1621  
  1622  	Label("LBB19_11")
  1623  	{
  1624  		VMOVSS(Mem{Base: RDI}.Idx(RAX, 4), X1)
  1625  		VXORPS(X0, X1, X1)
  1626  		VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4))
  1627  		ADDQ(Imm(1), RAX)
  1628  		CMPQ(RSI, RAX)
  1629  		JNE(LabelRef("LBB19_11"))
  1630  	}
  1631  
  1632  	Label("LBB19_12")
  1633  	{
  1634  		VZEROUPPER()
  1635  		RET()
  1636  	}
  1637  
  1638  	Label("LBB19_4")
  1639  	{
  1640  		XORL(ECX, ECX)
  1641  		TESTB(Imm(1), R8B)
  1642  		JNE(LabelRef("LBB19_8"))
  1643  		JMP(LabelRef("LBB19_9"))
  1644  	}
  1645  }
  1646  
  1647  func genInv_F64() {
  1648  
  1649  	data := GLOBL("dataInvF64", RODATA|NOPTR)
  1650  	DATA(0, U64(0x3ff0000000000000))
  1651  
  1652  	TEXT("Inv_AVX2_F64", NOSPLIT, "func(x []float64)")
  1653  	Pragma("noescape")
  1654  	Load(Param("x").Base(), RDI)
  1655  	Load(Param("x").Len(), RSI)
  1656  
  1657  	TESTQ(RSI, RSI)
  1658  	JE(LabelRef("LBB20_12"))
  1659  	CMPQ(RSI, Imm(4))
  1660  	JAE(LabelRef("LBB20_3"))
  1661  	XORL(EAX, EAX)
  1662  	JMP(LabelRef("LBB20_10"))
  1663  
  1664  	Label("LBB20_3")
  1665  	{
  1666  		MOVQ(RSI, RAX)
  1667  		ANDQ(I32(-4), RAX)
  1668  		LEAQ(Mem{Base: RAX}.Offset(-4), RCX)
  1669  		MOVQ(RCX, R8)
  1670  		SHRQ(Imm(2), R8)
  1671  		ADDQ(Imm(1), R8)
  1672  		TESTQ(RCX, RCX)
  1673  		JE(LabelRef("LBB20_4"))
  1674  		MOVQ(R8, RCX)
  1675  		ANDQ(I32(-2), RCX)
  1676  		XORL(EDX, EDX)
  1677  		VBROADCASTSD(data.Offset(0), Y0)
  1678  	}
  1679  
  1680  	Label("LBB20_6")
  1681  	{
  1682  		VDIVPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y1)
  1683  		VMOVUPD(Y1, Mem{Base: RDI}.Idx(RDX, 8))
  1684  		VDIVPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y0, Y1)
  1685  		VMOVUPD(Y1, Mem{Base: RDI}.Idx(RDX, 8).Offset(32))
  1686  		ADDQ(Imm(8), RDX)
  1687  		ADDQ(I32(-2), RCX)
  1688  		JNE(LabelRef("LBB20_6"))
  1689  		TESTB(Imm(1), R8B)
  1690  		JE(LabelRef("LBB20_9"))
  1691  	}
  1692  
  1693  	Label("LBB20_8")
  1694  	{
  1695  		VBROADCASTSD(data.Offset(0), Y0)
  1696  		VDIVPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0)
  1697  		VMOVUPD(Y0, Mem{Base: RDI}.Idx(RDX, 8))
  1698  	}
  1699  
  1700  	Label("LBB20_9")
  1701  	{
  1702  		CMPQ(RAX, RSI)
  1703  		JE(LabelRef("LBB20_12"))
  1704  	}
  1705  
  1706  	Label("LBB20_10")
  1707  	{
  1708  		VMOVSD(data.Offset(0), X0)
  1709  	}
  1710  
  1711  	Label("LBB20_11")
  1712  	{
  1713  		VDIVSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X1)
  1714  		VMOVSD(X1, Mem{Base: RDI}.Idx(RAX, 8))
  1715  		ADDQ(Imm(1), RAX)
  1716  		CMPQ(RSI, RAX)
  1717  		JNE(LabelRef("LBB20_11"))
  1718  	}
  1719  
  1720  	Label("LBB20_12")
  1721  	{
  1722  		VZEROUPPER()
  1723  		RET()
  1724  	}
  1725  
  1726  	Label("LBB20_4")
  1727  	{
  1728  		XORL(EDX, EDX)
  1729  		TESTB(Imm(1), R8B)
  1730  		JNE(LabelRef("LBB20_8"))
  1731  		JMP(LabelRef("LBB20_9"))
  1732  	}
  1733  }
  1734  
  1735  func genInv_F32() {
  1736  
  1737  	data := GLOBL("dataInvF32", RODATA|NOPTR)
  1738  	DATA(0, U32(0x3f800000))
  1739  
  1740  	TEXT("Inv_AVX2_F32", NOSPLIT, "func(x []float32)")
  1741  	Pragma("noescape")
  1742  	Load(Param("x").Base(), RDI)
  1743  	Load(Param("x").Len(), RSI)
  1744  
  1745  	TESTQ(RSI, RSI)
  1746  	JE(LabelRef("LBB21_8"))
  1747  	CMPQ(RSI, Imm(32))
  1748  	JAE(LabelRef("LBB21_3"))
  1749  	XORL(EAX, EAX)
  1750  	JMP(LabelRef("LBB21_6"))
  1751  
  1752  	Label("LBB21_3")
  1753  	{
  1754  		MOVQ(RSI, RAX)
  1755  		ANDQ(I32(-32), RAX)
  1756  		XORL(ECX, ECX)
  1757  		VBROADCASTSS(data.Offset(0), Y0)
  1758  	}
  1759  
  1760  	Label("LBB21_4")
  1761  	{
  1762  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4), Y1)
  1763  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(32), Y2)
  1764  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(64), Y3)
  1765  		VRCPPS(Y1, Y4)
  1766  		VFMSUB213PS(Y0, Y4, Y1)
  1767  		VRCPPS(Y2, Y5)
  1768  		VFNMADD132PS(Y4, Y4, Y1)
  1769  		VMOVUPS(Mem{Base: RDI}.Idx(RCX, 4).Offset(96), Y4)
  1770  		VFMSUB213PS(Y0, Y5, Y2)
  1771  		VFNMADD132PS(Y5, Y5, Y2)
  1772  		VRCPPS(Y3, Y5)
  1773  		VFMSUB213PS(Y0, Y5, Y3)
  1774  		VFNMADD132PS(Y5, Y5, Y3)
  1775  		VRCPPS(Y4, Y5)
  1776  		VFMSUB213PS(Y0, Y5, Y4)
  1777  		VFNMADD132PS(Y5, Y5, Y4)
  1778  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4))
  1779  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1780  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  1781  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  1782  		ADDQ(Imm(32), RCX)
  1783  		CMPQ(RAX, RCX)
  1784  		JNE(LabelRef("LBB21_4"))
  1785  		CMPQ(RAX, RSI)
  1786  		JE(LabelRef("LBB21_8"))
  1787  	}
  1788  
  1789  	Label("LBB21_6")
  1790  	{
  1791  		VMOVSS(data.Offset(0), X0)
  1792  	}
  1793  
  1794  	Label("LBB21_7")
  1795  	{
  1796  		VDIVSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X1)
  1797  		VMOVSS(X1, Mem{Base: RDI}.Idx(RAX, 4))
  1798  		ADDQ(Imm(1), RAX)
  1799  		CMPQ(RSI, RAX)
  1800  		JNE(LabelRef("LBB21_7"))
  1801  	}
  1802  
  1803  	Label("LBB21_8")
  1804  	{
  1805  		VZEROUPPER()
  1806  		RET()
  1807  	}
  1808  }