gitee.com/quant1x/gox@v1.7.6/num/asm/construct.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 genRepeat_F64() {
    10  
    11  	TEXT("Repeat_AVX2_F64", NOSPLIT, "func(x []float64, a float64, n int)")
    12  	Pragma("noescape")
    13  	Load(Param("x").Base(), RDI)
    14  	Load(Param("a"), X0)
    15  	Load(Param("n"), RSI)
    16  
    17  	TESTQ(RSI, RSI)
    18  	JE(LabelRef("LBB0_12"))
    19  	CMPQ(RSI, Imm(16))
    20  	JAE(LabelRef("LBB0_3"))
    21  	XORL(EAX, EAX)
    22  	JMP(LabelRef("LBB0_11"))
    23  
    24  	Label("LBB0_3")
    25  	{
    26  		MOVQ(RSI, RAX)
    27  		ANDQ(I32(-16), RAX)
    28  		VBROADCASTSD(X0, Y1)
    29  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
    30  		MOVQ(RCX, RDX)
    31  		SHRQ(Imm(4), RDX)
    32  		ADDQ(Imm(1), RDX)
    33  		MOVL(EDX, R8L)
    34  		ANDL(Imm(3), R8L)
    35  		CMPQ(RCX, Imm(48))
    36  		JAE(LabelRef("LBB0_5"))
    37  		XORL(ECX, ECX)
    38  		JMP(LabelRef("LBB0_7"))
    39  	}
    40  
    41  	Label("LBB0_5")
    42  	{
    43  		ANDQ(I32(-4), RDX)
    44  		XORL(ECX, ECX)
    45  	}
    46  
    47  	Label("LBB0_6")
    48  	{
    49  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8))
    50  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
    51  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
    52  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
    53  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(128))
    54  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(160))
    55  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(192))
    56  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(224))
    57  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(256))
    58  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(288))
    59  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(320))
    60  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(352))
    61  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(384))
    62  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(416))
    63  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(448))
    64  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(480))
    65  		ADDQ(Imm(64), RCX)
    66  		ADDQ(I32(-4), RDX)
    67  		JNE(LabelRef("LBB0_6"))
    68  	}
    69  
    70  	Label("LBB0_7")
    71  	{
    72  		TESTQ(R8, R8)
    73  		JE(LabelRef("LBB0_10"))
    74  		LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RCX)
    75  		ADDQ(Imm(96), RCX)
    76  		SHLQ(Imm(7), R8)
    77  		XORL(EDX, EDX)
    78  	}
    79  
    80  	Label("LBB0_9")
    81  	{
    82  		VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-96))
    83  		VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-64))
    84  		VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-32))
    85  		VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1))
    86  		SUBQ(I32(-128), RDX)
    87  		CMPQ(R8, RDX)
    88  		JNE(LabelRef("LBB0_9"))
    89  	}
    90  
    91  	Label("LBB0_10")
    92  	{
    93  		CMPQ(RAX, RSI)
    94  		JE(LabelRef("LBB0_12"))
    95  	}
    96  
    97  	Label("LBB0_11")
    98  	{
    99  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   100  		ADDQ(Imm(1), RAX)
   101  		CMPQ(RSI, RAX)
   102  		JNE(LabelRef("LBB0_11"))
   103  	}
   104  
   105  	Label("LBB0_12")
   106  	{
   107  		VZEROUPPER()
   108  		RET()
   109  	}
   110  }
   111  
   112  func genRepeat_F32() {
   113  
   114  	TEXT("Repeat_AVX2_F32", NOSPLIT, "func(x []float32, a float32, n int)")
   115  	Pragma("noescape")
   116  	Load(Param("x").Base(), RDI)
   117  	Load(Param("a"), X0)
   118  	Load(Param("n"), RSI)
   119  
   120  	TESTQ(RSI, RSI)
   121  	JE(LabelRef("LBB1_12"))
   122  	CMPQ(RSI, Imm(32))
   123  	JAE(LabelRef("LBB1_3"))
   124  	XORL(EAX, EAX)
   125  	JMP(LabelRef("LBB1_11"))
   126  
   127  	Label("LBB1_3")
   128  	{
   129  		MOVQ(RSI, RAX)
   130  		ANDQ(I32(-32), RAX)
   131  		VBROADCASTSS(X0, Y1)
   132  		LEAQ(Mem{Base: RAX}.Offset(-32), RCX)
   133  		MOVQ(RCX, RDX)
   134  		SHRQ(Imm(5), RDX)
   135  		ADDQ(Imm(1), RDX)
   136  		MOVL(EDX, R8L)
   137  		ANDL(Imm(3), R8L)
   138  		CMPQ(RCX, Imm(96))
   139  		JAE(LabelRef("LBB1_5"))
   140  		XORL(ECX, ECX)
   141  		JMP(LabelRef("LBB1_7"))
   142  	}
   143  
   144  	Label("LBB1_5")
   145  	{
   146  		ANDQ(I32(-4), RDX)
   147  		XORL(ECX, ECX)
   148  	}
   149  
   150  	Label("LBB1_6")
   151  	{
   152  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4))
   153  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   154  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   155  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   156  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(128))
   157  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(160))
   158  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(192))
   159  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(224))
   160  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(256))
   161  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(288))
   162  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(320))
   163  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(352))
   164  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(384))
   165  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(416))
   166  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(448))
   167  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(480))
   168  		SUBQ(I32(-128), RCX)
   169  		ADDQ(I32(-4), RDX)
   170  		JNE(LabelRef("LBB1_6"))
   171  	}
   172  
   173  	Label("LBB1_7")
   174  	{
   175  		TESTQ(R8, R8)
   176  		JE(LabelRef("LBB1_10"))
   177  		LEAQ(Mem{Base: RDI}.Idx(RCX, 4), RCX)
   178  		ADDQ(Imm(96), RCX)
   179  		SHLQ(Imm(7), R8)
   180  		XORL(EDX, EDX)
   181  	}
   182  
   183  	Label("LBB1_9")
   184  	{
   185  		VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-96))
   186  		VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-64))
   187  		VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1).Offset(-32))
   188  		VMOVUPS(Y1, Mem{Base: RCX}.Idx(RDX, 1))
   189  		SUBQ(I32(-128), RDX)
   190  		CMPQ(R8, RDX)
   191  		JNE(LabelRef("LBB1_9"))
   192  	}
   193  
   194  	Label("LBB1_10")
   195  	{
   196  		CMPQ(RAX, RSI)
   197  		JE(LabelRef("LBB1_12"))
   198  	}
   199  
   200  	Label("LBB1_11")
   201  	{
   202  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   203  		ADDQ(Imm(1), RAX)
   204  		CMPQ(RSI, RAX)
   205  		JNE(LabelRef("LBB1_11"))
   206  	}
   207  
   208  	Label("LBB1_12")
   209  	{
   210  		VZEROUPPER()
   211  		RET()
   212  	}
   213  }
   214  
   215  func genRange_F64() {
   216  
   217  	data := GLOBL("dataRangeF64", RODATA|NOPTR)
   218  	DATA(0, U64(0x0000000000000000))
   219  	DATA(8, U64(0x3ff0000000000000))
   220  	DATA(16, U64(0x4000000000000000))
   221  	DATA(24, U64(0x4008000000000000))
   222  	DATA(32, U64(0x4010000000000000))
   223  	DATA(40, U64(0x4020000000000000))
   224  	DATA(48, U64(0x4028000000000000))
   225  	DATA(56, U64(0x4030000000000000))
   226  	DATA(64, U64(0x4034000000000000))
   227  	DATA(72, U64(0x4038000000000000))
   228  	DATA(80, U64(0x403c000000000000))
   229  	DATA(88, U64(0x4040000000000000))
   230  	DATA(96, U64(0x3ff0000000000000))
   231  
   232  	TEXT("Range_AVX2_F64", NOSPLIT, "func(x []float64, a float64, n int)")
   233  	Pragma("noescape")
   234  	Load(Param("x").Base(), RDI)
   235  	Load(Param("a"), X0)
   236  	Load(Param("n"), RSI)
   237  
   238  	TESTQ(RSI, RSI)
   239  	JE(LabelRef("LBB2_13"))
   240  	CMPQ(RSI, Imm(16))
   241  	JAE(LabelRef("LBB2_3"))
   242  	XORL(EAX, EAX)
   243  	JMP(LabelRef("LBB2_11"))
   244  
   245  	Label("LBB2_3")
   246  	{
   247  		MOVQ(RSI, RAX)
   248  		ANDQ(I32(-16), RAX)
   249  		VBROADCASTSD(X0, Y1)
   250  		VADDPD(data.Offset(0), Y1, Y1)
   251  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
   252  		MOVQ(RCX, R8)
   253  		SHRQ(Imm(4), R8)
   254  		ADDQ(Imm(1), R8)
   255  		TESTQ(RCX, RCX)
   256  		JE(LabelRef("LBB2_4"))
   257  		MOVQ(R8, RDX)
   258  		ANDQ(I32(-2), RDX)
   259  		XORL(ECX, ECX)
   260  		VBROADCASTSD(data.Offset(32), Y2)
   261  		VBROADCASTSD(data.Offset(40), Y3)
   262  		VBROADCASTSD(data.Offset(48), Y4)
   263  		VBROADCASTSD(data.Offset(56), Y5)
   264  		VBROADCASTSD(data.Offset(64), Y6)
   265  		VBROADCASTSD(data.Offset(72), Y7)
   266  		VBROADCASTSD(data.Offset(80), Y8)
   267  		VBROADCASTSD(data.Offset(88), Y9)
   268  	}
   269  
   270  	Label("LBB2_6")
   271  	{
   272  		VADDPD(Y2, Y1, Y10)
   273  		VADDPD(Y3, Y1, Y11)
   274  		VADDPD(Y4, Y1, Y12)
   275  		VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8))
   276  		VMOVUPD(Y10, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
   277  		VMOVUPD(Y11, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
   278  		VMOVUPD(Y12, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
   279  		VADDPD(Y5, Y1, Y10)
   280  		VADDPD(Y6, Y1, Y11)
   281  		VADDPD(Y7, Y1, Y12)
   282  		VADDPD(Y1, Y8, Y13)
   283  		VMOVUPD(Y10, Mem{Base: RDI}.Idx(RCX, 8).Offset(128))
   284  		VMOVUPD(Y11, Mem{Base: RDI}.Idx(RCX, 8).Offset(160))
   285  		VMOVUPD(Y12, Mem{Base: RDI}.Idx(RCX, 8).Offset(192))
   286  		VMOVUPD(Y13, Mem{Base: RDI}.Idx(RCX, 8).Offset(224))
   287  		ADDQ(Imm(32), RCX)
   288  		VADDPD(Y1, Y9, Y1)
   289  		ADDQ(I32(-2), RDX)
   290  		JNE(LabelRef("LBB2_6"))
   291  		TESTB(Imm(1), R8B)
   292  		JE(LabelRef("LBB2_9"))
   293  	}
   294  
   295  	Label("LBB2_8")
   296  	{
   297  		VBROADCASTSD(data.Offset(32), Y2)
   298  		VADDPD(Y2, Y1, Y2)
   299  		VBROADCASTSD(data.Offset(40), Y3)
   300  		VADDPD(Y3, Y1, Y3)
   301  		VBROADCASTSD(data.Offset(48), Y4)
   302  		VADDPD(Y4, Y1, Y4)
   303  		VMOVUPD(Y1, Mem{Base: RDI}.Idx(RCX, 8))
   304  		VMOVUPD(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
   305  		VMOVUPD(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
   306  		VMOVUPD(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
   307  	}
   308  
   309  	Label("LBB2_9")
   310  	{
   311  		CMPQ(RAX, RSI)
   312  		JE(LabelRef("LBB2_13"))
   313  		VCVTSI2SDQ(RAX, X14, X1)
   314  		VADDSD(X0, X1, X0)
   315  	}
   316  
   317  	Label("LBB2_11")
   318  	{
   319  		VMOVSD(data.Offset(96), X1)
   320  	}
   321  
   322  	Label("LBB2_12")
   323  	{
   324  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   325  		VADDSD(X1, X0, X0)
   326  		ADDQ(Imm(1), RAX)
   327  		CMPQ(RSI, RAX)
   328  		JNE(LabelRef("LBB2_12"))
   329  	}
   330  
   331  	Label("LBB2_13")
   332  	{
   333  		VZEROUPPER()
   334  		RET()
   335  	}
   336  
   337  	Label("LBB2_4")
   338  	{
   339  		XORL(ECX, ECX)
   340  		TESTB(Imm(1), R8B)
   341  		JNE(LabelRef("LBB2_8"))
   342  		JMP(LabelRef("LBB2_9"))
   343  	}
   344  }
   345  
   346  func genRange_F32() {
   347  
   348  	data := GLOBL("dataRangeF32", RODATA|NOPTR)
   349  	DATA(0, U32(0x00000000))
   350  	DATA(4, U32(0x3f800000))
   351  	DATA(8, U32(0x40000000))
   352  	DATA(12, U32(0x40400000))
   353  	DATA(16, U32(0x40800000))
   354  	DATA(20, U32(0x40a00000))
   355  	DATA(24, U32(0x40c00000))
   356  	DATA(28, U32(0x40e00000))
   357  
   358  	DATA(32, U32(0x41000000))
   359  	DATA(36, U32(0x41800000))
   360  	DATA(40, U32(0x41c00000))
   361  	DATA(44, U32(0x42000000))
   362  	DATA(48, U32(0x42200000))
   363  	DATA(52, U32(0x42400000))
   364  	DATA(56, U32(0x42600000))
   365  	DATA(60, U32(0x42800000))
   366  	DATA(64, U32(0x3f800000))
   367  
   368  	TEXT("Range_AVX2_F32", NOSPLIT, "func(x []float32, a float32, n int)")
   369  	Pragma("noescape")
   370  	Load(Param("x").Base(), RDI)
   371  	Load(Param("a"), X0)
   372  	Load(Param("n"), RSI)
   373  
   374  	TESTQ(RSI, RSI)
   375  	JE(LabelRef("LBB3_13"))
   376  	CMPQ(RSI, Imm(32))
   377  	JAE(LabelRef("LBB3_3"))
   378  	XORL(EAX, EAX)
   379  	JMP(LabelRef("LBB3_11"))
   380  
   381  	Label("LBB3_3")
   382  	{
   383  		MOVQ(RSI, RAX)
   384  		ANDQ(I32(-32), RAX)
   385  		VBROADCASTSS(X0, Y1)
   386  		VADDPS(data.Offset(0), Y1, Y1)
   387  		LEAQ(Mem{Base: RAX}.Offset(-32), RCX)
   388  		MOVQ(RCX, R8)
   389  		SHRQ(Imm(5), R8)
   390  		ADDQ(Imm(1), R8)
   391  		TESTQ(RCX, RCX)
   392  		JE(LabelRef("LBB3_4"))
   393  		MOVQ(R8, RDX)
   394  		ANDQ(I32(-2), RDX)
   395  		XORL(ECX, ECX)
   396  		VBROADCASTSS(data.Offset(32), Y2)
   397  		VBROADCASTSS(data.Offset(36), Y3)
   398  		VBROADCASTSS(data.Offset(40), Y4)
   399  		VBROADCASTSS(data.Offset(44), Y5)
   400  		VBROADCASTSS(data.Offset(48), Y6)
   401  		VBROADCASTSS(data.Offset(52), Y7)
   402  		VBROADCASTSS(data.Offset(56), Y8)
   403  		VBROADCASTSS(data.Offset(60), Y9)
   404  	}
   405  
   406  	Label("LBB3_6")
   407  	{
   408  		VADDPS(Y2, Y1, Y10)
   409  		VADDPS(Y3, Y1, Y11)
   410  		VADDPS(Y4, Y1, Y12)
   411  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4))
   412  		VMOVUPS(Y10, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   413  		VMOVUPS(Y11, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   414  		VMOVUPS(Y12, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   415  		VADDPS(Y5, Y1, Y10)
   416  		VADDPS(Y6, Y1, Y11)
   417  		VADDPS(Y7, Y1, Y12)
   418  		VADDPS(Y1, Y8, Y13)
   419  		VMOVUPS(Y10, Mem{Base: RDI}.Idx(RCX, 4).Offset(128))
   420  		VMOVUPS(Y11, Mem{Base: RDI}.Idx(RCX, 4).Offset(160))
   421  		VMOVUPS(Y12, Mem{Base: RDI}.Idx(RCX, 4).Offset(192))
   422  		VMOVUPS(Y13, Mem{Base: RDI}.Idx(RCX, 4).Offset(224))
   423  		ADDQ(Imm(64), RCX)
   424  		VADDPS(Y1, Y9, Y1)
   425  		ADDQ(I32(-2), RDX)
   426  		JNE(LabelRef("LBB3_6"))
   427  		TESTB(Imm(1), R8B)
   428  		JE(LabelRef("LBB3_9"))
   429  	}
   430  
   431  	Label("LBB3_8")
   432  	{
   433  		VBROADCASTSS(data.Offset(32), Y2)
   434  		VADDPS(Y2, Y1, Y2)
   435  		VBROADCASTSS(data.Offset(36), Y3)
   436  		VADDPS(Y3, Y1, Y3)
   437  		VBROADCASTSS(data.Offset(40), Y4)
   438  		VADDPS(Y4, Y1, Y4)
   439  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4))
   440  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   441  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   442  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   443  	}
   444  
   445  	Label("LBB3_9")
   446  	{
   447  		CMPQ(RAX, RSI)
   448  		JE(LabelRef("LBB3_13"))
   449  		VCVTSI2SSQ(RAX, X14, X1)
   450  		VADDSS(X0, X1, X0)
   451  	}
   452  
   453  	Label("LBB3_11")
   454  	{
   455  		VMOVSS(data.Offset(64), X1)
   456  	}
   457  
   458  	Label("LBB3_12")
   459  	{
   460  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   461  		VADDSS(X1, X0, X0)
   462  		ADDQ(Imm(1), RAX)
   463  		CMPQ(RSI, RAX)
   464  		JNE(LabelRef("LBB3_12"))
   465  	}
   466  
   467  	Label("LBB3_13")
   468  	{
   469  		VZEROUPPER()
   470  		RET()
   471  	}
   472  
   473  	Label("LBB3_4")
   474  	{
   475  		XORL(ECX, ECX)
   476  		TESTB(Imm(1), R8B)
   477  		JNE(LabelRef("LBB3_8"))
   478  		JMP(LabelRef("LBB3_9"))
   479  	}
   480  }
   481  
   482  func genGather_F64() {
   483  
   484  	TEXT("Gather_AVX2_F64", NOSPLIT, "func(x, y []float64, z []int)")
   485  	Pragma("noescape")
   486  	Load(Param("x").Base(), RDI)
   487  	Load(Param("y").Base(), RSI)
   488  	Load(Param("z").Base(), RDX)
   489  	Load(Param("z").Len(), RCX)
   490  
   491  	TESTQ(RCX, RCX)
   492  	JE(LabelRef("LBB4_7"))
   493  	CMPQ(RCX, Imm(16))
   494  	JAE(LabelRef("LBB4_3"))
   495  	XORL(R8L, R8L)
   496  	JMP(LabelRef("LBB4_6"))
   497  
   498  	Label("LBB4_3")
   499  	{
   500  		MOVQ(RCX, R8)
   501  		ANDQ(I32(-16), R8)
   502  		XORL(R9L, R9L)
   503  	}
   504  
   505  	Label("LBB4_4")
   506  	{
   507  		MOVQ(Mem{Base: RDX}.Idx(R9, 8), RAX)
   508  		VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X0)
   509  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(8), RAX)
   510  		VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X0, X0)
   511  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(16), RAX)
   512  		VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X1)
   513  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(24), RAX)
   514  		VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X1, X1)
   515  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(32), RAX)
   516  		VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X2)
   517  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(40), RAX)
   518  		VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X2, X2)
   519  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(48), RAX)
   520  		VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X3)
   521  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(56), RAX)
   522  		VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X3, X3)
   523  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(64), RAX)
   524  		VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X4)
   525  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(72), RAX)
   526  		VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X4, X4)
   527  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(80), RAX)
   528  		VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X5)
   529  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(88), RAX)
   530  		VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X5, X5)
   531  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(96), RAX)
   532  		VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X6)
   533  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(104), RAX)
   534  		VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X6, X6)
   535  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(112), RAX)
   536  		VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X7)
   537  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(120), RAX)
   538  		VMOVHPS(Mem{Base: RSI}.Idx(RAX, 8), X7, X7)
   539  		VMOVUPS(X1, Mem{Base: RDI}.Idx(R9, 8).Offset(16))
   540  		VMOVUPS(X0, Mem{Base: RDI}.Idx(R9, 8))
   541  		VMOVUPS(X3, Mem{Base: RDI}.Idx(R9, 8).Offset(48))
   542  		VMOVUPS(X2, Mem{Base: RDI}.Idx(R9, 8).Offset(32))
   543  		VMOVUPS(X5, Mem{Base: RDI}.Idx(R9, 8).Offset(80))
   544  		VMOVUPS(X4, Mem{Base: RDI}.Idx(R9, 8).Offset(64))
   545  		VMOVUPS(X7, Mem{Base: RDI}.Idx(R9, 8).Offset(112))
   546  		VMOVUPS(X6, Mem{Base: RDI}.Idx(R9, 8).Offset(96))
   547  		ADDQ(Imm(16), R9)
   548  		CMPQ(R8, R9)
   549  		JNE(LabelRef("LBB4_4"))
   550  		CMPQ(R8, RCX)
   551  		JE(LabelRef("LBB4_7"))
   552  	}
   553  
   554  	Label("LBB4_6")
   555  	{
   556  		MOVQ(Mem{Base: RDX}.Idx(R8, 8), RAX)
   557  		VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X0)
   558  		VMOVSD(X0, Mem{Base: RDI}.Idx(R8, 8))
   559  		ADDQ(Imm(1), R8)
   560  		CMPQ(RCX, R8)
   561  		JNE(LabelRef("LBB4_6"))
   562  	}
   563  
   564  	Label("LBB4_7")
   565  	{
   566  		RET()
   567  	}
   568  }
   569  
   570  func genGather_F32() {
   571  
   572  	TEXT("Gather_AVX2_F32", NOSPLIT, "func(x, y []float32, z []int)")
   573  	Pragma("noescape")
   574  	Load(Param("x").Base(), RDI)
   575  	Load(Param("y").Base(), RSI)
   576  	Load(Param("z").Base(), RDX)
   577  	Load(Param("z").Len(), RCX)
   578  
   579  	TESTQ(RCX, RCX)
   580  	JE(LabelRef("LBB5_7"))
   581  	CMPQ(RCX, Imm(16))
   582  	JAE(LabelRef("LBB5_3"))
   583  	XORL(R8L, R8L)
   584  	JMP(LabelRef("LBB5_6"))
   585  
   586  	Label("LBB5_3")
   587  	{
   588  		MOVQ(RCX, R8)
   589  		ANDQ(I32(-16), R8)
   590  		XORL(R9L, R9L)
   591  	}
   592  
   593  	Label("LBB5_4")
   594  	{
   595  		MOVQ(Mem{Base: RDX}.Idx(R9, 8), RAX)
   596  		VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X0)
   597  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(8), RAX)
   598  		VINSERTPS(Imm(16), Mem{Base: RSI}.Idx(RAX, 4), X0, X0)
   599  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(16), RAX)
   600  		VINSERTPS(Imm(32), Mem{Base: RSI}.Idx(RAX, 4), X0, X0)
   601  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(24), RAX)
   602  		VINSERTPS(Imm(48), Mem{Base: RSI}.Idx(RAX, 4), X0, X0)
   603  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(32), RAX)
   604  		VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X1)
   605  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(40), RAX)
   606  		VINSERTPS(Imm(16), Mem{Base: RSI}.Idx(RAX, 4), X1, X1)
   607  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(48), RAX)
   608  		VINSERTPS(Imm(32), Mem{Base: RSI}.Idx(RAX, 4), X1, X1)
   609  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(56), RAX)
   610  		VINSERTPS(Imm(48), Mem{Base: RSI}.Idx(RAX, 4), X1, X1)
   611  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(64), RAX)
   612  		VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X2)
   613  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(72), RAX)
   614  		VINSERTPS(Imm(16), Mem{Base: RSI}.Idx(RAX, 4), X2, X2)
   615  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(80), RAX)
   616  		VINSERTPS(Imm(32), Mem{Base: RSI}.Idx(RAX, 4), X2, X2)
   617  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(88), RAX)
   618  		VINSERTPS(Imm(48), Mem{Base: RSI}.Idx(RAX, 4), X2, X2)
   619  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(96), RAX)
   620  		VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X3)
   621  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(104), RAX)
   622  		VINSERTPS(Imm(16), Mem{Base: RSI}.Idx(RAX, 4), X3, X3)
   623  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(112), RAX)
   624  		VINSERTPS(Imm(32), Mem{Base: RSI}.Idx(RAX, 4), X3, X3)
   625  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(120), RAX)
   626  		VINSERTPS(Imm(48), Mem{Base: RSI}.Idx(RAX, 4), X3, X3)
   627  		VMOVUPS(X0, Mem{Base: RDI}.Idx(R9, 4))
   628  		VMOVUPS(X1, Mem{Base: RDI}.Idx(R9, 4).Offset(16))
   629  		VMOVUPS(X2, Mem{Base: RDI}.Idx(R9, 4).Offset(32))
   630  		VMOVUPS(X3, Mem{Base: RDI}.Idx(R9, 4).Offset(48))
   631  		ADDQ(Imm(16), R9)
   632  		CMPQ(R8, R9)
   633  		JNE(LabelRef("LBB5_4"))
   634  		CMPQ(R8, RCX)
   635  		JE(LabelRef("LBB5_7"))
   636  	}
   637  
   638  	Label("LBB5_6")
   639  	{
   640  		MOVQ(Mem{Base: RDX}.Idx(R8, 8), RAX)
   641  		VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X0)
   642  		VMOVSS(X0, Mem{Base: RDI}.Idx(R8, 4))
   643  		ADDQ(Imm(1), R8)
   644  		CMPQ(RCX, R8)
   645  		JNE(LabelRef("LBB5_6"))
   646  	}
   647  
   648  	Label("LBB5_7")
   649  	{
   650  		RET()
   651  	}
   652  }
   653  
   654  func genScatter_F64() {
   655  
   656  	TEXT("Scatter_AVX2_F64", NOSPLIT, "func(x, y []float64, z []int)")
   657  	Pragma("noescape")
   658  	Load(Param("x").Base(), RDI)
   659  	Load(Param("y").Base(), RSI)
   660  	Load(Param("z").Base(), RDX)
   661  	Load(Param("z").Len(), RCX)
   662  
   663  	TESTQ(RCX, RCX)
   664  	JE(LabelRef("LBB6_8"))
   665  	LEAQ(Mem{Base: RCX}.Offset(-1), RAX)
   666  	MOVL(ECX, R8L)
   667  	ANDL(Imm(3), R8L)
   668  	CMPQ(RAX, Imm(3))
   669  	JAE(LabelRef("LBB6_3"))
   670  	XORL(R9L, R9L)
   671  	JMP(LabelRef("LBB6_5"))
   672  
   673  	Label("LBB6_3")
   674  	{
   675  		ANDQ(I32(-4), RCX)
   676  		XORL(R9L, R9L)
   677  	}
   678  
   679  	Label("LBB6_4")
   680  	{
   681  		VMOVSD(Mem{Base: RSI}.Idx(R9, 8), X0)
   682  		MOVQ(Mem{Base: RDX}.Idx(R9, 8), RAX)
   683  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   684  		VMOVSD(Mem{Base: RSI}.Idx(R9, 8).Offset(8), X0)
   685  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(8), RAX)
   686  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   687  		VMOVSD(Mem{Base: RSI}.Idx(R9, 8).Offset(16), X0)
   688  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(16), RAX)
   689  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   690  		VMOVSD(Mem{Base: RSI}.Idx(R9, 8).Offset(24), X0)
   691  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(24), RAX)
   692  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   693  		ADDQ(Imm(4), R9)
   694  		CMPQ(RCX, R9)
   695  		JNE(LabelRef("LBB6_4"))
   696  	}
   697  
   698  	Label("LBB6_5")
   699  	{
   700  		TESTQ(R8, R8)
   701  		JE(LabelRef("LBB6_8"))
   702  		LEAQ(Mem{Base: RDX}.Idx(R9, 8), RCX)
   703  		LEAQ(Mem{Base: RSI}.Idx(R9, 8), RAX)
   704  		XORL(EDX, EDX)
   705  	}
   706  
   707  	Label("LBB6_7")
   708  	{
   709  		VMOVSD(Mem{Base: RAX}.Idx(RDX, 8), X0)
   710  		MOVQ(Mem{Base: RCX}.Idx(RDX, 8), RSI)
   711  		VMOVSD(X0, Mem{Base: RDI}.Idx(RSI, 8))
   712  		ADDQ(Imm(1), RDX)
   713  		CMPQ(R8, RDX)
   714  		JNE(LabelRef("LBB6_7"))
   715  	}
   716  
   717  	Label("LBB6_8")
   718  	{
   719  		RET()
   720  	}
   721  }
   722  
   723  func genScatter_F32() {
   724  
   725  	TEXT("Scatter_AVX2_F32", NOSPLIT, "func(x, y []float32, z []int)")
   726  	Pragma("noescape")
   727  	Load(Param("x").Base(), RDI)
   728  	Load(Param("y").Base(), RSI)
   729  	Load(Param("z").Base(), RDX)
   730  	Load(Param("z").Len(), RCX)
   731  
   732  	TESTQ(RCX, RCX)
   733  	JE(LabelRef("LBB7_8"))
   734  	LEAQ(Mem{Base: RCX}.Offset(-1), RAX)
   735  	MOVL(ECX, R8L)
   736  	ANDL(Imm(3), R8L)
   737  	CMPQ(RAX, Imm(3))
   738  	JAE(LabelRef("LBB7_3"))
   739  	XORL(R9L, R9L)
   740  	JMP(LabelRef("LBB7_5"))
   741  
   742  	Label("LBB7_3")
   743  	{
   744  		ANDQ(I32(-4), RCX)
   745  		XORL(R9L, R9L)
   746  	}
   747  
   748  	Label("LBB7_4")
   749  	{
   750  		VMOVSS(Mem{Base: RSI}.Idx(R9, 4), X0)
   751  		MOVQ(Mem{Base: RDX}.Idx(R9, 8), RAX)
   752  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   753  		VMOVSS(Mem{Base: RSI}.Idx(R9, 4).Offset(4), X0)
   754  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(8), RAX)
   755  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   756  		VMOVSS(Mem{Base: RSI}.Idx(R9, 4).Offset(8), X0)
   757  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(16), RAX)
   758  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   759  		VMOVSS(Mem{Base: RSI}.Idx(R9, 4).Offset(12), X0)
   760  		MOVQ(Mem{Base: RDX}.Idx(R9, 8).Offset(24), RAX)
   761  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   762  		ADDQ(Imm(4), R9)
   763  		CMPQ(RCX, R9)
   764  		JNE(LabelRef("LBB7_4"))
   765  	}
   766  
   767  	Label("LBB7_5")
   768  	{
   769  		TESTQ(R8, R8)
   770  		JE(LabelRef("LBB7_8"))
   771  		LEAQ(Mem{Base: RDX}.Idx(R9, 8), RCX)
   772  		LEAQ(Mem{Base: RSI}.Idx(R9, 4), RAX)
   773  		XORL(EDX, EDX)
   774  	}
   775  
   776  	Label("LBB7_7")
   777  	{
   778  		VMOVSS(Mem{Base: RAX}.Idx(RDX, 4), X0)
   779  		MOVQ(Mem{Base: RCX}.Idx(RDX, 8), RSI)
   780  		VMOVSS(X0, Mem{Base: RDI}.Idx(RSI, 4))
   781  		ADDQ(Imm(1), RDX)
   782  		CMPQ(R8, RDX)
   783  		JNE(LabelRef("LBB7_7"))
   784  	}
   785  
   786  	Label("LBB7_8")
   787  	{
   788  		RET()
   789  	}
   790  }
   791  
   792  func genFromBool_F64() {
   793  	data := GLOBL("dataFromBoolF64", RODATA|NOPTR)
   794  	DATA(0, I32(1))
   795  	DATA(4, U64(0x3ff0000000000000))
   796  
   797  	TEXT("FromBool_AVX2_F64", NOSPLIT, "func(x []float64, y []bool)")
   798  	Pragma("noescape")
   799  	Load(Param("x").Base(), RDI)
   800  	Load(Param("y").Base(), RSI)
   801  	Load(Param("x").Len(), RDX)
   802  
   803  	TESTQ(RDX, RDX)
   804  	JE(LabelRef("LBB4_10"))
   805  	CMPQ(RDX, Imm(16))
   806  	JAE(LabelRef("LBB4_3"))
   807  	XORL(EAX, EAX)
   808  	JMP(LabelRef("LBB4_6"))
   809  
   810  	Label("LBB4_3")
   811  	{
   812  		MOVQ(RDX, RAX)
   813  		ANDQ(I32(-16), RAX)
   814  		XORL(ECX, ECX)
   815  		VPXOR(X0, X0, X0)
   816  		VPCMPEQD(X1, X1, X1)
   817  		VPBROADCASTD(data.Offset(0), X2)
   818  	}
   819  
   820  	Label("LBB4_4")
   821  	{
   822  		VMOVD(Mem{Base: RSI}.Idx(RCX, 1), X3)
   823  		VMOVD(Mem{Base: RSI}.Idx(RCX, 1).Offset(4), X4)
   824  		VMOVD(Mem{Base: RSI}.Idx(RCX, 1).Offset(8), X5)
   825  		VMOVD(Mem{Base: RSI}.Idx(RCX, 1).Offset(12), X6)
   826  		VPCMPEQB(X0, X3, X3)
   827  		VPXOR(X1, X3, X3)
   828  		VPMOVZXBD(X3, X3)
   829  		VPAND(X2, X3, X3)
   830  		VCVTDQ2PD(X3, Y3)
   831  		VPCMPEQB(X0, X4, X4)
   832  		VPXOR(X1, X4, X4)
   833  		VPMOVZXBD(X4, X4)
   834  		VPAND(X2, X4, X4)
   835  		VCVTDQ2PD(X4, Y4)
   836  		VPCMPEQB(X0, X5, X5)
   837  		VPXOR(X1, X5, X5)
   838  		VPMOVZXBD(X5, X5)
   839  		VPAND(X2, X5, X5)
   840  		VCVTDQ2PD(X5, Y5)
   841  		VPCMPEQB(X0, X6, X6)
   842  		VPXOR(X1, X6, X6)
   843  		VPMOVZXBD(X6, X6)
   844  		VPAND(X2, X6, X6)
   845  		VCVTDQ2PD(X6, Y6)
   846  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8))
   847  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
   848  		VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
   849  		VMOVUPS(Y6, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
   850  		ADDQ(Imm(16), RCX)
   851  		CMPQ(RAX, RCX)
   852  		JNE(LabelRef("LBB4_4"))
   853  		CMPQ(RAX, RDX)
   854  		JNE(LabelRef("LBB4_6"))
   855  	}
   856  
   857  	Label("LBB4_10")
   858  	{
   859  		VZEROUPPER()
   860  		RET()
   861  	}
   862  
   863  	Label("LBB4_6")
   864  	{
   865  		VMOVQ(data.Offset(4), X0)
   866  		JMP(LabelRef("LBB4_7"))
   867  	}
   868  
   869  	Label("LBB4_9")
   870  	{
   871  		VMOVQ(X1, Mem{Base: RDI}.Idx(RAX, 8))
   872  		ADDQ(Imm(1), RAX)
   873  		CMPQ(RDX, RAX)
   874  		JE(LabelRef("LBB4_10"))
   875  	}
   876  
   877  	Label("LBB4_7")
   878  	{
   879  		CMPB(Mem{Base: RSI}.Idx(RAX, 1), Imm(0))
   880  		VMOVDQA(X0, X1)
   881  		JNE(LabelRef("LBB4_9"))
   882  		VPXOR(X1, X1, X1)
   883  		JMP(LabelRef("LBB4_9"))
   884  	}
   885  }
   886  
   887  func genFromBool_F32() {
   888  
   889  	data := GLOBL("dataFromBoolF32", RODATA|NOPTR)
   890  	DATA(0, I32(1))
   891  	DATA(4, I32(0x3f800000))
   892  
   893  	TEXT("FromBool_AVX2_F32", NOSPLIT, "func(x []float32, y []bool)")
   894  	Pragma("noescape")
   895  	Load(Param("x").Base(), RDI)
   896  	Load(Param("y").Base(), RSI)
   897  	Load(Param("x").Len(), RDX)
   898  
   899  	TESTQ(RDX, RDX)
   900  	JE(LabelRef("LBB5_10"))
   901  	CMPQ(RDX, Imm(32))
   902  	JAE(LabelRef("LBB5_3"))
   903  	XORL(EAX, EAX)
   904  	JMP(LabelRef("LBB5_6"))
   905  
   906  	Label("LBB5_3")
   907  	{
   908  		MOVQ(RDX, RAX)
   909  		ANDQ(I32(-32), RAX)
   910  		XORL(ECX, ECX)
   911  		VPXOR(X0, X0, X0)
   912  		VPCMPEQD(X1, X1, X1)
   913  		VPBROADCASTD(data.Offset(0), Y2)
   914  	}
   915  
   916  	Label("LBB5_4")
   917  	{
   918  		VMOVQ(Mem{Base: RSI}.Idx(RCX, 1), X3)
   919  		VMOVQ(Mem{Base: RSI}.Idx(RCX, 1).Offset(8), X4)
   920  		VMOVQ(Mem{Base: RSI}.Idx(RCX, 1).Offset(16), X5)
   921  		VMOVQ(Mem{Base: RSI}.Idx(RCX, 1).Offset(24), X6)
   922  		VPCMPEQB(X0, X3, X3)
   923  		VPXOR(X1, X3, X3)
   924  		VPMOVZXBD(X3, Y3)
   925  		VPAND(Y2, Y3, Y3)
   926  		VCVTDQ2PS(Y3, Y3)
   927  		VPCMPEQB(X0, X4, X4)
   928  		VPXOR(X1, X4, X4)
   929  		VPMOVZXBD(X4, Y4)
   930  		VPAND(Y2, Y4, Y4)
   931  		VCVTDQ2PS(Y4, Y4)
   932  		VPCMPEQB(X0, X5, X5)
   933  		VPXOR(X1, X5, X5)
   934  		VPMOVZXBD(X5, Y5)
   935  		VPAND(Y2, Y5, Y5)
   936  		VCVTDQ2PS(Y5, Y5)
   937  		VPCMPEQB(X0, X6, X6)
   938  		VPXOR(X1, X6, X6)
   939  		VPMOVZXBD(X6, Y6)
   940  		VPAND(Y2, Y6, Y6)
   941  		VCVTDQ2PS(Y6, Y6)
   942  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4))
   943  		VMOVUPS(Y4, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
   944  		VMOVUPS(Y5, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
   945  		VMOVUPS(Y6, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
   946  		ADDQ(Imm(32), RCX)
   947  		CMPQ(RAX, RCX)
   948  		JNE(LabelRef("LBB5_4"))
   949  		CMPQ(RAX, RDX)
   950  		JNE(LabelRef("LBB5_6"))
   951  	}
   952  
   953  	Label("LBB5_10")
   954  	{
   955  		VZEROUPPER()
   956  		RET()
   957  	}
   958  
   959  	Label("LBB5_6")
   960  	{
   961  		VMOVD(data.Offset(4), X0)
   962  		JMP(LabelRef("LBB5_7"))
   963  	}
   964  
   965  	Label("LBB5_9")
   966  	{
   967  		VMOVD(X1, Mem{Base: RDI}.Idx(RAX, 4))
   968  		ADDQ(Imm(1), RAX)
   969  		CMPQ(RDX, RAX)
   970  		JE(LabelRef("LBB5_10"))
   971  	}
   972  
   973  	Label("LBB5_7")
   974  	{
   975  		CMPB(Mem{Base: RSI}.Idx(RAX, 1), Imm(0))
   976  		VMOVDQA(X0, X1)
   977  		JNE(LabelRef("LBB5_9"))
   978  		VPXOR(X1, X1, X1)
   979  		JMP(LabelRef("LBB5_9"))
   980  	}
   981  }
   982  
   983  func genFromFloat32_F64() {
   984  
   985  	TEXT("FromFloat32_AVX2_F64", NOSPLIT, "func(x []float64, y []float32)")
   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("LBB6_11"))
   993  	CMPQ(RDX, Imm(16))
   994  	JAE(LabelRef("LBB6_3"))
   995  	XORL(EAX, EAX)
   996  	JMP(LabelRef("LBB6_10"))
   997  
   998  	Label("LBB6_3")
   999  	{
  1000  		MOVQ(RDX, RAX)
  1001  		ANDQ(I32(-16), RAX)
  1002  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
  1003  		MOVQ(RCX, R8)
  1004  		SHRQ(Imm(4), R8)
  1005  		ADDQ(Imm(1), R8)
  1006  		TESTQ(RCX, RCX)
  1007  		JE(LabelRef("LBB6_4"))
  1008  		MOVQ(R8, R9)
  1009  		ANDQ(I32(-2), R9)
  1010  		XORL(ECX, ECX)
  1011  	}
  1012  
  1013  	Label("LBB6_6")
  1014  	{
  1015  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4), Y0)
  1016  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(16), Y1)
  1017  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y2)
  1018  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(48), Y3)
  1019  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 8))
  1020  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
  1021  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
  1022  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
  1023  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y0)
  1024  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(80), Y1)
  1025  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y2)
  1026  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(112), Y3)
  1027  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 8).Offset(128))
  1028  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(160))
  1029  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(192))
  1030  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(224))
  1031  		ADDQ(Imm(32), RCX)
  1032  		ADDQ(I32(-2), R9)
  1033  		JNE(LabelRef("LBB6_6"))
  1034  		TESTB(Imm(1), R8B)
  1035  		JE(LabelRef("LBB6_9"))
  1036  	}
  1037  
  1038  	Label("LBB6_8")
  1039  	{
  1040  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4), Y0)
  1041  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(16), Y1)
  1042  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y2)
  1043  		VCVTPS2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(48), Y3)
  1044  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 8))
  1045  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
  1046  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
  1047  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
  1048  	}
  1049  
  1050  	Label("LBB6_9")
  1051  	{
  1052  		CMPQ(RAX, RDX)
  1053  		JE(LabelRef("LBB6_11"))
  1054  	}
  1055  
  1056  	Label("LBB6_10")
  1057  	{
  1058  		VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X0)
  1059  		VCVTSS2SD(X0, X0, X0)
  1060  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
  1061  		ADDQ(Imm(1), RAX)
  1062  		CMPQ(RDX, RAX)
  1063  		JNE(LabelRef("LBB6_10"))
  1064  	}
  1065  
  1066  	Label("LBB6_11")
  1067  	{
  1068  		VZEROUPPER()
  1069  		RET()
  1070  	}
  1071  
  1072  	Label("LBB6_4")
  1073  	{
  1074  		XORL(ECX, ECX)
  1075  		TESTB(Imm(1), R8B)
  1076  		JNE(LabelRef("LBB6_8"))
  1077  		JMP(LabelRef("LBB6_9"))
  1078  	}
  1079  }
  1080  
  1081  func genFromFloat64_F32() {
  1082  
  1083  	TEXT("FromFloat64_AVX2_F32", NOSPLIT, "func(x []float32, y []float64)")
  1084  	Pragma("noescape")
  1085  	Load(Param("x").Base(), RDI)
  1086  	Load(Param("y").Base(), RSI)
  1087  	Load(Param("x").Len(), RDX)
  1088  
  1089  	TESTQ(RDX, RDX)
  1090  	JE(LabelRef("LBB7_11"))
  1091  	CMPQ(RDX, Imm(16))
  1092  	JAE(LabelRef("LBB7_3"))
  1093  	XORL(EAX, EAX)
  1094  	JMP(LabelRef("LBB7_10"))
  1095  
  1096  	Label("LBB7_3")
  1097  	{
  1098  		MOVQ(RDX, RAX)
  1099  		ANDQ(I32(-16), RAX)
  1100  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
  1101  		MOVQ(RCX, R8)
  1102  		SHRQ(Imm(4), R8)
  1103  		ADDQ(Imm(1), R8)
  1104  		TESTQ(RCX, RCX)
  1105  		JE(LabelRef("LBB7_4"))
  1106  		MOVQ(R8, R9)
  1107  		ANDQ(I32(-2), R9)
  1108  		XORL(ECX, ECX)
  1109  	}
  1110  
  1111  	Label("LBB7_6")
  1112  	{
  1113  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8), X0)
  1114  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X1)
  1115  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X2)
  1116  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X3)
  1117  		VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4))
  1118  		VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16))
  1119  		VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1120  		VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48))
  1121  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(128), X0)
  1122  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(160), X1)
  1123  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(192), X2)
  1124  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(224), X3)
  1125  		VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  1126  		VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(80))
  1127  		VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  1128  		VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(112))
  1129  		ADDQ(Imm(32), RCX)
  1130  		ADDQ(I32(-2), R9)
  1131  		JNE(LabelRef("LBB7_6"))
  1132  		TESTB(Imm(1), R8B)
  1133  		JE(LabelRef("LBB7_9"))
  1134  	}
  1135  
  1136  	Label("LBB7_8")
  1137  	{
  1138  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8), X0)
  1139  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X1)
  1140  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X2)
  1141  		VCVTPD2PSY(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X3)
  1142  		VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4))
  1143  		VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16))
  1144  		VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1145  		VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48))
  1146  	}
  1147  
  1148  	Label("LBB7_9")
  1149  	{
  1150  		CMPQ(RAX, RDX)
  1151  		JE(LabelRef("LBB7_11"))
  1152  	}
  1153  
  1154  	Label("LBB7_10")
  1155  	{
  1156  		VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X0)
  1157  		VCVTSD2SS(X0, X0, X0)
  1158  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
  1159  		ADDQ(Imm(1), RAX)
  1160  		CMPQ(RDX, RAX)
  1161  		JNE(LabelRef("LBB7_10"))
  1162  	}
  1163  
  1164  	Label("LBB7_11")
  1165  	{
  1166  		RET()
  1167  	}
  1168  
  1169  	Label("LBB7_4")
  1170  	{
  1171  		XORL(ECX, ECX)
  1172  		TESTB(Imm(1), R8B)
  1173  		JNE(LabelRef("LBB7_8"))
  1174  		JMP(LabelRef("LBB7_9"))
  1175  	}
  1176  }
  1177  
  1178  func genFromInt64_F64() {
  1179  
  1180  	TEXT("FromInt64_AVX2_F64", NOSPLIT, "func(x []float64, y []int64)")
  1181  	Pragma("noescape")
  1182  	Load(Param("x").Base(), RDI)
  1183  	Load(Param("y").Base(), RSI)
  1184  	Load(Param("x").Len(), RDX)
  1185  
  1186  	TESTQ(RDX, RDX)
  1187  	JE(LabelRef("LBB8_11"))
  1188  	CMPQ(RDX, Imm(16))
  1189  	JAE(LabelRef("LBB8_3"))
  1190  	XORL(R10L, R10L)
  1191  	JMP(LabelRef("LBB8_10"))
  1192  
  1193  	Label("LBB8_3")
  1194  	{
  1195  		MOVQ(RDX, R10)
  1196  		ANDQ(I32(-16), R10)
  1197  		LEAQ(Mem{Base: R10}.Offset(-16), RCX)
  1198  		MOVQ(RCX, R8)
  1199  		SHRQ(Imm(4), R8)
  1200  		ADDQ(Imm(1), R8)
  1201  		TESTQ(RCX, RCX)
  1202  		JE(LabelRef("LBB8_4"))
  1203  		MOVQ(R8, R9)
  1204  		ANDQ(I32(-2), R9)
  1205  		XORL(ECX, ECX)
  1206  	}
  1207  
  1208  	Label("LBB8_6")
  1209  	{
  1210  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8), X0)
  1211  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(16), X1)
  1212  		VPEXTRQ(Imm(1), X0, RAX)
  1213  		VCVTSI2SDQ(RAX, X11, X2)
  1214  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X3)
  1215  		VMOVQ(X0, RAX)
  1216  		VCVTSI2SDQ(RAX, X11, X0)
  1217  		VPEXTRQ(Imm(1), X1, RAX)
  1218  		VCVTSI2SDQ(RAX, X11, X4)
  1219  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(48), X5)
  1220  		VMOVQ(X1, RAX)
  1221  		VCVTSI2SDQ(RAX, X11, X1)
  1222  		VPEXTRQ(Imm(1), X5, RAX)
  1223  		VCVTSI2SDQ(RAX, X11, X6)
  1224  		VUNPCKLPD(X2, X0, X8)
  1225  		VMOVQ(X5, RAX)
  1226  		VCVTSI2SDQ(RAX, X11, X2)
  1227  		VPEXTRQ(Imm(1), X3, RAX)
  1228  		VCVTSI2SDQ(RAX, X11, X5)
  1229  		VUNPCKLPD(X4, X1, X10)
  1230  		VMOVQ(X3, RAX)
  1231  		VCVTSI2SDQ(RAX, X11, X3)
  1232  		VUNPCKLPD(X6, X2, X9)
  1233  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(80), X4)
  1234  		VPEXTRQ(Imm(1), X4, RAX)
  1235  		VUNPCKLPD(X5, X3, X3)
  1236  		VCVTSI2SDQ(RAX, X11, X5)
  1237  		VMOVQ(X4, RAX)
  1238  		VCVTSI2SDQ(RAX, X11, X4)
  1239  		VUNPCKLPD(X5, X4, X4)
  1240  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X5)
  1241  		VPEXTRQ(Imm(1), X5, RAX)
  1242  		VCVTSI2SDQ(RAX, X11, X6)
  1243  		VMOVQ(X5, RAX)
  1244  		VCVTSI2SDQ(RAX, X11, X5)
  1245  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(112), X7)
  1246  		VPEXTRQ(Imm(1), X7, RAX)
  1247  		VCVTSI2SDQ(RAX, X11, X0)
  1248  		VMOVQ(X7, RAX)
  1249  		VCVTSI2SDQ(RAX, X11, X7)
  1250  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X2)
  1251  		VPEXTRQ(Imm(1), X2, RAX)
  1252  		VCVTSI2SDQ(RAX, X11, X1)
  1253  		VUNPCKLPD(X6, X5, X5)
  1254  		VMOVQ(X2, RAX)
  1255  		VCVTSI2SDQ(RAX, X11, X2)
  1256  		VUNPCKLPD(X0, X7, X0)
  1257  		VUNPCKLPD(X1, X2, X1)
  1258  		VMOVUPD(X10, Mem{Base: RDI}.Idx(RCX, 8).Offset(16))
  1259  		VMOVUPD(X8, Mem{Base: RDI}.Idx(RCX, 8))
  1260  		VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
  1261  		VMOVUPD(X9, Mem{Base: RDI}.Idx(RCX, 8).Offset(48))
  1262  		VMOVUPD(X5, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
  1263  		VMOVUPD(X4, Mem{Base: RDI}.Idx(RCX, 8).Offset(80))
  1264  		VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
  1265  		VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(112))
  1266  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(128), X0)
  1267  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(144), X1)
  1268  		VPEXTRQ(Imm(1), X0, RAX)
  1269  		VCVTSI2SDQ(RAX, X11, X2)
  1270  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(160), X3)
  1271  		VMOVQ(X0, RAX)
  1272  		VCVTSI2SDQ(RAX, X11, X0)
  1273  		VPEXTRQ(Imm(1), X1, RAX)
  1274  		VCVTSI2SDQ(RAX, X11, X4)
  1275  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(176), X5)
  1276  		VMOVQ(X1, RAX)
  1277  		VCVTSI2SDQ(RAX, X11, X1)
  1278  		VPEXTRQ(Imm(1), X5, RAX)
  1279  		VCVTSI2SDQ(RAX, X11, X6)
  1280  		VUNPCKLPD(X2, X0, X8)
  1281  		VMOVQ(X5, RAX)
  1282  		VCVTSI2SDQ(RAX, X11, X2)
  1283  		VPEXTRQ(Imm(1), X3, RAX)
  1284  		VCVTSI2SDQ(RAX, X11, X5)
  1285  		VUNPCKLPD(X4, X1, X10)
  1286  		VMOVQ(X3, RAX)
  1287  		VCVTSI2SDQ(RAX, X11, X3)
  1288  		VUNPCKLPD(X6, X2, X9)
  1289  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(208), X4)
  1290  		VPEXTRQ(Imm(1), X4, RAX)
  1291  		VUNPCKLPD(X5, X3, X3)
  1292  		VCVTSI2SDQ(RAX, X11, X5)
  1293  		VMOVQ(X4, RAX)
  1294  		VCVTSI2SDQ(RAX, X11, X4)
  1295  		VUNPCKLPD(X5, X4, X4)
  1296  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(192), X5)
  1297  		VPEXTRQ(Imm(1), X5, RAX)
  1298  		VCVTSI2SDQ(RAX, X11, X6)
  1299  		VMOVQ(X5, RAX)
  1300  		VCVTSI2SDQ(RAX, X11, X5)
  1301  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(240), X7)
  1302  		VPEXTRQ(Imm(1), X7, RAX)
  1303  		VCVTSI2SDQ(RAX, X11, X0)
  1304  		VMOVQ(X7, RAX)
  1305  		VCVTSI2SDQ(RAX, X11, X7)
  1306  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(224), X2)
  1307  		VPEXTRQ(Imm(1), X2, RAX)
  1308  		VCVTSI2SDQ(RAX, X11, X1)
  1309  		VUNPCKLPD(X6, X5, X5)
  1310  		VMOVQ(X2, RAX)
  1311  		VCVTSI2SDQ(RAX, X11, X2)
  1312  		VUNPCKLPD(X0, X7, X0)
  1313  		VUNPCKLPD(X1, X2, X1)
  1314  		VMOVUPD(X10, Mem{Base: RDI}.Idx(RCX, 8).Offset(144))
  1315  		VMOVUPD(X8, Mem{Base: RDI}.Idx(RCX, 8).Offset(128))
  1316  		VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 8).Offset(160))
  1317  		VMOVUPD(X9, Mem{Base: RDI}.Idx(RCX, 8).Offset(176))
  1318  		VMOVUPD(X5, Mem{Base: RDI}.Idx(RCX, 8).Offset(192))
  1319  		VMOVUPD(X4, Mem{Base: RDI}.Idx(RCX, 8).Offset(208))
  1320  		VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 8).Offset(224))
  1321  		VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(240))
  1322  		ADDQ(Imm(32), RCX)
  1323  		ADDQ(I32(-2), R9)
  1324  		JNE(LabelRef("LBB8_6"))
  1325  		TESTB(Imm(1), R8B)
  1326  		JE(LabelRef("LBB8_9"))
  1327  	}
  1328  
  1329  	Label("LBB8_8")
  1330  	{
  1331  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8), X0)
  1332  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(16), X1)
  1333  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X3)
  1334  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(48), X2)
  1335  		VPEXTRQ(Imm(1), X0, RAX)
  1336  		VCVTSI2SDQ(RAX, X11, X4)
  1337  		VMOVQ(X0, RAX)
  1338  		VCVTSI2SDQ(RAX, X11, X0)
  1339  		VUNPCKLPD(X4, X0, X8)
  1340  		VPEXTRQ(Imm(1), X1, RAX)
  1341  		VCVTSI2SDQ(RAX, X11, X4)
  1342  		VMOVQ(X1, RAX)
  1343  		VCVTSI2SDQ(RAX, X11, X1)
  1344  		VUNPCKLPD(X4, X1, X1)
  1345  		VPEXTRQ(Imm(1), X2, RAX)
  1346  		VCVTSI2SDQ(RAX, X11, X4)
  1347  		VMOVQ(X2, RAX)
  1348  		VCVTSI2SDQ(RAX, X11, X2)
  1349  		VUNPCKLPD(X4, X2, X2)
  1350  		VPEXTRQ(Imm(1), X3, RAX)
  1351  		VCVTSI2SDQ(RAX, X11, X4)
  1352  		VMOVQ(X3, RAX)
  1353  		VCVTSI2SDQ(RAX, X11, X3)
  1354  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(80), X5)
  1355  		VPEXTRQ(Imm(1), X5, RAX)
  1356  		VCVTSI2SDQ(RAX, X11, X6)
  1357  		VMOVQ(X5, RAX)
  1358  		VCVTSI2SDQ(RAX, X11, X5)
  1359  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X7)
  1360  		VPEXTRQ(Imm(1), X7, RAX)
  1361  		VCVTSI2SDQ(RAX, X11, X0)
  1362  		VUNPCKLPD(X4, X3, X3)
  1363  		VMOVQ(X7, RAX)
  1364  		VCVTSI2SDQ(RAX, X11, X4)
  1365  		VUNPCKLPD(X6, X5, X5)
  1366  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(112), X6)
  1367  		VPEXTRQ(Imm(1), X6, RAX)
  1368  		VUNPCKLPD(X0, X4, X0)
  1369  		VCVTSI2SDQ(RAX, X11, X4)
  1370  		VMOVQ(X6, RAX)
  1371  		VCVTSI2SDQ(RAX, X11, X6)
  1372  		VUNPCKLPD(X4, X6, X4)
  1373  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X6)
  1374  		VPEXTRQ(Imm(1), X6, RAX)
  1375  		VCVTSI2SDQ(RAX, X11, X7)
  1376  		VMOVQ(X6, RAX)
  1377  		VCVTSI2SDQ(RAX, X11, X6)
  1378  		VUNPCKLPD(X7, X6, X6)
  1379  		VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 8).Offset(16))
  1380  		VMOVUPD(X8, Mem{Base: RDI}.Idx(RCX, 8))
  1381  		VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
  1382  		VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 8).Offset(48))
  1383  		VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
  1384  		VMOVUPD(X5, Mem{Base: RDI}.Idx(RCX, 8).Offset(80))
  1385  		VMOVUPD(X6, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
  1386  		VMOVUPD(X4, Mem{Base: RDI}.Idx(RCX, 8).Offset(112))
  1387  	}
  1388  
  1389  	Label("LBB8_9")
  1390  	{
  1391  		CMPQ(R10, RDX)
  1392  		JE(LabelRef("LBB8_11"))
  1393  	}
  1394  
  1395  	Label("LBB8_10")
  1396  	{
  1397  		VCVTSI2SDQ(Mem{Base: RSI}.Idx(R10, 8), X11, X0)
  1398  		VMOVSD(X0, Mem{Base: RDI}.Idx(R10, 8))
  1399  		ADDQ(Imm(1), R10)
  1400  		CMPQ(RDX, R10)
  1401  		JNE(LabelRef("LBB8_10"))
  1402  	}
  1403  
  1404  	Label("LBB8_11")
  1405  	{
  1406  		RET()
  1407  	}
  1408  
  1409  	Label("LBB8_4")
  1410  	{
  1411  		XORL(ECX, ECX)
  1412  		TESTB(Imm(1), R8B)
  1413  		JNE(LabelRef("LBB8_8"))
  1414  		JMP(LabelRef("LBB8_9"))
  1415  	}
  1416  }
  1417  
  1418  func genFromInt64_F32() {
  1419  
  1420  	TEXT("FromInt64_AVX2_F32", NOSPLIT, "func(x []float32, y []int64)")
  1421  	Pragma("noescape")
  1422  	Load(Param("x").Base(), RDI)
  1423  	Load(Param("y").Base(), RSI)
  1424  	Load(Param("x").Len(), RDX)
  1425  
  1426  	TESTQ(RDX, RDX)
  1427  	JE(LabelRef("LBB9_11"))
  1428  	CMPQ(RDX, Imm(16))
  1429  	JAE(LabelRef("LBB9_3"))
  1430  	XORL(R11L, R11L)
  1431  	JMP(LabelRef("LBB9_10"))
  1432  
  1433  	Label("LBB9_3")
  1434  	{
  1435  		MOVQ(RDX, R11)
  1436  		ANDQ(I32(-16), R11)
  1437  		LEAQ(Mem{Base: R11}.Offset(-16), RCX)
  1438  		MOVQ(RCX, R8)
  1439  		SHRQ(Imm(4), R8)
  1440  		ADDQ(Imm(1), R8)
  1441  		TESTQ(RCX, RCX)
  1442  		JE(LabelRef("LBB9_4"))
  1443  		MOVQ(R8, R9)
  1444  		ANDQ(I32(-2), R9)
  1445  		XORL(ECX, ECX)
  1446  	}
  1447  
  1448  	Label("LBB9_6")
  1449  	{
  1450  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8), X0)
  1451  		VPEXTRQ(Imm(1), X0, R10)
  1452  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(16), X1)
  1453  		VCVTSI2SSQ(R10, X8, X2)
  1454  		VMOVQ(X0, RAX)
  1455  		VCVTSI2SSQ(RAX, X8, X0)
  1456  		VMOVQ(X1, RAX)
  1457  		VCVTSI2SSQ(RAX, X8, X3)
  1458  		VPEXTRQ(Imm(1), X1, RAX)
  1459  		VCVTSI2SSQ(RAX, X8, X1)
  1460  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X4)
  1461  		VPEXTRQ(Imm(1), X4, RAX)
  1462  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(48), X5)
  1463  		VCVTSI2SSQ(RAX, X8, X6)
  1464  		VMOVQ(X4, RAX)
  1465  		VCVTSI2SSQ(RAX, X8, X4)
  1466  		VMOVQ(X5, RAX)
  1467  		VCVTSI2SSQ(RAX, X8, X7)
  1468  		VINSERTPS(Imm(16), X2, X0, X0)
  1469  		VINSERTPS(Imm(32), X3, X0, X0)
  1470  		VPEXTRQ(Imm(1), X5, RAX)
  1471  		VINSERTPS(Imm(48), X1, X0, X0)
  1472  		VCVTSI2SSQ(RAX, X8, X1)
  1473  		VINSERTPS(Imm(16), X6, X4, X2)
  1474  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X3)
  1475  		VPEXTRQ(Imm(1), X3, RAX)
  1476  		VCVTSI2SSQ(RAX, X8, X4)
  1477  		VMOVQ(X3, RAX)
  1478  		VCVTSI2SSQ(RAX, X8, X3)
  1479  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(80), X5)
  1480  		VMOVQ(X5, RAX)
  1481  		VCVTSI2SSQ(RAX, X8, X6)
  1482  		VINSERTPS(Imm(32), X7, X2, X2)
  1483  		VINSERTPS(Imm(48), X1, X2, X1)
  1484  		VPEXTRQ(Imm(1), X5, RAX)
  1485  		VINSERTPS(Imm(16), X4, X3, X2)
  1486  		VCVTSI2SSQ(RAX, X8, X3)
  1487  		VINSERTPS(Imm(32), X6, X2, X2)
  1488  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X4)
  1489  		VPEXTRQ(Imm(1), X4, RAX)
  1490  		VCVTSI2SSQ(RAX, X8, X5)
  1491  		VMOVQ(X4, RAX)
  1492  		VCVTSI2SSQ(RAX, X8, X4)
  1493  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(112), X6)
  1494  		VMOVQ(X6, RAX)
  1495  		VCVTSI2SSQ(RAX, X8, X7)
  1496  		VINSERTPS(Imm(48), X3, X2, X2)
  1497  		VINSERTPS(Imm(16), X5, X4, X3)
  1498  		VPEXTRQ(Imm(1), X6, RAX)
  1499  		VINSERTPS(Imm(32), X7, X3, X3)
  1500  		VCVTSI2SSQ(RAX, X8, X4)
  1501  		VINSERTPS(Imm(48), X4, X3, X3)
  1502  		VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 4))
  1503  		VMOVUPS(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16))
  1504  		VMOVUPS(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1505  		VMOVUPS(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48))
  1506  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(128), X0)
  1507  		VPEXTRQ(Imm(1), X0, RAX)
  1508  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(144), X1)
  1509  		VCVTSI2SSQ(RAX, X8, X2)
  1510  		VMOVQ(X0, RAX)
  1511  		VCVTSI2SSQ(RAX, X8, X0)
  1512  		VMOVQ(X1, RAX)
  1513  		VCVTSI2SSQ(RAX, X8, X3)
  1514  		VPEXTRQ(Imm(1), X1, RAX)
  1515  		VCVTSI2SSQ(RAX, X8, X1)
  1516  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(160), X4)
  1517  		VPEXTRQ(Imm(1), X4, RAX)
  1518  		VCVTSI2SSQ(RAX, X8, X5)
  1519  		VMOVQ(X4, RAX)
  1520  		VCVTSI2SSQ(RAX, X8, X4)
  1521  		VINSERTPS(Imm(16), X2, X0, X0)
  1522  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(176), X2)
  1523  		VPEXTRQ(Imm(1), X2, R10)
  1524  		VMOVQ(X2, RAX)
  1525  		VCVTSI2SSQ(RAX, X8, X2)
  1526  		VINSERTPS(Imm(32), X3, X0, X0)
  1527  		VCVTSI2SSQ(R10, X8, X3)
  1528  		VINSERTPS(Imm(48), X1, X0, X0)
  1529  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(192), X1)
  1530  		VPEXTRQ(Imm(1), X1, RAX)
  1531  		VINSERTPS(Imm(16), X5, X4, X4)
  1532  		VCVTSI2SSQ(RAX, X8, X5)
  1533  		VMOVQ(X1, RAX)
  1534  		VCVTSI2SSQ(RAX, X8, X1)
  1535  		VINSERTPS(Imm(32), X2, X4, X2)
  1536  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(208), X4)
  1537  		VPEXTRQ(Imm(1), X4, R10)
  1538  		VMOVQ(X4, RAX)
  1539  		VCVTSI2SSQ(RAX, X8, X4)
  1540  		VINSERTPS(Imm(48), X3, X2, X2)
  1541  		VCVTSI2SSQ(R10, X8, X3)
  1542  		VINSERTPS(Imm(16), X5, X1, X1)
  1543  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(224), X5)
  1544  		VPEXTRQ(Imm(1), X5, RAX)
  1545  		VINSERTPS(Imm(32), X4, X1, X1)
  1546  		VCVTSI2SSQ(RAX, X8, X4)
  1547  		VMOVQ(X5, RAX)
  1548  		VCVTSI2SSQ(RAX, X8, X5)
  1549  		VINSERTPS(Imm(48), X3, X1, X1)
  1550  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(240), X3)
  1551  		VPEXTRQ(Imm(1), X3, R10)
  1552  		VMOVQ(X3, RAX)
  1553  		VCVTSI2SSQ(RAX, X8, X3)
  1554  		VINSERTPS(Imm(16), X4, X5, X4)
  1555  		VCVTSI2SSQ(R10, X8, X5)
  1556  		VINSERTPS(Imm(32), X3, X4, X3)
  1557  		VINSERTPS(Imm(48), X5, X3, X3)
  1558  		VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  1559  		VMOVUPS(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(80))
  1560  		VMOVUPS(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  1561  		VMOVUPS(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(112))
  1562  		ADDQ(Imm(32), RCX)
  1563  		ADDQ(I32(-2), R9)
  1564  		JNE(LabelRef("LBB9_6"))
  1565  		TESTB(Imm(1), R8B)
  1566  		JE(LabelRef("LBB9_9"))
  1567  	}
  1568  
  1569  	Label("LBB9_8")
  1570  	{
  1571  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8), X0)
  1572  		VPEXTRQ(Imm(1), X0, RAX)
  1573  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(16), X1)
  1574  		VCVTSI2SSQ(RAX, X8, X2)
  1575  		VMOVQ(X0, RAX)
  1576  		VCVTSI2SSQ(RAX, X8, X0)
  1577  		VMOVQ(X1, RAX)
  1578  		VCVTSI2SSQ(RAX, X8, X3)
  1579  		VPEXTRQ(Imm(1), X1, RAX)
  1580  		VCVTSI2SSQ(RAX, X8, X1)
  1581  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X4)
  1582  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(48), X5)
  1583  		VPEXTRQ(Imm(1), X4, RAX)
  1584  		VINSERTPS(Imm(16), X2, X0, X0)
  1585  		VCVTSI2SSQ(RAX, X8, X2)
  1586  		VMOVQ(X4, RAX)
  1587  		VCVTSI2SSQ(RAX, X8, X4)
  1588  		VMOVQ(X5, RAX)
  1589  		VCVTSI2SSQ(RAX, X8, X6)
  1590  		VINSERTPS(Imm(32), X3, X0, X0)
  1591  		VINSERTPS(Imm(48), X1, X0, X0)
  1592  		VPEXTRQ(Imm(1), X5, RAX)
  1593  		VINSERTPS(Imm(16), X2, X4, X1)
  1594  		VCVTSI2SSQ(RAX, X8, X2)
  1595  		VINSERTPS(Imm(32), X6, X1, X1)
  1596  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X3)
  1597  		VPEXTRQ(Imm(1), X3, RAX)
  1598  		VCVTSI2SSQ(RAX, X8, X4)
  1599  		VMOVQ(X3, RAX)
  1600  		VCVTSI2SSQ(RAX, X8, X3)
  1601  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(80), X5)
  1602  		VMOVQ(X5, RAX)
  1603  		VCVTSI2SSQ(RAX, X8, X6)
  1604  		VINSERTPS(Imm(48), X2, X1, X1)
  1605  		VINSERTPS(Imm(16), X4, X3, X2)
  1606  		VPEXTRQ(Imm(1), X5, RAX)
  1607  		VINSERTPS(Imm(32), X6, X2, X2)
  1608  		VCVTSI2SSQ(RAX, X8, X3)
  1609  		VINSERTPS(Imm(48), X3, X2, X2)
  1610  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X3)
  1611  		VPEXTRQ(Imm(1), X3, RAX)
  1612  		VCVTSI2SSQ(RAX, X8, X4)
  1613  		VMOVQ(X3, RAX)
  1614  		VCVTSI2SSQ(RAX, X8, X3)
  1615  		VMOVDQU(Mem{Base: RSI}.Idx(RCX, 8).Offset(112), X5)
  1616  		VMOVQ(X5, RAX)
  1617  		VCVTSI2SSQ(RAX, X8, X6)
  1618  		VINSERTPS(Imm(16), X4, X3, X3)
  1619  		VINSERTPS(Imm(32), X6, X3, X3)
  1620  		VPEXTRQ(Imm(1), X5, RAX)
  1621  		VCVTSI2SSQ(RAX, X8, X4)
  1622  		VINSERTPS(Imm(48), X4, X3, X3)
  1623  		VMOVUPS(X0, Mem{Base: RDI}.Idx(RCX, 4))
  1624  		VMOVUPS(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16))
  1625  		VMOVUPS(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1626  		VMOVUPS(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48))
  1627  	}
  1628  
  1629  	Label("LBB9_9")
  1630  	{
  1631  		CMPQ(R11, RDX)
  1632  		JE(LabelRef("LBB9_11"))
  1633  	}
  1634  
  1635  	Label("LBB9_10")
  1636  	{
  1637  		VCVTSI2SSQ(Mem{Base: RSI}.Idx(R11, 8), X8, X0)
  1638  		VMOVSS(X0, Mem{Base: RDI}.Idx(R11, 4))
  1639  		ADDQ(Imm(1), R11)
  1640  		CMPQ(RDX, R11)
  1641  		JNE(LabelRef("LBB9_10"))
  1642  	}
  1643  
  1644  	Label("LBB9_11")
  1645  	{
  1646  		RET()
  1647  	}
  1648  
  1649  	Label("LBB9_4")
  1650  	{
  1651  		XORL(ECX, ECX)
  1652  		TESTB(Imm(1), R8B)
  1653  		JNE(LabelRef("LBB9_8"))
  1654  		JMP(LabelRef("LBB9_9"))
  1655  	}
  1656  }
  1657  
  1658  func genFromInt32_F64() {
  1659  
  1660  	TEXT("FromInt32_AVX2_F64", NOSPLIT, "func(x []float64, y []int32)")
  1661  	Pragma("noescape")
  1662  	Load(Param("x").Base(), RDI)
  1663  	Load(Param("y").Base(), RSI)
  1664  	Load(Param("x").Len(), RDX)
  1665  
  1666  	TESTQ(RDX, RDX)
  1667  	JE(LabelRef("LBB10_11"))
  1668  	CMPQ(RDX, Imm(16))
  1669  	JAE(LabelRef("LBB10_3"))
  1670  	XORL(EAX, EAX)
  1671  	JMP(LabelRef("LBB10_10"))
  1672  
  1673  	Label("LBB10_3")
  1674  	{
  1675  		MOVQ(RDX, RAX)
  1676  		ANDQ(I32(-16), RAX)
  1677  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
  1678  		MOVQ(RCX, R8)
  1679  		SHRQ(Imm(4), R8)
  1680  		ADDQ(Imm(1), R8)
  1681  		TESTQ(RCX, RCX)
  1682  		JE(LabelRef("LBB10_4"))
  1683  		MOVQ(R8, R9)
  1684  		ANDQ(I32(-2), R9)
  1685  		XORL(ECX, ECX)
  1686  	}
  1687  
  1688  	Label("LBB10_6")
  1689  	{
  1690  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4), Y0)
  1691  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(16), Y1)
  1692  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y2)
  1693  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(48), Y3)
  1694  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 8))
  1695  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
  1696  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
  1697  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
  1698  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y0)
  1699  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(80), Y1)
  1700  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y2)
  1701  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(112), Y3)
  1702  		VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8).Offset(128))
  1703  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(160))
  1704  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(192))
  1705  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(224))
  1706  		ADDQ(Imm(32), RCX)
  1707  		ADDQ(I32(-2), R9)
  1708  		JNE(LabelRef("LBB10_6"))
  1709  		TESTB(Imm(1), R8B)
  1710  		JE(LabelRef("LBB10_9"))
  1711  	}
  1712  
  1713  	Label("LBB10_8")
  1714  	{
  1715  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4), Y0)
  1716  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(16), Y1)
  1717  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y2)
  1718  		VCVTDQ2PD(Mem{Base: RSI}.Idx(RCX, 4).Offset(48), Y3)
  1719  		VMOVUPD(Y0, Mem{Base: RDI}.Idx(RCX, 8))
  1720  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 8).Offset(32))
  1721  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 8).Offset(64))
  1722  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 8).Offset(96))
  1723  	}
  1724  
  1725  	Label("LBB10_9")
  1726  	{
  1727  		CMPQ(RAX, RDX)
  1728  		JE(LabelRef("LBB10_11"))
  1729  	}
  1730  
  1731  	Label("LBB10_10")
  1732  	{
  1733  		VCVTSI2SDL(Mem{Base: RSI}.Idx(RAX, 4), X4, X0)
  1734  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
  1735  		ADDQ(Imm(1), RAX)
  1736  		CMPQ(RDX, RAX)
  1737  		JNE(LabelRef("LBB10_10"))
  1738  	}
  1739  
  1740  	Label("LBB10_11")
  1741  	{
  1742  		VZEROUPPER()
  1743  		RET()
  1744  	}
  1745  
  1746  	Label("LBB10_4")
  1747  	{
  1748  		XORL(ECX, ECX)
  1749  		TESTB(Imm(1), R8B)
  1750  		JNE(LabelRef("LBB10_8"))
  1751  		JMP(LabelRef("LBB10_9"))
  1752  	}
  1753  }
  1754  
  1755  func genFromInt32_F32() {
  1756  
  1757  	TEXT("FromInt32_AVX2_F32", NOSPLIT, "func(x []float32, y []int32)")
  1758  	Pragma("noescape")
  1759  	Load(Param("x").Base(), RDI)
  1760  	Load(Param("y").Base(), RSI)
  1761  	Load(Param("x").Len(), RDX)
  1762  
  1763  	TESTQ(RDX, RDX)
  1764  	JE(LabelRef("LBB11_11"))
  1765  	CMPQ(RDX, Imm(32))
  1766  	JAE(LabelRef("LBB11_3"))
  1767  	XORL(EAX, EAX)
  1768  	JMP(LabelRef("LBB11_10"))
  1769  
  1770  	Label("LBB11_3")
  1771  	{
  1772  		MOVQ(RDX, RAX)
  1773  		ANDQ(I32(-32), RAX)
  1774  		LEAQ(Mem{Base: RAX}.Offset(-32), RCX)
  1775  		MOVQ(RCX, R8)
  1776  		SHRQ(Imm(5), R8)
  1777  		ADDQ(Imm(1), R8)
  1778  		TESTQ(RCX, RCX)
  1779  		JE(LabelRef("LBB11_4"))
  1780  		MOVQ(R8, R9)
  1781  		ANDQ(I32(-2), R9)
  1782  		XORL(ECX, ECX)
  1783  	}
  1784  
  1785  	Label("LBB11_6")
  1786  	{
  1787  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4), Y0)
  1788  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1)
  1789  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2)
  1790  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3)
  1791  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4))
  1792  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1793  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  1794  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  1795  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(128), Y0)
  1796  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(160), Y1)
  1797  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(192), Y2)
  1798  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(224), Y3)
  1799  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4).Offset(128))
  1800  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(160))
  1801  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(192))
  1802  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(224))
  1803  		ADDQ(Imm(64), RCX)
  1804  		ADDQ(I32(-2), R9)
  1805  		JNE(LabelRef("LBB11_6"))
  1806  		TESTB(Imm(1), R8B)
  1807  		JE(LabelRef("LBB11_9"))
  1808  	}
  1809  
  1810  	Label("LBB11_8")
  1811  	{
  1812  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4), Y0)
  1813  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1)
  1814  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2)
  1815  		VCVTDQ2PS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3)
  1816  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4))
  1817  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  1818  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  1819  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  1820  	}
  1821  
  1822  	Label("LBB11_9")
  1823  	{
  1824  		CMPQ(RAX, RDX)
  1825  		JE(LabelRef("LBB11_11"))
  1826  	}
  1827  
  1828  	Label("LBB11_10")
  1829  	{
  1830  		VCVTSI2SSL(Mem{Base: RSI}.Idx(RAX, 4), X4, X0)
  1831  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
  1832  		ADDQ(Imm(1), RAX)
  1833  		CMPQ(RDX, RAX)
  1834  		JNE(LabelRef("LBB11_10"))
  1835  	}
  1836  
  1837  	Label("LBB11_11")
  1838  	{
  1839  		VZEROUPPER()
  1840  		RET()
  1841  	}
  1842  
  1843  	Label("LBB11_4")
  1844  	{
  1845  		XORL(ECX, ECX)
  1846  		TESTB(Imm(1), R8B)
  1847  		JNE(LabelRef("LBB11_8"))
  1848  		JMP(LabelRef("LBB11_9"))
  1849  	}
  1850  }
  1851  
  1852  func genToBool_F64() {
  1853  
  1854  	data := GLOBL("dataToBoolF64", RODATA|NOPTR)
  1855  	DATA(0, I8(1))
  1856  	DATA(1, I8(1))
  1857  	DATA(2, I8(1))
  1858  	DATA(3, I8(1))
  1859  	DATA(4, I8(0))
  1860  	DATA(5, I8(0))
  1861  	DATA(6, I8(0))
  1862  	DATA(7, I8(0))
  1863  	DATA(8, I8(0))
  1864  	DATA(9, I8(0))
  1865  	DATA(10, I8(0))
  1866  	DATA(11, I8(0))
  1867  	DATA(12, I8(0))
  1868  	DATA(13, I8(0))
  1869  	DATA(14, I8(0))
  1870  	DATA(15, I8(0))
  1871  
  1872  	TEXT("ToBool_AVX2_F64", NOSPLIT, "func(x []bool, y []float64)")
  1873  	Pragma("noescape")
  1874  	Load(Param("x").Base(), RDI)
  1875  	Load(Param("y").Base(), RSI)
  1876  	Load(Param("x").Len(), RDX)
  1877  
  1878  	TESTQ(RDX, RDX)
  1879  	JE(LabelRef("LBB12_8"))
  1880  	CMPQ(RDX, Imm(16))
  1881  	JAE(LabelRef("LBB12_3"))
  1882  	XORL(EAX, EAX)
  1883  	JMP(LabelRef("LBB12_6"))
  1884  
  1885  	Label("LBB12_3")
  1886  	{
  1887  		MOVQ(RDX, RAX)
  1888  		ANDQ(I32(-16), RAX)
  1889  		XORL(ECX, ECX)
  1890  		VXORPD(X0, X0, X0)
  1891  		VMOVDQU(data.Offset(0), X1)
  1892  	}
  1893  
  1894  	Label("LBB12_4")
  1895  	{
  1896  		VCMPPD(Imm(4), Mem{Base: RSI}.Idx(RCX, 8), Y0, Y2)
  1897  		VEXTRACTF128(Imm(1), Y2, X3)
  1898  		VPACKSSDW(X3, X2, X2)
  1899  		VPACKSSDW(X2, X2, X2)
  1900  		VPACKSSWB(X2, X2, X2)
  1901  		VCMPPD(Imm(4), Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y0, Y3)
  1902  		VPAND(X1, X2, X2)
  1903  		VEXTRACTF128(Imm(1), Y3, X4)
  1904  		VPACKSSDW(X4, X3, X3)
  1905  		VPACKSSDW(X3, X3, X3)
  1906  		VPACKSSWB(X3, X3, X3)
  1907  		VPAND(X1, X3, X3)
  1908  		VCMPPD(Imm(4), Mem{Base: RSI}.Idx(RCX, 8).Offset(64), Y0, Y4)
  1909  		VPUNPCKLDQ(X3, X2, X2)
  1910  		VEXTRACTF128(Imm(1), Y4, X3)
  1911  		VPACKSSDW(X3, X4, X3)
  1912  		VPACKSSDW(X3, X3, X3)
  1913  		VPACKSSWB(X3, X3, X3)
  1914  		VPAND(X1, X3, X3)
  1915  		VCMPPD(Imm(4), Mem{Base: RSI}.Idx(RCX, 8).Offset(96), Y0, Y4)
  1916  		VEXTRACTF128(Imm(1), Y4, X5)
  1917  		VPACKSSDW(X5, X4, X4)
  1918  		VPACKSSDW(X4, X4, X4)
  1919  		VPACKSSWB(X4, X4, X4)
  1920  		VPAND(X1, X4, X4)
  1921  		VPBROADCASTD(X4, X4)
  1922  		VPBROADCASTD(X3, X3)
  1923  		VPUNPCKLDQ(X4, X3, X3)
  1924  		VPBLENDD(Imm(12), X3, X2, X2)
  1925  		VMOVDQU(X2, Mem{Base: RDI}.Idx(RCX, 1))
  1926  		ADDQ(Imm(16), RCX)
  1927  		CMPQ(RAX, RCX)
  1928  		JNE(LabelRef("LBB12_4"))
  1929  		CMPQ(RAX, RDX)
  1930  		JE(LabelRef("LBB12_8"))
  1931  	}
  1932  
  1933  	Label("LBB12_6")
  1934  	{
  1935  		VXORPD(X0, X0, X0)
  1936  	}
  1937  
  1938  	Label("LBB12_7")
  1939  	{
  1940  		VUCOMISD(Mem{Base: RSI}.Idx(RAX, 8), X0)
  1941  		SETNE(Mem{Base: RDI}.Idx(RAX, 1))
  1942  		ADDQ(Imm(1), RAX)
  1943  		CMPQ(RDX, RAX)
  1944  		JNE(LabelRef("LBB12_7"))
  1945  	}
  1946  
  1947  	Label("LBB12_8")
  1948  	{
  1949  		VZEROUPPER()
  1950  		RET()
  1951  	}
  1952  }
  1953  
  1954  func genToBool_F32() {
  1955  
  1956  	data := GLOBL("dataToBoolF32", RODATA|NOPTR)
  1957  	DATA(0, I8(1))
  1958  	DATA(1, I8(1))
  1959  	DATA(2, I8(1))
  1960  	DATA(3, I8(1))
  1961  	DATA(4, I8(1))
  1962  	DATA(5, I8(1))
  1963  	DATA(6, I8(1))
  1964  	DATA(7, I8(1))
  1965  	DATA(8, I8(0))
  1966  	DATA(9, I8(0))
  1967  	DATA(10, I8(0))
  1968  	DATA(11, I8(0))
  1969  	DATA(12, I8(0))
  1970  	DATA(13, I8(0))
  1971  	DATA(14, I8(0))
  1972  	DATA(15, I8(0))
  1973  
  1974  	TEXT("ToBool_AVX2_F32", NOSPLIT, "func(x []bool, y []float32)")
  1975  	Pragma("noescape")
  1976  	Load(Param("x").Base(), RDI)
  1977  	Load(Param("y").Base(), RSI)
  1978  	Load(Param("x").Len(), RDX)
  1979  
  1980  	TESTQ(RDX, RDX)
  1981  	JE(LabelRef("LBB13_8"))
  1982  	CMPQ(RDX, Imm(32))
  1983  	JAE(LabelRef("LBB13_3"))
  1984  	XORL(EAX, EAX)
  1985  	JMP(LabelRef("LBB13_6"))
  1986  
  1987  	Label("LBB13_3")
  1988  	{
  1989  		MOVQ(RDX, RAX)
  1990  		ANDQ(I32(-32), RAX)
  1991  		XORL(ECX, ECX)
  1992  		VXORPS(X0, X0, X0)
  1993  		VMOVDQU(data.Offset(0), X1)
  1994  	}
  1995  
  1996  	Label("LBB13_4")
  1997  	{
  1998  		VCMPPS(Imm(4), Mem{Base: RSI}.Idx(RCX, 4), Y0, Y2)
  1999  		VEXTRACTF128(Imm(1), Y2, X3)
  2000  		VPACKSSDW(X3, X2, X2)
  2001  		VPACKSSWB(X2, X2, X2)
  2002  		VCMPPS(Imm(4), Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y0, Y3)
  2003  		VPAND(X1, X2, X2)
  2004  		VEXTRACTF128(Imm(1), Y3, X4)
  2005  		VPACKSSDW(X4, X3, X3)
  2006  		VPACKSSWB(X3, X3, X3)
  2007  		VPAND(X1, X3, X3)
  2008  		VCMPPS(Imm(4), Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y0, Y4)
  2009  		VEXTRACTF128(Imm(1), Y4, X5)
  2010  		VPACKSSDW(X5, X4, X4)
  2011  		VPACKSSWB(X4, X4, X4)
  2012  		VCMPPS(Imm(4), Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y0, Y5)
  2013  		VPAND(X1, X4, X4)
  2014  		VEXTRACTF128(Imm(1), Y5, X6)
  2015  		VPACKSSDW(X6, X5, X5)
  2016  		VPACKSSWB(X5, X5, X5)
  2017  		VPAND(X1, X5, X5)
  2018  		VINSERTI128(Imm(1), X5, Y4, Y4)
  2019  		VINSERTI128(Imm(1), X3, Y2, Y2)
  2020  		VPUNPCKLQDQ(Y4, Y2, Y2)
  2021  		VPERMQ(Imm(216), Y2, Y2)
  2022  		VMOVDQU(Y2, Mem{Base: RDI}.Idx(RCX, 1))
  2023  		ADDQ(Imm(32), RCX)
  2024  		CMPQ(RAX, RCX)
  2025  		JNE(LabelRef("LBB13_4"))
  2026  		CMPQ(RAX, RDX)
  2027  		JE(LabelRef("LBB13_8"))
  2028  	}
  2029  
  2030  	Label("LBB13_6")
  2031  	{
  2032  		VXORPS(X0, X0, X0)
  2033  	}
  2034  
  2035  	Label("LBB13_7")
  2036  	{
  2037  		VUCOMISS(Mem{Base: RSI}.Idx(RAX, 4), X0)
  2038  		SETNE(Mem{Base: RDI}.Idx(RAX, 1))
  2039  		ADDQ(Imm(1), RAX)
  2040  		CMPQ(RDX, RAX)
  2041  		JNE(LabelRef("LBB13_7"))
  2042  	}
  2043  
  2044  	Label("LBB13_8")
  2045  	{
  2046  		VZEROUPPER()
  2047  		RET()
  2048  	}
  2049  }
  2050  
  2051  func genToInt64_F64() {
  2052  
  2053  	TEXT("ToInt64_AVX2_F64", NOSPLIT, "func(x []int64, y []float64)")
  2054  	Pragma("noescape")
  2055  	Load(Param("x").Base(), RDI)
  2056  	Load(Param("y").Base(), RSI)
  2057  	Load(Param("x").Len(), RDX)
  2058  
  2059  	TESTQ(RDX, RDX)
  2060  	JE(LabelRef("LBB14_8"))
  2061  	LEAQ(Mem{Base: RDX}.Offset(-1), RCX)
  2062  	MOVL(EDX, R8L)
  2063  	ANDL(Imm(3), R8L)
  2064  	CMPQ(RCX, Imm(3))
  2065  	JAE(LabelRef("LBB14_3"))
  2066  	XORL(ECX, ECX)
  2067  	JMP(LabelRef("LBB14_5"))
  2068  
  2069  	Label("LBB14_3")
  2070  	{
  2071  		ANDQ(I32(-4), RDX)
  2072  		XORL(ECX, ECX)
  2073  	}
  2074  
  2075  	Label("LBB14_4")
  2076  	{
  2077  		VCVTTSD2SIQ(Mem{Base: RSI}.Idx(RCX, 8), RAX)
  2078  		MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8))
  2079  		VCVTTSD2SIQ(Mem{Base: RSI}.Idx(RCX, 8).Offset(8), RAX)
  2080  		MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(8))
  2081  		VCVTTSD2SIQ(Mem{Base: RSI}.Idx(RCX, 8).Offset(16), RAX)
  2082  		MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(16))
  2083  		VCVTTSD2SIQ(Mem{Base: RSI}.Idx(RCX, 8).Offset(24), RAX)
  2084  		MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(24))
  2085  		ADDQ(Imm(4), RCX)
  2086  		CMPQ(RDX, RCX)
  2087  		JNE(LabelRef("LBB14_4"))
  2088  	}
  2089  
  2090  	Label("LBB14_5")
  2091  	{
  2092  		TESTQ(R8, R8)
  2093  		JE(LabelRef("LBB14_8"))
  2094  		LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RDX)
  2095  		LEAQ(Mem{Base: RSI}.Idx(RCX, 8), RCX)
  2096  		XORL(ESI, ESI)
  2097  	}
  2098  
  2099  	Label("LBB14_7")
  2100  	{
  2101  		VCVTTSD2SIQ(Mem{Base: RCX}.Idx(RSI, 8), RAX)
  2102  		MOVQ(RAX, Mem{Base: RDX}.Idx(RSI, 8))
  2103  		ADDQ(Imm(1), RSI)
  2104  		CMPQ(R8, RSI)
  2105  		JNE(LabelRef("LBB14_7"))
  2106  	}
  2107  
  2108  	Label("LBB14_8")
  2109  	{
  2110  		RET()
  2111  	}
  2112  }
  2113  
  2114  func genToInt64_F32() {
  2115  
  2116  	TEXT("ToInt64_AVX2_F32", NOSPLIT, "func(x []int64, y []float32)")
  2117  	Pragma("noescape")
  2118  	Load(Param("x").Base(), RDI)
  2119  	Load(Param("y").Base(), RSI)
  2120  	Load(Param("x").Len(), RDX)
  2121  
  2122  	TESTQ(RDX, RDX)
  2123  	JE(LabelRef("LBB15_8"))
  2124  	LEAQ(Mem{Base: RDX}.Offset(-1), RCX)
  2125  	MOVL(EDX, R8L)
  2126  	ANDL(Imm(3), R8L)
  2127  	CMPQ(RCX, Imm(3))
  2128  	JAE(LabelRef("LBB15_3"))
  2129  	XORL(ECX, ECX)
  2130  	JMP(LabelRef("LBB15_5"))
  2131  
  2132  	Label("LBB15_3")
  2133  	{
  2134  		ANDQ(I32(-4), RDX)
  2135  		XORL(ECX, ECX)
  2136  	}
  2137  
  2138  	Label("LBB15_4")
  2139  	{
  2140  		VCVTTSS2SIQ(Mem{Base: RSI}.Idx(RCX, 4), RAX)
  2141  		MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8))
  2142  		VCVTTSS2SIQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(4), RAX)
  2143  		MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(8))
  2144  		VCVTTSS2SIQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(8), RAX)
  2145  		MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(16))
  2146  		VCVTTSS2SIQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(12), RAX)
  2147  		MOVQ(RAX, Mem{Base: RDI}.Idx(RCX, 8).Offset(24))
  2148  		ADDQ(Imm(4), RCX)
  2149  		CMPQ(RDX, RCX)
  2150  		JNE(LabelRef("LBB15_4"))
  2151  	}
  2152  
  2153  	Label("LBB15_5")
  2154  	{
  2155  		TESTQ(R8, R8)
  2156  		JE(LabelRef("LBB15_8"))
  2157  		LEAQ(Mem{Base: RDI}.Idx(RCX, 8), RDX)
  2158  		LEAQ(Mem{Base: RSI}.Idx(RCX, 4), RCX)
  2159  		XORL(ESI, ESI)
  2160  	}
  2161  
  2162  	Label("LBB15_7")
  2163  	{
  2164  		VCVTTSS2SIQ(Mem{Base: RCX}.Idx(RSI, 4), RAX)
  2165  		MOVQ(RAX, Mem{Base: RDX}.Idx(RSI, 8))
  2166  		ADDQ(Imm(1), RSI)
  2167  		CMPQ(R8, RSI)
  2168  		JNE(LabelRef("LBB15_7"))
  2169  	}
  2170  
  2171  	Label("LBB15_8")
  2172  	{
  2173  		RET()
  2174  	}
  2175  }
  2176  
  2177  func genToInt32_F64() {
  2178  
  2179  	TEXT("ToInt32_AVX2_F64", NOSPLIT, "func(x []int32, y []float64)")
  2180  	Pragma("noescape")
  2181  	Load(Param("x").Base(), RDI)
  2182  	Load(Param("y").Base(), RSI)
  2183  	Load(Param("x").Len(), RDX)
  2184  
  2185  	TESTQ(RDX, RDX)
  2186  	JE(LabelRef("LBB16_11"))
  2187  	CMPQ(RDX, Imm(16))
  2188  	JAE(LabelRef("LBB16_3"))
  2189  	XORL(EAX, EAX)
  2190  	JMP(LabelRef("LBB16_10"))
  2191  
  2192  	Label("LBB16_3")
  2193  	{
  2194  		MOVQ(RDX, RAX)
  2195  		ANDQ(I32(-16), RAX)
  2196  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
  2197  		MOVQ(RCX, R8)
  2198  		SHRQ(Imm(4), R8)
  2199  		ADDQ(Imm(1), R8)
  2200  		TESTQ(RCX, RCX)
  2201  		JE(LabelRef("LBB16_4"))
  2202  		MOVQ(R8, R9)
  2203  		ANDQ(I32(-2), R9)
  2204  		XORL(ECX, ECX)
  2205  	}
  2206  
  2207  	Label("LBB16_6")
  2208  	{
  2209  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8), X0)
  2210  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X1)
  2211  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X2)
  2212  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X3)
  2213  		VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4))
  2214  		VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16))
  2215  		VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  2216  		VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48))
  2217  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(128), X0)
  2218  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(160), X1)
  2219  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(192), X2)
  2220  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(224), X3)
  2221  		VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  2222  		VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(80))
  2223  		VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  2224  		VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(112))
  2225  		ADDQ(Imm(32), RCX)
  2226  		ADDQ(I32(-2), R9)
  2227  		JNE(LabelRef("LBB16_6"))
  2228  		TESTB(Imm(1), R8B)
  2229  		JE(LabelRef("LBB16_9"))
  2230  	}
  2231  
  2232  	Label("LBB16_8")
  2233  	{
  2234  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8), X0)
  2235  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), X1)
  2236  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), X2)
  2237  		VCVTTPD2DQY(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), X3)
  2238  		VMOVUPD(X0, Mem{Base: RDI}.Idx(RCX, 4))
  2239  		VMOVUPD(X1, Mem{Base: RDI}.Idx(RCX, 4).Offset(16))
  2240  		VMOVUPD(X2, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  2241  		VMOVUPD(X3, Mem{Base: RDI}.Idx(RCX, 4).Offset(48))
  2242  	}
  2243  
  2244  	Label("LBB16_9")
  2245  	{
  2246  		CMPQ(RAX, RDX)
  2247  		JE(LabelRef("LBB16_11"))
  2248  	}
  2249  
  2250  	Label("LBB16_10")
  2251  	{
  2252  		VCVTTSD2SI(Mem{Base: RSI}.Idx(RAX, 8), ECX)
  2253  		MOVL(ECX, Mem{Base: RDI}.Idx(RAX, 4))
  2254  		ADDQ(Imm(1), RAX)
  2255  		CMPQ(RDX, RAX)
  2256  		JNE(LabelRef("LBB16_10"))
  2257  	}
  2258  
  2259  	Label("LBB16_11")
  2260  	{
  2261  		RET()
  2262  	}
  2263  
  2264  	Label("LBB16_4")
  2265  	{
  2266  		XORL(ECX, ECX)
  2267  		TESTB(Imm(1), R8B)
  2268  		JNE(LabelRef("LBB16_8"))
  2269  		JMP(LabelRef("LBB16_9"))
  2270  	}
  2271  }
  2272  
  2273  func genToInt32_F32() {
  2274  
  2275  	TEXT("ToInt32_AVX2_F32", NOSPLIT, "func(x []int32, y []float32)")
  2276  	Pragma("noescape")
  2277  	Load(Param("x").Base(), RDI)
  2278  	Load(Param("y").Base(), RSI)
  2279  	Load(Param("x").Len(), RDX)
  2280  
  2281  	TESTQ(RDX, RDX)
  2282  	JE(LabelRef("LBB17_11"))
  2283  	CMPQ(RDX, Imm(32))
  2284  	JAE(LabelRef("LBB17_3"))
  2285  	XORL(EAX, EAX)
  2286  	JMP(LabelRef("LBB17_10"))
  2287  
  2288  	Label("LBB17_3")
  2289  	{
  2290  		MOVQ(RDX, RAX)
  2291  		ANDQ(I32(-32), RAX)
  2292  		LEAQ(Mem{Base: RAX}.Offset(-32), RCX)
  2293  		MOVQ(RCX, R8)
  2294  		SHRQ(Imm(5), R8)
  2295  		ADDQ(Imm(1), R8)
  2296  		TESTQ(RCX, RCX)
  2297  		JE(LabelRef("LBB17_4"))
  2298  		MOVQ(R8, R9)
  2299  		ANDQ(I32(-2), R9)
  2300  		XORL(ECX, ECX)
  2301  	}
  2302  
  2303  	Label("LBB17_6")
  2304  	{
  2305  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4), Y0)
  2306  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1)
  2307  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2)
  2308  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3)
  2309  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4))
  2310  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  2311  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  2312  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  2313  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(128), Y0)
  2314  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(160), Y1)
  2315  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(192), Y2)
  2316  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(224), Y3)
  2317  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4).Offset(128))
  2318  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(160))
  2319  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(192))
  2320  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(224))
  2321  		ADDQ(Imm(64), RCX)
  2322  		ADDQ(I32(-2), R9)
  2323  		JNE(LabelRef("LBB17_6"))
  2324  		TESTB(Imm(1), R8B)
  2325  		JE(LabelRef("LBB17_9"))
  2326  	}
  2327  
  2328  	Label("LBB17_8")
  2329  	{
  2330  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4), Y0)
  2331  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1)
  2332  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2)
  2333  		VCVTTPS2DQ(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3)
  2334  		VMOVUPS(Y0, Mem{Base: RDI}.Idx(RCX, 4))
  2335  		VMOVUPS(Y1, Mem{Base: RDI}.Idx(RCX, 4).Offset(32))
  2336  		VMOVUPS(Y2, Mem{Base: RDI}.Idx(RCX, 4).Offset(64))
  2337  		VMOVUPS(Y3, Mem{Base: RDI}.Idx(RCX, 4).Offset(96))
  2338  	}
  2339  
  2340  	Label("LBB17_9")
  2341  	{
  2342  		CMPQ(RAX, RDX)
  2343  		JE(LabelRef("LBB17_11"))
  2344  	}
  2345  
  2346  	Label("LBB17_10")
  2347  	{
  2348  		VCVTTSS2SI(Mem{Base: RSI}.Idx(RAX, 4), ECX)
  2349  		MOVL(ECX, Mem{Base: RDI}.Idx(RAX, 4))
  2350  		ADDQ(Imm(1), RAX)
  2351  		CMPQ(RDX, RAX)
  2352  		JNE(LabelRef("LBB17_10"))
  2353  	}
  2354  
  2355  	Label("LBB17_11")
  2356  	{
  2357  		VZEROUPPER()
  2358  		RET()
  2359  	}
  2360  
  2361  	Label("LBB17_4")
  2362  	{
  2363  		XORL(ECX, ECX)
  2364  		TESTB(Imm(1), R8B)
  2365  		JNE(LabelRef("LBB17_8"))
  2366  		JMP(LabelRef("LBB17_9"))
  2367  	}
  2368  }