gitee.com/quant1x/gox@v1.7.6/num/asm/min.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 genMin_F64() {
    10  
    11  	data := GLOBL("dataMinF64", RODATA|NOPTR)
    12  	DATA(0, U64(0x7fefffffffffffff))
    13  
    14  	TEXT("Min_AVX2_F64", NOSPLIT, "func(x []float64) float64")
    15  	Pragma("noescape")
    16  	Load(Param("x").Base(), RDI)
    17  	Load(Param("x").Len(), RSI)
    18  
    19  	TESTQ(RSI, RSI)
    20  	JE(LabelRef("LBB0_1"))
    21  	CMPQ(RSI, Imm(16))
    22  	JAE(LabelRef("LBB0_4"))
    23  	VMOVSD(data, X0)
    24  	XORL(EAX, EAX)
    25  	JMP(LabelRef("LBB0_11"))
    26  
    27  	Label("LBB0_1")
    28  	{
    29  		VMOVSD(data, X0)
    30  		Store(X0, ReturnIndex(0))
    31  		RET()
    32  	}
    33  
    34  	Label("LBB0_4")
    35  	{
    36  		MOVQ(RSI, RAX)
    37  		ANDQ(I32(-16), RAX)
    38  		LEAQ(Mem{Base: RAX}.Offset(-16), RCX)
    39  		MOVQ(RCX, R8)
    40  		SHRQ(Imm(4), R8)
    41  		ADDQ(Imm(1), R8)
    42  		TESTQ(RCX, RCX)
    43  		JE(LabelRef("LBB0_5"))
    44  		MOVQ(R8, RCX)
    45  		ANDQ(I32(-2), RCX)
    46  		VBROADCASTSD(data, Y0)
    47  		XORL(EDX, EDX)
    48  		VMOVAPD(Y0, Y1)
    49  		VMOVAPD(Y0, Y2)
    50  		VMOVAPD(Y0, Y3)
    51  	}
    52  
    53  	Label("LBB0_7")
    54  	{
    55  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0)
    56  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1)
    57  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2)
    58  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3)
    59  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(128), Y0, Y0)
    60  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(160), Y1, Y1)
    61  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(192), Y2, Y2)
    62  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(224), Y3, Y3)
    63  		ADDQ(Imm(32), RDX)
    64  		ADDQ(I32(-2), RCX)
    65  		JNE(LabelRef("LBB0_7"))
    66  		TESTB(Imm(1), R8B)
    67  		JE(LabelRef("LBB0_10"))
    68  	}
    69  
    70  	Label("LBB0_9")
    71  	{
    72  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8), Y0, Y0)
    73  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(32), Y1, Y1)
    74  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(64), Y2, Y2)
    75  		VMINPD(Mem{Base: RDI}.Idx(RDX, 8).Offset(96), Y3, Y3)
    76  	}
    77  
    78  	Label("LBB0_10")
    79  	{
    80  		VMINPD(Y3, Y0, Y0)
    81  		VMINPD(Y2, Y1, Y1)
    82  		VMINPD(Y0, Y1, Y0)
    83  		VEXTRACTF128(Imm(1), Y0, X1)
    84  		VMINPD(X1, X0, X0)
    85  		VPERMILPD(Imm(1), X0, X1)
    86  		VMINSD(X1, X0, X0)
    87  		CMPQ(RAX, RSI)
    88  		JE(LabelRef("LBB0_12"))
    89  	}
    90  
    91  	Label("LBB0_11")
    92  	{
    93  		VMINSD(Mem{Base: RDI}.Idx(RAX, 8), X0, X0)
    94  		ADDQ(Imm(1), RAX)
    95  		CMPQ(RSI, RAX)
    96  		JNE(LabelRef("LBB0_11"))
    97  	}
    98  
    99  	Label("LBB0_12")
   100  	{
   101  		VZEROUPPER()
   102  		Store(X0, ReturnIndex(0))
   103  		RET()
   104  	}
   105  
   106  	Label("LBB0_5")
   107  	{
   108  		VBROADCASTSD(data, Y0)
   109  		XORL(EDX, EDX)
   110  		VMOVAPD(Y0, Y1)
   111  		VMOVAPD(Y0, Y2)
   112  		VMOVAPD(Y0, Y3)
   113  		TESTB(Imm(1), R8B)
   114  		JNE(LabelRef("LBB0_9"))
   115  		JMP(LabelRef("LBB0_10"))
   116  	}
   117  }
   118  
   119  func genMin_F32() {
   120  
   121  	data := GLOBL("dataMinF32", RODATA|NOPTR)
   122  	DATA(0, U32(0x7f7fffff))
   123  
   124  	TEXT("Min_AVX2_F32", NOSPLIT, "func(x []float32) float32")
   125  	Pragma("noescape")
   126  	Load(Param("x").Base(), RDI)
   127  	Load(Param("x").Len(), RSI)
   128  
   129  	TESTQ(RSI, RSI)
   130  	JE(LabelRef("LBB1_1"))
   131  	CMPQ(RSI, Imm(32))
   132  	JAE(LabelRef("LBB1_4"))
   133  	VMOVSS(data, X0)
   134  	XORL(EAX, EAX)
   135  	JMP(LabelRef("LBB1_11"))
   136  
   137  	Label("LBB1_1")
   138  	{
   139  		VMOVSS(data, X0)
   140  		Store(X0, ReturnIndex(0))
   141  		RET()
   142  	}
   143  
   144  	Label("LBB1_4")
   145  	{
   146  		MOVQ(RSI, RAX)
   147  		ANDQ(I32(-32), RAX)
   148  		LEAQ(Mem{Base: RAX}.Offset(-32), RCX)
   149  		MOVQ(RCX, R8)
   150  		SHRQ(Imm(5), R8)
   151  		ADDQ(Imm(1), R8)
   152  		TESTQ(RCX, RCX)
   153  		JE(LabelRef("LBB1_5"))
   154  		MOVQ(R8, RCX)
   155  		ANDQ(I32(-2), RCX)
   156  		VBROADCASTSS(data, Y0)
   157  		XORL(EDX, EDX)
   158  		VMOVAPS(Y0, Y1)
   159  		VMOVAPS(Y0, Y2)
   160  		VMOVAPS(Y0, Y3)
   161  	}
   162  
   163  	Label("LBB1_7")
   164  	{
   165  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0)
   166  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1)
   167  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2)
   168  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3)
   169  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(128), Y0, Y0)
   170  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(160), Y1, Y1)
   171  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(192), Y2, Y2)
   172  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(224), Y3, Y3)
   173  		ADDQ(Imm(64), RDX)
   174  		ADDQ(I32(-2), RCX)
   175  		JNE(LabelRef("LBB1_7"))
   176  		TESTB(Imm(1), R8B)
   177  		JE(LabelRef("LBB1_10"))
   178  	}
   179  
   180  	Label("LBB1_9")
   181  	{
   182  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4), Y0, Y0)
   183  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(32), Y1, Y1)
   184  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(64), Y2, Y2)
   185  		VMINPS(Mem{Base: RDI}.Idx(RDX, 4).Offset(96), Y3, Y3)
   186  	}
   187  
   188  	Label("LBB1_10")
   189  	{
   190  		VMINPS(Y3, Y0, Y0)
   191  		VMINPS(Y2, Y1, Y1)
   192  		VMINPS(Y0, Y1, Y0)
   193  		VEXTRACTF128(Imm(1), Y0, X1)
   194  		VMINPS(X1, X0, X0)
   195  		VPERMILPD(Imm(1), X0, X1)
   196  		VMINPS(X1, X0, X0)
   197  		VMOVSHDUP(X0, X1)
   198  		VMINSS(X1, X0, X0)
   199  		CMPQ(RAX, RSI)
   200  		JE(LabelRef("LBB1_12"))
   201  	}
   202  
   203  	Label("LBB1_11")
   204  	{
   205  		VMINSS(Mem{Base: RDI}.Idx(RAX, 4), X0, X0)
   206  		ADDQ(Imm(1), RAX)
   207  		CMPQ(RSI, RAX)
   208  		JNE(LabelRef("LBB1_11"))
   209  	}
   210  
   211  	Label("LBB1_12")
   212  	{
   213  		VZEROUPPER()
   214  		Store(X0, ReturnIndex(0))
   215  		RET()
   216  	}
   217  
   218  	Label("LBB1_5")
   219  	{
   220  		VBROADCASTSS(data, Y0)
   221  		XORL(EDX, EDX)
   222  		VMOVAPS(Y0, Y1)
   223  		VMOVAPS(Y0, Y2)
   224  		VMOVAPS(Y0, Y3)
   225  		TESTB(Imm(1), R8B)
   226  		JNE(LabelRef("LBB1_9"))
   227  		JMP(LabelRef("LBB1_10"))
   228  	}
   229  }
   230  
   231  func genMinimum_F64() {
   232  
   233  	TEXT("Minimum_AVX2_F64", NOSPLIT, "func(x, y []float64)")
   234  	Pragma("noescape")
   235  	Load(Param("x").Base(), RDI)
   236  	Load(Param("y").Base(), RSI)
   237  	Load(Param("x").Len(), RDX)
   238  
   239  	TESTQ(RDX, RDX)
   240  	JE(LabelRef("LBB2_9"))
   241  	CMPQ(RDX, Imm(16))
   242  	JAE(LabelRef("LBB2_3"))
   243  	XORL(EAX, EAX)
   244  	JMP(LabelRef("LBB2_6"))
   245  
   246  	Label("LBB2_3")
   247  	{
   248  		MOVQ(RDX, RAX)
   249  		ANDQ(I32(-16), RAX)
   250  		LEAQ(Mem{Base: RDI}.Offset(96), R8)
   251  		XORL(ECX, ECX)
   252  	}
   253  
   254  	Label("LBB2_4")
   255  	{
   256  		VMOVUPD(Mem{Base: RSI}.Idx(RCX, 8), Y0)
   257  		VMOVUPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(32), Y1)
   258  		VMOVUPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(64), Y2)
   259  		VMOVUPD(Mem{Base: RSI}.Idx(RCX, 8).Offset(96), Y3)
   260  		VCMPPD(Imm(1), Mem{Base: R8}.Idx(RCX, 8).Offset(-96), Y0, Y4)
   261  		VCMPPD(Imm(1), Mem{Base: R8}.Idx(RCX, 8).Offset(-64), Y1, Y5)
   262  		VCMPPD(Imm(1), Mem{Base: R8}.Idx(RCX, 8).Offset(-32), Y2, Y6)
   263  		VCMPPD(Imm(1), Mem{Base: R8}.Idx(RCX, 8), Y3, Y7)
   264  		VMASKMOVPD(Y0, Y4, Mem{Base: R8}.Idx(RCX, 8).Offset(-96))
   265  		VMASKMOVPD(Y1, Y5, Mem{Base: R8}.Idx(RCX, 8).Offset(-64))
   266  		VMASKMOVPD(Y2, Y6, Mem{Base: R8}.Idx(RCX, 8).Offset(-32))
   267  		VMASKMOVPD(Y3, Y7, Mem{Base: R8}.Idx(RCX, 8))
   268  		ADDQ(Imm(16), RCX)
   269  		CMPQ(RAX, RCX)
   270  		JNE(LabelRef("LBB2_4"))
   271  		CMPQ(RAX, RDX)
   272  		JNE(LabelRef("LBB2_6"))
   273  	}
   274  
   275  	Label("LBB2_9")
   276  	{
   277  		VZEROUPPER()
   278  		RET()
   279  	}
   280  
   281  	Label("LBB2_8")
   282  	{
   283  		ADDQ(Imm(1), RAX)
   284  		CMPQ(RDX, RAX)
   285  		JE(LabelRef("LBB2_9"))
   286  	}
   287  
   288  	Label("LBB2_6")
   289  	{
   290  		VMOVSD(Mem{Base: RSI}.Idx(RAX, 8), X0)
   291  		VUCOMISD(Mem{Base: RDI}.Idx(RAX, 8), X0)
   292  		JAE(LabelRef("LBB2_8"))
   293  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   294  		JMP(LabelRef("LBB2_8"))
   295  	}
   296  }
   297  
   298  func genMinimum_F32() {
   299  
   300  	TEXT("Minimum_AVX2_F32", NOSPLIT, "func(x, y []float32)")
   301  	Pragma("noescape")
   302  	Load(Param("x").Base(), RDI)
   303  	Load(Param("y").Base(), RSI)
   304  	Load(Param("x").Len(), RDX)
   305  
   306  	TESTQ(RDX, RDX)
   307  	JE(LabelRef("LBB3_9"))
   308  	CMPQ(RDX, Imm(32))
   309  	JAE(LabelRef("LBB3_3"))
   310  	XORL(EAX, EAX)
   311  	JMP(LabelRef("LBB3_6"))
   312  
   313  	Label("LBB3_3")
   314  	{
   315  		MOVQ(RDX, RAX)
   316  		ANDQ(I32(-32), RAX)
   317  		LEAQ(Mem{Base: RDI}.Offset(96), R8)
   318  		XORL(ECX, ECX)
   319  	}
   320  
   321  	Label("LBB3_4")
   322  	{
   323  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4), Y0)
   324  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(32), Y1)
   325  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(64), Y2)
   326  		VMOVUPS(Mem{Base: RSI}.Idx(RCX, 4).Offset(96), Y3)
   327  		VCMPPS(Imm(1), Mem{Base: R8}.Idx(RCX, 4).Offset(-96), Y0, Y4)
   328  		VCMPPS(Imm(1), Mem{Base: R8}.Idx(RCX, 4).Offset(-64), Y1, Y5)
   329  		VCMPPS(Imm(1), Mem{Base: R8}.Idx(RCX, 4).Offset(-32), Y2, Y6)
   330  		VCMPPS(Imm(1), Mem{Base: R8}.Idx(RCX, 4), Y3, Y7)
   331  		VMASKMOVPS(Y0, Y4, Mem{Base: R8}.Idx(RCX, 4).Offset(-96))
   332  		VMASKMOVPS(Y1, Y5, Mem{Base: R8}.Idx(RCX, 4).Offset(-64))
   333  		VMASKMOVPS(Y2, Y6, Mem{Base: R8}.Idx(RCX, 4).Offset(-32))
   334  		VMASKMOVPS(Y3, Y7, Mem{Base: R8}.Idx(RCX, 4))
   335  		ADDQ(Imm(32), RCX)
   336  		CMPQ(RAX, RCX)
   337  		JNE(LabelRef("LBB3_4"))
   338  		CMPQ(RAX, RDX)
   339  		JNE(LabelRef("LBB3_6"))
   340  	}
   341  
   342  	Label("LBB3_9")
   343  	{
   344  		VZEROUPPER()
   345  		RET()
   346  	}
   347  
   348  	Label("LBB3_8")
   349  	{
   350  		ADDQ(Imm(1), RAX)
   351  		CMPQ(RDX, RAX)
   352  		JE(LabelRef("LBB3_9"))
   353  	}
   354  
   355  	Label("LBB3_6")
   356  	{
   357  		VMOVSS(Mem{Base: RSI}.Idx(RAX, 4), X0)
   358  		VUCOMISS(Mem{Base: RDI}.Idx(RAX, 4), X0)
   359  		JAE(LabelRef("LBB3_8"))
   360  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   361  		JMP(LabelRef("LBB3_8"))
   362  	}
   363  }
   364  
   365  func genMinimumNumber_F64() {
   366  
   367  	TEXT("MinimumNumber_AVX2_F64", NOSPLIT, "func(x []float64, a float64)")
   368  	Pragma("noescape")
   369  	Load(Param("x").Base(), RDI)
   370  	Load(Param("a"), X0)
   371  	Load(Param("x").Len(), RSI)
   372  
   373  	TESTQ(RSI, RSI)
   374  	JE(LabelRef("LBB4_9"))
   375  	CMPQ(RSI, Imm(16))
   376  	JAE(LabelRef("LBB4_3"))
   377  	XORL(EAX, EAX)
   378  	JMP(LabelRef("LBB4_6"))
   379  
   380  	Label("LBB4_3")
   381  	{
   382  		MOVQ(RSI, RAX)
   383  		ANDQ(I32(-16), RAX)
   384  		VBROADCASTSD(X0, Y1)
   385  		LEAQ(Mem{Base: RDI}.Offset(96), RCX)
   386  		XORL(EDX, EDX)
   387  	}
   388  
   389  	Label("LBB4_4")
   390  	{
   391  		VCMPPD(Imm(1), Mem{Base: RCX}.Idx(RDX, 8).Offset(-96), Y1, Y2)
   392  		VCMPPD(Imm(1), Mem{Base: RCX}.Idx(RDX, 8).Offset(-64), Y1, Y3)
   393  		VCMPPD(Imm(1), Mem{Base: RCX}.Idx(RDX, 8).Offset(-32), Y1, Y4)
   394  		VCMPPD(Imm(1), Mem{Base: RCX}.Idx(RDX, 8), Y1, Y5)
   395  		VMASKMOVPD(Y1, Y2, Mem{Base: RCX}.Idx(RDX, 8).Offset(-96))
   396  		VMASKMOVPD(Y1, Y3, Mem{Base: RCX}.Idx(RDX, 8).Offset(-64))
   397  		VMASKMOVPD(Y1, Y4, Mem{Base: RCX}.Idx(RDX, 8).Offset(-32))
   398  		VMASKMOVPD(Y1, Y5, Mem{Base: RCX}.Idx(RDX, 8))
   399  		ADDQ(Imm(16), RDX)
   400  		CMPQ(RAX, RDX)
   401  		JNE(LabelRef("LBB4_4"))
   402  		CMPQ(RAX, RSI)
   403  		JNE(LabelRef("LBB4_6"))
   404  	}
   405  
   406  	Label("LBB4_9")
   407  	{
   408  		VZEROUPPER()
   409  		RET()
   410  	}
   411  
   412  	Label("LBB4_8")
   413  	{
   414  		ADDQ(Imm(1), RAX)
   415  		CMPQ(RSI, RAX)
   416  		JE(LabelRef("LBB4_9"))
   417  	}
   418  
   419  	Label("LBB4_6")
   420  	{
   421  		VUCOMISD(Mem{Base: RDI}.Idx(RAX, 8), X0)
   422  		JAE(LabelRef("LBB4_8"))
   423  		VMOVSD(X0, Mem{Base: RDI}.Idx(RAX, 8))
   424  		JMP(LabelRef("LBB4_8"))
   425  	}
   426  }
   427  
   428  func genMinimumNumber_F32() {
   429  
   430  	TEXT("MinimumNumber_AVX2_F32", NOSPLIT, "func(x []float32, a float32)")
   431  	Pragma("noescape")
   432  	Load(Param("x").Base(), RDI)
   433  	Load(Param("a"), X0)
   434  	Load(Param("x").Len(), RSI)
   435  
   436  	TESTQ(RSI, RSI)
   437  	JE(LabelRef("LBB5_9"))
   438  	CMPQ(RSI, Imm(32))
   439  	JAE(LabelRef("LBB5_3"))
   440  	XORL(EAX, EAX)
   441  	JMP(LabelRef("LBB5_6"))
   442  
   443  	Label("LBB5_3")
   444  	{
   445  		MOVQ(RSI, RAX)
   446  		ANDQ(I32(-32), RAX)
   447  		VBROADCASTSS(X0, Y1)
   448  		LEAQ(Mem{Base: RDI}.Offset(96), RCX)
   449  		XORL(EDX, EDX)
   450  	}
   451  
   452  	Label("LBB5_4")
   453  	{
   454  		VCMPPS(Imm(1), Mem{Base: RCX}.Idx(RDX, 4).Offset(-96), Y1, Y2)
   455  		VCMPPS(Imm(1), Mem{Base: RCX}.Idx(RDX, 4).Offset(-64), Y1, Y3)
   456  		VCMPPS(Imm(1), Mem{Base: RCX}.Idx(RDX, 4).Offset(-32), Y1, Y4)
   457  		VCMPPS(Imm(1), Mem{Base: RCX}.Idx(RDX, 4), Y1, Y5)
   458  		VMASKMOVPS(Y1, Y2, Mem{Base: RCX}.Idx(RDX, 4).Offset(-96))
   459  		VMASKMOVPS(Y1, Y3, Mem{Base: RCX}.Idx(RDX, 4).Offset(-64))
   460  		VMASKMOVPS(Y1, Y4, Mem{Base: RCX}.Idx(RDX, 4).Offset(-32))
   461  		VMASKMOVPS(Y1, Y5, Mem{Base: RCX}.Idx(RDX, 4))
   462  		ADDQ(Imm(32), RDX)
   463  		CMPQ(RAX, RDX)
   464  		JNE(LabelRef("LBB5_4"))
   465  		CMPQ(RAX, RSI)
   466  		JNE(LabelRef("LBB5_6"))
   467  	}
   468  
   469  	Label("LBB5_9")
   470  	{
   471  		VZEROUPPER()
   472  		RET()
   473  	}
   474  
   475  	Label("LBB5_8")
   476  	{
   477  		ADDQ(Imm(1), RAX)
   478  		CMPQ(RSI, RAX)
   479  		JE(LabelRef("LBB5_9"))
   480  	}
   481  
   482  	Label("LBB5_6")
   483  	{
   484  		VUCOMISS(Mem{Base: RDI}.Idx(RAX, 4), X0)
   485  		JAE(LabelRef("LBB5_8"))
   486  		VMOVSS(X0, Mem{Base: RDI}.Idx(RAX, 4))
   487  		JMP(LabelRef("LBB5_8"))
   488  	}
   489  }