gitee.com/quant1x/gox@v1.7.6/num/asm/boolean.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 genNot() {
    10  	data := GLOBL("dataNot", RODATA|NOPTR)
    11  	DATA(0, U8(1))
    12  	DATA(1, U8(1))
    13  	DATA(2, U8(1))
    14  	DATA(3, U8(1))
    15  	DATA(4, U8(1))
    16  	DATA(5, U8(1))
    17  	DATA(6, U8(1))
    18  	DATA(7, U8(1))
    19  	DATA(8, U8(1))
    20  	DATA(9, U8(1))
    21  	DATA(10, U8(1))
    22  	DATA(11, U8(1))
    23  	DATA(12, U8(1))
    24  	DATA(13, U8(1))
    25  	DATA(14, U8(1))
    26  	DATA(15, U8(1))
    27  	DATA(16, U8(1))
    28  	DATA(17, U8(1))
    29  	DATA(18, U8(1))
    30  	DATA(19, U8(1))
    31  	DATA(20, U8(1))
    32  	DATA(21, U8(1))
    33  	DATA(22, U8(1))
    34  	DATA(23, U8(1))
    35  	DATA(24, U8(1))
    36  	DATA(25, U8(1))
    37  	DATA(26, U8(1))
    38  	DATA(27, U8(1))
    39  	DATA(28, U8(1))
    40  	DATA(29, U8(1))
    41  	DATA(30, U8(1))
    42  	DATA(31, U8(1))
    43  
    44  	TEXT("Not_AVX2", NOSPLIT, "func(x []bool)")
    45  	Pragma("noescape")
    46  	Load(Param("x").Base(), RDI)
    47  	Load(Param("x").Len(), RSI)
    48  
    49  	TESTQ(RSI, RSI)
    50  	JE(LabelRef("LBB0_17"))
    51  	CMPQ(RSI, Imm(16))
    52  	JAE(LabelRef("LBB0_3"))
    53  	XORL(EAX, EAX)
    54  	JMP(LabelRef("LBB0_16"))
    55  
    56  	Label("LBB0_3")
    57  	{
    58  		CMPQ(RSI, Imm(128))
    59  		JAE(LabelRef("LBB0_5"))
    60  		XORL(EAX, EAX)
    61  		JMP(LabelRef("LBB0_13"))
    62  	}
    63  
    64  	Label("LBB0_5")
    65  	{
    66  		MOVQ(RSI, RAX)
    67  		ANDQ(I32(-128), RAX)
    68  		LEAQ(Mem{Base: RAX}.Offset(-128), RCX)
    69  		MOVQ(RCX, R8)
    70  		SHRQ(Imm(7), R8)
    71  		ADDQ(Imm(1), R8)
    72  		TESTQ(RCX, RCX)
    73  		JE(LabelRef("LBB0_6"))
    74  		MOVQ(R8, RDX)
    75  		ANDQ(I32(-2), RDX)
    76  		XORL(ECX, ECX)
    77  		VMOVUPS(data.Offset(0), Y0)
    78  	}
    79  
    80  	Label("LBB0_8")
    81  	{
    82  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y1)
    83  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(32), Y0, Y2)
    84  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(64), Y0, Y3)
    85  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(96), Y0, Y4)
    86  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1))
    87  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(32))
    88  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(64))
    89  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 1).Offset(96))
    90  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(128), Y0, Y1)
    91  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(160), Y0, Y2)
    92  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(192), Y0, Y3)
    93  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(224), Y0, Y4)
    94  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1).Offset(128))
    95  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(160))
    96  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(192))
    97  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 1).Offset(224))
    98  		ADDQ(I32(256), RCX)
    99  		ADDQ(I32(-2), RDX)
   100  		JNE(LabelRef("LBB0_8"))
   101  		TESTB(Imm(1), R8B)
   102  		JE(LabelRef("LBB0_11"))
   103  	}
   104  
   105  	Label("LBB0_10")
   106  	{
   107  		VMOVUPS(data.Offset(0), Y0)
   108  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y1)
   109  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(32), Y0, Y2)
   110  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(64), Y0, Y3)
   111  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(96), Y0, Y0)
   112  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1))
   113  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(32))
   114  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(64))
   115  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 1).Offset(96))
   116  	}
   117  
   118  	Label("LBB0_11")
   119  	{
   120  		CMPQ(RAX, RSI)
   121  		JE(LabelRef("LBB0_17"))
   122  		TESTB(Imm(112), SIB)
   123  		JE(LabelRef("LBB0_16"))
   124  	}
   125  
   126  	Label("LBB0_13")
   127  	{
   128  		MOVQ(RAX, RCX)
   129  		MOVQ(RSI, RAX)
   130  		ANDQ(I32(-16), RAX)
   131  		VMOVUPS(data.Offset(0), X0)
   132  	}
   133  
   134  	Label("LBB0_14")
   135  	{
   136  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1), X0, X1)
   137  		VMOVUPS(X1, Mem{Base: RDI}.Idx(RCX, 1))
   138  		ADDQ(Imm(16), RCX)
   139  		CMPQ(RAX, RCX)
   140  		JNE(LabelRef("LBB0_14"))
   141  		CMPQ(RAX, RSI)
   142  		JE(LabelRef("LBB0_17"))
   143  	}
   144  
   145  	Label("LBB0_16")
   146  	{
   147  		XORB(Imm(1), Mem{Base: RDI}.Idx(RAX, 1))
   148  		ADDQ(Imm(1), RAX)
   149  		CMPQ(RSI, RAX)
   150  		JNE(LabelRef("LBB0_16"))
   151  	}
   152  
   153  	Label("LBB0_17")
   154  	{
   155  		VZEROUPPER()
   156  		RET()
   157  	}
   158  
   159  	Label("LBB0_6")
   160  	{
   161  		XORL(ECX, ECX)
   162  		TESTB(Imm(1), R8B)
   163  		JNE(LabelRef("LBB0_10"))
   164  		JMP(LabelRef("LBB0_11"))
   165  	}
   166  }
   167  
   168  func genAnd() {
   169  
   170  	TEXT("And_AVX2", NOSPLIT, "func(x, y []bool)")
   171  	Pragma("noescape")
   172  	Load(Param("x").Base(), RDI)
   173  	Load(Param("y").Base(), RSI)
   174  	Load(Param("x").Len(), RDX)
   175  
   176  	TESTQ(RDX, RDX)
   177  	JE(LabelRef("LBB1_13"))
   178  	CMPQ(RDX, Imm(16))
   179  	JAE(LabelRef("LBB1_3"))
   180  	XORL(EAX, EAX)
   181  	JMP(LabelRef("LBB1_12"))
   182  
   183  	Label("LBB1_3")
   184  	{
   185  		CMPQ(RDX, Imm(128))
   186  		JAE(LabelRef("LBB1_5"))
   187  		XORL(EAX, EAX)
   188  		JMP(LabelRef("LBB1_9"))
   189  	}
   190  
   191  	Label("LBB1_5")
   192  	{
   193  		MOVQ(RDX, RAX)
   194  		ANDQ(I32(-128), RAX)
   195  		XORL(ECX, ECX)
   196  	}
   197  
   198  	Label("LBB1_6")
   199  	{
   200  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), Y0)
   201  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(32), Y1)
   202  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(64), Y2)
   203  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(96), Y3)
   204  		VANDPS(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y0)
   205  		VANDPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(32), Y1, Y1)
   206  		VANDPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(64), Y2, Y2)
   207  		VANDPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(96), Y3, Y3)
   208  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 1))
   209  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1).Offset(32))
   210  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(64))
   211  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(96))
   212  		SUBQ(I32(-128), RCX)
   213  		CMPQ(RAX, RCX)
   214  		JNE(LabelRef("LBB1_6"))
   215  		CMPQ(RAX, RDX)
   216  		JE(LabelRef("LBB1_13"))
   217  		TESTB(Imm(112), DL)
   218  		JE(LabelRef("LBB1_12"))
   219  	}
   220  
   221  	Label("LBB1_9")
   222  	{
   223  		MOVQ(RAX, RCX)
   224  		MOVQ(RDX, RAX)
   225  		ANDQ(I32(-16), RAX)
   226  	}
   227  
   228  	Label("LBB1_10")
   229  	{
   230  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), X0)
   231  		VANDPS(Mem{Base: RDI}.Idx(RCX, 1), X0, X0)
   232  		VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 1))
   233  		ADDQ(Imm(16), RCX)
   234  		CMPQ(RAX, RCX)
   235  		JNE(LabelRef("LBB1_10"))
   236  		CMPQ(RAX, RDX)
   237  		JE(LabelRef("LBB1_13"))
   238  	}
   239  
   240  	Label("LBB1_12")
   241  	{
   242  		MOVBLZX(Mem{Base: RSI}.Idx(RAX, 1), ECX)
   243  		ANDB(CL, Mem{Base: RDI}.Idx(RAX, 1))
   244  		ADDQ(Imm(1), RAX)
   245  		CMPQ(RDX, RAX)
   246  		JNE(LabelRef("LBB1_12"))
   247  	}
   248  
   249  	Label("LBB1_13")
   250  	{
   251  		VZEROUPPER()
   252  		RET()
   253  	}
   254  }
   255  
   256  func genOr() {
   257  
   258  	TEXT("Or_AVX2", NOSPLIT, "func(x, y []bool)")
   259  	Pragma("noescape")
   260  	Load(Param("x").Base(), RDI)
   261  	Load(Param("y").Base(), RSI)
   262  	Load(Param("x").Len(), RDX)
   263  
   264  	TESTQ(RDX, RDX)
   265  	JE(LabelRef("LBB2_13"))
   266  	CMPQ(RDX, Imm(16))
   267  	JAE(LabelRef("LBB2_3"))
   268  	XORL(EAX, EAX)
   269  	JMP(LabelRef("LBB2_12"))
   270  
   271  	Label("LBB2_3")
   272  	{
   273  		CMPQ(RDX, Imm(128))
   274  		JAE(LabelRef("LBB2_5"))
   275  		XORL(EAX, EAX)
   276  		JMP(LabelRef("LBB2_9"))
   277  	}
   278  
   279  	Label("LBB2_5")
   280  	{
   281  		MOVQ(RDX, RAX)
   282  		ANDQ(I32(-128), RAX)
   283  		XORL(ECX, ECX)
   284  	}
   285  
   286  	Label("LBB2_6")
   287  	{
   288  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), Y0)
   289  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(32), Y1)
   290  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(64), Y2)
   291  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(96), Y3)
   292  		VORPS(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y0)
   293  		VORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(32), Y1, Y1)
   294  		VORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(64), Y2, Y2)
   295  		VORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(96), Y3, Y3)
   296  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 1))
   297  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1).Offset(32))
   298  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(64))
   299  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(96))
   300  		SUBQ(I32(-128), RCX)
   301  		CMPQ(RAX, RCX)
   302  		JNE(LabelRef("LBB2_6"))
   303  		CMPQ(RAX, RDX)
   304  		JE(LabelRef("LBB2_13"))
   305  		TESTB(Imm(112), DL)
   306  		JE(LabelRef("LBB2_12"))
   307  	}
   308  
   309  	Label("LBB2_9")
   310  	{
   311  		MOVQ(RAX, RCX)
   312  		MOVQ(RDX, RAX)
   313  		ANDQ(I32(-16), RAX)
   314  	}
   315  
   316  	Label("LBB2_10")
   317  	{
   318  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), X0)
   319  		VORPS(Mem{Base: RDI}.Idx(RCX, 1), X0, X0)
   320  		VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 1))
   321  		ADDQ(Imm(16), RCX)
   322  		CMPQ(RAX, RCX)
   323  		JNE(LabelRef("LBB2_10"))
   324  		CMPQ(RAX, RDX)
   325  		JE(LabelRef("LBB2_13"))
   326  	}
   327  
   328  	Label("LBB2_12")
   329  	{
   330  		MOVBLZX(Mem{Base: RSI}.Idx(RAX, 1), ECX)
   331  		ORB(CL, Mem{Base: RDI}.Idx(RAX, 1))
   332  		ADDQ(Imm(1), RAX)
   333  		CMPQ(RDX, RAX)
   334  		JNE(LabelRef("LBB2_12"))
   335  	}
   336  
   337  	Label("LBB2_13")
   338  	{
   339  		VZEROUPPER()
   340  		RET()
   341  	}
   342  }
   343  
   344  func genXor() {
   345  
   346  	TEXT("Xor_AVX2", NOSPLIT, "func(x, y []bool)")
   347  	Pragma("noescape")
   348  	Load(Param("x").Base(), RDI)
   349  	Load(Param("y").Base(), RSI)
   350  	Load(Param("x").Len(), RDX)
   351  
   352  	TESTQ(RDX, RDX)
   353  	JE(LabelRef("LBB3_13"))
   354  	CMPQ(RDX, Imm(16))
   355  	JAE(LabelRef("LBB3_3"))
   356  	XORL(EAX, EAX)
   357  	JMP(LabelRef("LBB3_12"))
   358  
   359  	Label("LBB3_3")
   360  	{
   361  		CMPQ(RDX, Imm(128))
   362  		JAE(LabelRef("LBB3_5"))
   363  		XORL(EAX, EAX)
   364  		JMP(LabelRef("LBB3_9"))
   365  	}
   366  
   367  	Label("LBB3_5")
   368  	{
   369  		MOVQ(RDX, RAX)
   370  		ANDQ(I32(-128), RAX)
   371  		XORL(ECX, ECX)
   372  	}
   373  
   374  	Label("LBB3_6")
   375  	{
   376  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), Y0)
   377  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(32), Y1)
   378  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(64), Y2)
   379  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1).Offset(96), Y3)
   380  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y0)
   381  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(32), Y1, Y1)
   382  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(64), Y2, Y2)
   383  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1).Offset(96), Y3, Y3)
   384  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 1))
   385  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 1).Offset(32))
   386  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 1).Offset(64))
   387  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 1).Offset(96))
   388  		SUBQ(I32(-128), RCX)
   389  		CMPQ(RAX, RCX)
   390  		JNE(LabelRef("LBB3_6"))
   391  		CMPQ(RAX, RDX)
   392  		JE(LabelRef("LBB3_13"))
   393  		TESTB(Imm(112), DL)
   394  		JE(LabelRef("LBB3_12"))
   395  	}
   396  
   397  	Label("LBB3_9")
   398  	{
   399  		MOVQ(RAX, RCX)
   400  		MOVQ(RDX, RAX)
   401  		ANDQ(I32(-16), RAX)
   402  	}
   403  
   404  	Label("LBB3_10")
   405  	{
   406  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 1), X0)
   407  		VXORPS(Mem{Base: RDI}.Idx(RCX, 1), X0, X0)
   408  		VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 1))
   409  		ADDQ(Imm(16), RCX)
   410  		CMPQ(RAX, RCX)
   411  		JNE(LabelRef("LBB3_10"))
   412  		CMPQ(RAX, RDX)
   413  		JE(LabelRef("LBB3_13"))
   414  	}
   415  
   416  	Label("LBB3_12")
   417  	{
   418  		MOVBLZX(Mem{Base: RSI}.Idx(RAX, 1), ECX)
   419  		XORB(CL, Mem{Base: RDI}.Idx(RAX, 1))
   420  		ADDQ(Imm(1), RAX)
   421  		CMPQ(RDX, RAX)
   422  		JNE(LabelRef("LBB3_12"))
   423  	}
   424  
   425  	Label("LBB3_13")
   426  	{
   427  		VZEROUPPER()
   428  		RET()
   429  	}
   430  }
   431  
   432  func genSelect_F64() {
   433  
   434  	TEXT("Select_AVX2_F64", NOSPLIT, "func(x, y []float64, z []bool) int")
   435  	Pragma("noescape")
   436  	Load(Param("x").Base(), RDI)
   437  	Load(Param("y").Base(), RSI)
   438  	Load(Param("z").Base(), RDX)
   439  	Load(Param("z").Len(), RCX)
   440  
   441  	TESTQ(RCX, RCX)
   442  	JE(LabelRef("LBB4_1"))
   443  	CMPQ(RCX, Imm(1))
   444  	JNE(LabelRef("LBB4_4"))
   445  	XORL(R8L, R8L)
   446  	XORL(EAX, EAX)
   447  
   448  	Label("LBB4_10")
   449  	{
   450  		TESTB(Imm(1), CL)
   451  		JE(LabelRef("LBB4_13"))
   452  		CMPB(Mem{Base: RDX}.Idx(R8, 1), Imm(0))
   453  		JE(LabelRef("LBB4_13"))
   454  		VMOVSD(Mem{Base: RSI}.Idx(R8, 8), X0)
   455  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   456  		ADDQ(Imm(1), RAX)
   457  	}
   458  
   459  	Label("LBB4_13")
   460  	{
   461  		Store(RAX, ReturnIndex(0))
   462  		RET()
   463  	}
   464  
   465  	Label("LBB4_1")
   466  	{
   467  		XORL(EAX, EAX)
   468  		Store(RAX, ReturnIndex(0))
   469  		RET()
   470  	}
   471  
   472  	Label("LBB4_4")
   473  	{
   474  		MOVQ(RCX, R9)
   475  		ANDQ(I32(-2), R9)
   476  		XORL(R8L, R8L)
   477  		XORL(EAX, EAX)
   478  		JMP(LabelRef("LBB4_5"))
   479  	}
   480  
   481  	Label("LBB4_9")
   482  	{
   483  		ADDQ(Imm(2), R8)
   484  		CMPQ(R9, R8)
   485  		JE(LabelRef("LBB4_10"))
   486  	}
   487  
   488  	Label("LBB4_5")
   489  	{
   490  		CMPB(Mem{Base: RDX}.Idx(R8, 1), Imm(0))
   491  		JE(LabelRef("LBB4_7"))
   492  		VMOVSD(Mem{Base: RSI}.Idx(R8, 8), X0)
   493  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   494  		ADDQ(Imm(1), RAX)
   495  	}
   496  
   497  	Label("LBB4_7")
   498  	{
   499  		CMPB(Mem{Base: RDX}.Idx(R8, 1).Offset(1), Imm(0))
   500  		JE(LabelRef("LBB4_9"))
   501  		VMOVSD(Mem{Base: RSI}.Idx(R8, 8).Offset(8), X0)
   502  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   503  		ADDQ(Imm(1), RAX)
   504  		JMP(LabelRef("LBB4_9"))
   505  	}
   506  }
   507  
   508  func genSelect_F32() {
   509  
   510  	TEXT("Select_AVX2_F32", NOSPLIT, "func(x, y []float32, z []bool) int")
   511  	Pragma("noescape")
   512  	Load(Param("x").Base(), RDI)
   513  	Load(Param("y").Base(), RSI)
   514  	Load(Param("z").Base(), RDX)
   515  	Load(Param("z").Len(), RCX)
   516  
   517  	TESTQ(RCX, RCX)
   518  	JE(LabelRef("LBB5_1"))
   519  	CMPQ(RCX, Imm(1))
   520  	JNE(LabelRef("LBB5_4"))
   521  	XORL(R8L, R8L)
   522  	XORL(EAX, EAX)
   523  
   524  	Label("LBB5_10")
   525  	{
   526  		TESTB(Imm(1), CL)
   527  		JE(LabelRef("LBB5_13"))
   528  		CMPB(Mem{Base: RDX}.Idx(R8, 1), Imm(0))
   529  		JE(LabelRef("LBB5_13"))
   530  		VMOVSS(Mem{Base: RSI}.Idx(R8, 4), X0)
   531  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   532  		ADDQ(Imm(1), RAX)
   533  	}
   534  
   535  	Label("LBB5_13")
   536  	{
   537  		Store(RAX, ReturnIndex(0))
   538  		RET()
   539  	}
   540  
   541  	Label("LBB5_1")
   542  	{
   543  		XORL(EAX, EAX)
   544  		Store(RAX, ReturnIndex(0))
   545  		RET()
   546  	}
   547  
   548  	Label("LBB5_4")
   549  	{
   550  		MOVQ(RCX, R9)
   551  		ANDQ(I32(-2), R9)
   552  		XORL(R8L, R8L)
   553  		XORL(EAX, EAX)
   554  		JMP(LabelRef("LBB5_5"))
   555  	}
   556  
   557  	Label("LBB5_9")
   558  	{
   559  		ADDQ(Imm(2), R8)
   560  		CMPQ(R9, R8)
   561  		JE(LabelRef("LBB5_10"))
   562  	}
   563  
   564  	Label("LBB5_5")
   565  	{
   566  		CMPB(Mem{Base: RDX}.Idx(R8, 1), Imm(0))
   567  		JE(LabelRef("LBB5_7"))
   568  		VMOVSS(Mem{Base: RSI}.Idx(R8, 4), X0)
   569  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   570  		ADDQ(Imm(1), RAX)
   571  	}
   572  
   573  	Label("LBB5_7")
   574  	{
   575  		CMPB(Mem{Base: RDX}.Idx(R8, 1).Offset(1), Imm(0))
   576  		JE(LabelRef("LBB5_9"))
   577  		VMOVSS(Mem{Base: RSI}.Idx(R8, 4).Offset(4), X0)
   578  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   579  		ADDQ(Imm(1), RAX)
   580  		JMP(LabelRef("LBB5_9"))
   581  	}
   582  }
   583  
   584  func genAll() {
   585  
   586  	TEXT("All_AVX2", NOSPLIT, "func(x []bool) int")
   587  	Pragma("noescape")
   588  	Load(Param("x").Base(), RDI)
   589  	Load(Param("x").Len(), RSI)
   590  
   591  	MOVQ(RSI, RAX)
   592  	XORL(ECX, ECX)
   593  	ANDQ(I32(-32), RAX)
   594  	JE(LabelRef("LBB0_1"))
   595  	VPXOR(X0, X0, X0)
   596  
   597  	Label("LBB0_8")
   598  	{
   599  		VPCMPEQB(Mem{Base: RDI}.Idx(RCX, 1), Y0, Y1)
   600  		VPTEST(Y1, Y1)
   601  		JNE(LabelRef("LBB0_9"))
   602  		ADDQ(Imm(32), RCX)
   603  		CMPQ(RCX, RAX)
   604  		JB(LabelRef("LBB0_8"))
   605  	}
   606  
   607  	Label("LBB0_1")
   608  	{
   609  		MOVB(Imm(1), AL)
   610  		CMPQ(RCX, RSI)
   611  		JAE(LabelRef("LBB0_6"))
   612  		ADDQ(I32(-1), RSI)
   613  	}
   614  
   615  	Label("LBB0_3")
   616  	{
   617  		MOVBLZX(Mem{Base: RDI}.Idx(RCX, 1), EAX)
   618  		TESTB(AL, AL)
   619  		JE(LabelRef("LBB0_5"))
   620  		LEAQ(Mem{Base: RCX}.Offset(1), RDX)
   621  		CMPQ(RSI, RCX)
   622  		MOVQ(RDX, RCX)
   623  		JNE(LabelRef("LBB0_3"))
   624  	}
   625  
   626  	Label("LBB0_5")
   627  	{
   628  		TESTB(AL, AL)
   629  		SETNE(AL)
   630  	}
   631  
   632  	Label("LBB0_6")
   633  	{
   634  		VZEROUPPER()
   635  		Store(RAX, ReturnIndex(0))
   636  		RET()
   637  	}
   638  
   639  	Label("LBB0_9")
   640  	{
   641  		XORL(EAX, EAX)
   642  		VZEROUPPER()
   643  		Store(RAX, ReturnIndex(0))
   644  		RET()
   645  	}
   646  }
   647  
   648  func genAny() {
   649  
   650  	TEXT("Any_AVX2", NOSPLIT, "func(x []bool) int")
   651  	Pragma("noescape")
   652  	Load(Param("x").Base(), RDI)
   653  	Load(Param("x").Len(), RSI)
   654  
   655  	MOVQ(RSI, RCX)
   656  	XORL(EAX, EAX)
   657  	ANDQ(I32(-32), RCX)
   658  	JE(LabelRef("LBB1_1"))
   659  
   660  	Label("LBB1_4")
   661  	{
   662  		VMOVDQU(Mem{Base: RDI}.Idx(RAX, 1), Y0)
   663  		VPTEST(Y0, Y0)
   664  		JNE(LabelRef("LBB1_5"))
   665  		ADDQ(Imm(32), RAX)
   666  		CMPQ(RAX, RCX)
   667  		JB(LabelRef("LBB1_4"))
   668  	}
   669  
   670  	Label("LBB1_1")
   671  	{
   672  		CMPQ(RAX, RSI)
   673  		JAE(LabelRef("LBB1_2"))
   674  		ADDQ(I32(-1), RSI)
   675  	}
   676  
   677  	Label("LBB1_7")
   678  	{
   679  		MOVBLZX(Mem{Base: RDI}.Idx(RAX, 1), ECX)
   680  		TESTB(CL, CL)
   681  		JNE(LabelRef("LBB1_9"))
   682  		LEAQ(Mem{Base: RAX}.Offset(1), RDX)
   683  		CMPQ(RSI, RAX)
   684  		MOVQ(RDX, RAX)
   685  		JNE(LabelRef("LBB1_7"))
   686  	}
   687  
   688  	Label("LBB1_9")
   689  	{
   690  		TESTB(CL, CL)
   691  		SETNE(AL)
   692  		VZEROUPPER()
   693  		Store(RAX, ReturnIndex(0))
   694  		RET()
   695  	}
   696  
   697  	Label("LBB1_5")
   698  	{
   699  		MOVB(Imm(1), AL)
   700  		VZEROUPPER()
   701  		Store(RAX, ReturnIndex(0))
   702  		RET()
   703  	}
   704  
   705  	Label("LBB1_2")
   706  	{
   707  		XORL(EAX, EAX)
   708  		VZEROUPPER()
   709  		Store(RAX, ReturnIndex(0))
   710  		RET()
   711  	}
   712  }
   713  
   714  func genNone() {
   715  
   716  	TEXT("None_AVX2", NOSPLIT, "func(x []bool) int")
   717  	Pragma("noescape")
   718  	Load(Param("x").Base(), RDI)
   719  	Load(Param("x").Len(), RSI)
   720  
   721  	MOVQ(RSI, RAX)
   722  	XORL(ECX, ECX)
   723  	ANDQ(I32(-32), RAX)
   724  	JE(LabelRef("LBB2_1"))
   725  
   726  	Label("LBB2_7")
   727  	{
   728  		VMOVDQU(Mem{Base: RDI}.Idx(RCX, 1), Y0)
   729  		VPTEST(Y0, Y0)
   730  		JNE(LabelRef("LBB2_8"))
   731  		ADDQ(Imm(32), RCX)
   732  		CMPQ(RCX, RAX)
   733  		JB(LabelRef("LBB2_7"))
   734  	}
   735  
   736  	Label("LBB2_1")
   737  	{
   738  		MOVB(Imm(1), AL)
   739  		CMPQ(RCX, RSI)
   740  		JAE(LabelRef("LBB2_5"))
   741  		ADDQ(I32(-1), RSI)
   742  	}
   743  
   744  	Label("LBB2_3")
   745  	{
   746  		CMPB(Mem{Base: RDI}.Idx(RCX, 1), Imm(0))
   747  		SETEQ(AL)
   748  		JNE(LabelRef("LBB2_5"))
   749  		LEAQ(Mem{Base: RCX}.Offset(1), RDX)
   750  		CMPQ(RSI, RCX)
   751  		MOVQ(RDX, RCX)
   752  		JNE(LabelRef("LBB2_3"))
   753  	}
   754  
   755  	Label("LBB2_5")
   756  	{
   757  		VZEROUPPER()
   758  		Store(RAX, ReturnIndex(0))
   759  		RET()
   760  	}
   761  
   762  	Label("LBB2_8")
   763  	{
   764  		XORL(EAX, EAX)
   765  		VZEROUPPER()
   766  		Store(RAX, ReturnIndex(0))
   767  		RET()
   768  	}
   769  }
   770  
   771  func genCount() {
   772  
   773  	TEXT("Count_AVX2", NOSPLIT, "func(x []bool) int")
   774  	Pragma("noescape")
   775  	Load(Param("x").Base(), RDI)
   776  	Load(Param("x").Len(), RSI)
   777  
   778  	TESTQ(RSI, RSI)
   779  	JE(LabelRef("LBB9_1"))
   780  	CMPQ(RSI, Imm(16))
   781  	JAE(LabelRef("LBB9_4"))
   782  	XORL(ECX, ECX)
   783  	XORL(EAX, EAX)
   784  	JMP(LabelRef("LBB9_11"))
   785  
   786  	Label("LBB9_1")
   787  	{
   788  		XORL(EAX, EAX)
   789  		Store(RAX, ReturnIndex(0))
   790  		RET()
   791  	}
   792  
   793  	Label("LBB9_4")
   794  	{
   795  		MOVQ(RSI, RCX)
   796  		ANDQ(I32(-16), RCX)
   797  		LEAQ(Mem{Base: RCX}.Offset(-16), RAX)
   798  		MOVQ(RAX, R8)
   799  		SHRQ(Imm(4), R8)
   800  		ADDQ(Imm(1), R8)
   801  		TESTQ(RAX, RAX)
   802  		JE(LabelRef("LBB9_5"))
   803  		MOVQ(R8, RDX)
   804  		ANDQ(I32(-2), RDX)
   805  		VPXOR(X0, X0, X0)
   806  		XORL(EAX, EAX)
   807  		VPXOR(X1, X1, X1)
   808  		VPXOR(X2, X2, X2)
   809  		VPXOR(X3, X3, X3)
   810  	}
   811  
   812  	Label("LBB9_7")
   813  	{
   814  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1), Y4)
   815  		VPADDQ(Y4, Y0, Y0)
   816  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(4), Y4)
   817  		VPADDQ(Y4, Y1, Y1)
   818  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(8), Y4)
   819  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(12), Y5)
   820  		VPADDQ(Y4, Y2, Y2)
   821  		VPADDQ(Y5, Y3, Y3)
   822  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(16), Y4)
   823  		VPADDQ(Y4, Y0, Y0)
   824  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(20), Y4)
   825  		VPADDQ(Y4, Y1, Y1)
   826  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(24), Y4)
   827  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(28), Y5)
   828  		VPADDQ(Y4, Y2, Y2)
   829  		VPADDQ(Y5, Y3, Y3)
   830  		ADDQ(Imm(32), RAX)
   831  		ADDQ(I32(-2), RDX)
   832  		JNE(LabelRef("LBB9_7"))
   833  		TESTB(Imm(1), R8B)
   834  		JE(LabelRef("LBB9_10"))
   835  	}
   836  
   837  	Label("LBB9_9")
   838  	{
   839  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1), Y4)
   840  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(4), Y5)
   841  		VPADDQ(Y4, Y0, Y0)
   842  		VPADDQ(Y5, Y1, Y1)
   843  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(8), Y4)
   844  		VPADDQ(Y4, Y2, Y2)
   845  		VPMOVZXBQ(Mem{Base: RDI}.Idx(RAX, 1).Offset(12), Y4)
   846  		VPADDQ(Y4, Y3, Y3)
   847  	}
   848  
   849  	Label("LBB9_10")
   850  	{
   851  		VPADDQ(Y3, Y1, Y1)
   852  		VPADDQ(Y2, Y0, Y0)
   853  		VPADDQ(Y1, Y0, Y0)
   854  		VEXTRACTI128(Imm(1), Y0, X1)
   855  		VPADDQ(X1, X0, X0)
   856  		VPSHUFD(Imm(238), X0, X1)
   857  		VPADDQ(X1, X0, X0)
   858  		VMOVQ(X0, RAX)
   859  		CMPQ(RCX, RSI)
   860  		JE(LabelRef("LBB9_12"))
   861  	}
   862  
   863  	Label("LBB9_11")
   864  	{
   865  		MOVBLZX(Mem{Base: RDI}.Idx(RCX, 1), EDX)
   866  		ADDQ(RDX, RAX)
   867  		ADDQ(Imm(1), RCX)
   868  		CMPQ(RSI, RCX)
   869  		JNE(LabelRef("LBB9_11"))
   870  	}
   871  
   872  	Label("LBB9_12")
   873  	{
   874  		VZEROUPPER()
   875  		Store(RAX, ReturnIndex(0))
   876  		RET()
   877  	}
   878  
   879  	Label("LBB9_5")
   880  	{
   881  		VPXOR(X0, X0, X0)
   882  		XORL(EAX, EAX)
   883  		VPXOR(X1, X1, X1)
   884  		VPXOR(X2, X2, X2)
   885  		VPXOR(X3, X3, X3)
   886  		TESTB(Imm(1), R8B)
   887  		JNE(LabelRef("LBB9_9"))
   888  		JMP(LabelRef("LBB9_10"))
   889  	}
   890  }