Source file src/simd/archsimd/internal/simd_test/compare_test.go

     1  // Copyright 2025 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build goexperiment.simd && amd64
     6  
     7  package simd_test
     8  
     9  import (
    10  	"simd/archsimd"
    11  	"testing"
    12  )
    13  
    14  // AVX 2 lacks most comparisons, but they can be synthesized
    15  // from > and =
    16  var comparisonFixed bool = archsimd.X86.AVX512()
    17  
    18  func TestLess(t *testing.T) {
    19  	testFloat32x4Compare(t, archsimd.Float32x4.Less, lessSlice[float32])
    20  	testFloat32x8Compare(t, archsimd.Float32x8.Less, lessSlice[float32])
    21  	testFloat64x2Compare(t, archsimd.Float64x2.Less, lessSlice[float64])
    22  	testFloat64x4Compare(t, archsimd.Float64x4.Less, lessSlice[float64])
    23  
    24  	testInt16x8Compare(t, archsimd.Int16x8.Less, lessSlice[int16])
    25  	testInt32x4Compare(t, archsimd.Int32x4.Less, lessSlice[int32])
    26  	testInt64x2Compare(t, archsimd.Int64x2.Less, lessSlice[int64])
    27  	testInt8x16Compare(t, archsimd.Int8x16.Less, lessSlice[int8])
    28  
    29  	if archsimd.X86.AVX2() {
    30  		testInt16x16Compare(t, archsimd.Int16x16.Less, lessSlice[int16])
    31  		testInt32x8Compare(t, archsimd.Int32x8.Less, lessSlice[int32])
    32  		testInt64x4Compare(t, archsimd.Int64x4.Less, lessSlice[int64])
    33  		testInt8x32Compare(t, archsimd.Int8x32.Less, lessSlice[int8])
    34  
    35  		testInt16x16Compare(t, archsimd.Int16x16.Less, lessSlice[int16])
    36  		testInt32x8Compare(t, archsimd.Int32x8.Less, lessSlice[int32])
    37  		testInt64x4Compare(t, archsimd.Int64x4.Less, lessSlice[int64])
    38  		testInt8x32Compare(t, archsimd.Int8x32.Less, lessSlice[int8])
    39  	}
    40  
    41  	testInt16x8Compare(t, archsimd.Int16x8.Less, lessSlice[int16])
    42  	testInt32x4Compare(t, archsimd.Int32x4.Less, lessSlice[int32])
    43  	testInt64x2Compare(t, archsimd.Int64x2.Less, lessSlice[int64])
    44  	testInt8x16Compare(t, archsimd.Int8x16.Less, lessSlice[int8])
    45  
    46  	testUint16x8Compare(t, archsimd.Uint16x8.Less, lessSlice[uint16])
    47  	testUint32x4Compare(t, archsimd.Uint32x4.Less, lessSlice[uint32])
    48  	testUint64x2Compare(t, archsimd.Uint64x2.Less, lessSlice[uint64])
    49  	testUint8x16Compare(t, archsimd.Uint8x16.Less, lessSlice[uint8])
    50  
    51  	if archsimd.X86.AVX2() {
    52  		testUint16x16Compare(t, archsimd.Uint16x16.Less, lessSlice[uint16])
    53  		testUint32x8Compare(t, archsimd.Uint32x8.Less, lessSlice[uint32])
    54  		testUint64x4Compare(t, archsimd.Uint64x4.Less, lessSlice[uint64])
    55  		testUint8x32Compare(t, archsimd.Uint8x32.Less, lessSlice[uint8])
    56  	}
    57  
    58  	if archsimd.X86.AVX512() {
    59  		testUint16x16Compare(t, archsimd.Uint16x16.Less, lessSlice[uint16])
    60  		testUint16x8Compare(t, archsimd.Uint16x8.Less, lessSlice[uint16])
    61  		testUint32x4Compare(t, archsimd.Uint32x4.Less, lessSlice[uint32])
    62  		testUint32x8Compare(t, archsimd.Uint32x8.Less, lessSlice[uint32])
    63  		testUint64x2Compare(t, archsimd.Uint64x2.Less, lessSlice[uint64])
    64  		testUint64x4Compare(t, archsimd.Uint64x4.Less, lessSlice[uint64])
    65  		testUint8x16Compare(t, archsimd.Uint8x16.Less, lessSlice[uint8])
    66  		testUint8x32Compare(t, archsimd.Uint8x32.Less, lessSlice[uint8])
    67  
    68  		testFloat32x16Compare(t, archsimd.Float32x16.Less, lessSlice[float32])
    69  		testFloat64x8Compare(t, archsimd.Float64x8.Less, lessSlice[float64])
    70  		testInt8x64Compare(t, archsimd.Int8x64.Less, lessSlice[int8])
    71  		testInt16x32Compare(t, archsimd.Int16x32.Less, lessSlice[int16])
    72  		testInt32x16Compare(t, archsimd.Int32x16.Less, lessSlice[int32])
    73  		testInt64x8Compare(t, archsimd.Int64x8.Less, lessSlice[int64])
    74  		testUint8x64Compare(t, archsimd.Uint8x64.Less, lessSlice[uint8])
    75  		testUint16x32Compare(t, archsimd.Uint16x32.Less, lessSlice[uint16])
    76  		testUint32x16Compare(t, archsimd.Uint32x16.Less, lessSlice[uint32])
    77  		testUint64x8Compare(t, archsimd.Uint64x8.Less, lessSlice[uint64])
    78  	}
    79  }
    80  
    81  func TestLessEqual(t *testing.T) {
    82  	testFloat32x4Compare(t, archsimd.Float32x4.LessEqual, lessEqualSlice[float32])
    83  	testFloat32x8Compare(t, archsimd.Float32x8.LessEqual, lessEqualSlice[float32])
    84  	testFloat64x2Compare(t, archsimd.Float64x2.LessEqual, lessEqualSlice[float64])
    85  	testFloat64x4Compare(t, archsimd.Float64x4.LessEqual, lessEqualSlice[float64])
    86  
    87  	testInt16x8Compare(t, archsimd.Int16x8.LessEqual, lessEqualSlice[int16])
    88  	testInt32x4Compare(t, archsimd.Int32x4.LessEqual, lessEqualSlice[int32])
    89  	testInt64x2Compare(t, archsimd.Int64x2.LessEqual, lessEqualSlice[int64])
    90  	testInt8x16Compare(t, archsimd.Int8x16.LessEqual, lessEqualSlice[int8])
    91  
    92  	if archsimd.X86.AVX2() {
    93  		testInt16x16Compare(t, archsimd.Int16x16.LessEqual, lessEqualSlice[int16])
    94  		testInt32x8Compare(t, archsimd.Int32x8.LessEqual, lessEqualSlice[int32])
    95  		testInt64x4Compare(t, archsimd.Int64x4.LessEqual, lessEqualSlice[int64])
    96  		testInt8x32Compare(t, archsimd.Int8x32.LessEqual, lessEqualSlice[int8])
    97  	}
    98  
    99  	testUint16x8Compare(t, archsimd.Uint16x8.LessEqual, lessEqualSlice[uint16])
   100  	testUint32x4Compare(t, archsimd.Uint32x4.LessEqual, lessEqualSlice[uint32])
   101  	testUint64x2Compare(t, archsimd.Uint64x2.LessEqual, lessEqualSlice[uint64])
   102  	testUint8x16Compare(t, archsimd.Uint8x16.LessEqual, lessEqualSlice[uint8])
   103  
   104  	if archsimd.X86.AVX2() {
   105  		testUint16x16Compare(t, archsimd.Uint16x16.LessEqual, lessEqualSlice[uint16])
   106  		testUint32x8Compare(t, archsimd.Uint32x8.LessEqual, lessEqualSlice[uint32])
   107  		testUint64x4Compare(t, archsimd.Uint64x4.LessEqual, lessEqualSlice[uint64])
   108  		testUint8x32Compare(t, archsimd.Uint8x32.LessEqual, lessEqualSlice[uint8])
   109  	}
   110  
   111  	if archsimd.X86.AVX512() {
   112  		testFloat32x16Compare(t, archsimd.Float32x16.LessEqual, lessEqualSlice[float32])
   113  		testFloat64x8Compare(t, archsimd.Float64x8.LessEqual, lessEqualSlice[float64])
   114  		testInt8x64Compare(t, archsimd.Int8x64.LessEqual, lessEqualSlice[int8])
   115  		testInt16x32Compare(t, archsimd.Int16x32.LessEqual, lessEqualSlice[int16])
   116  		testInt32x16Compare(t, archsimd.Int32x16.LessEqual, lessEqualSlice[int32])
   117  		testInt64x8Compare(t, archsimd.Int64x8.LessEqual, lessEqualSlice[int64])
   118  		testUint8x64Compare(t, archsimd.Uint8x64.LessEqual, lessEqualSlice[uint8])
   119  		testUint16x32Compare(t, archsimd.Uint16x32.LessEqual, lessEqualSlice[uint16])
   120  		testUint32x16Compare(t, archsimd.Uint32x16.LessEqual, lessEqualSlice[uint32])
   121  		testUint64x8Compare(t, archsimd.Uint64x8.LessEqual, lessEqualSlice[uint64])
   122  	}
   123  }
   124  
   125  func TestGreater(t *testing.T) {
   126  	testFloat32x4Compare(t, archsimd.Float32x4.Greater, greaterSlice[float32])
   127  	testFloat32x8Compare(t, archsimd.Float32x8.Greater, greaterSlice[float32])
   128  	testFloat64x2Compare(t, archsimd.Float64x2.Greater, greaterSlice[float64])
   129  	testFloat64x4Compare(t, archsimd.Float64x4.Greater, greaterSlice[float64])
   130  
   131  	testInt16x8Compare(t, archsimd.Int16x8.Greater, greaterSlice[int16])
   132  	testInt32x4Compare(t, archsimd.Int32x4.Greater, greaterSlice[int32])
   133  	testInt64x2Compare(t, archsimd.Int64x2.Greater, greaterSlice[int64])
   134  	testInt8x16Compare(t, archsimd.Int8x16.Greater, greaterSlice[int8])
   135  
   136  	if archsimd.X86.AVX2() {
   137  		testInt16x16Compare(t, archsimd.Int16x16.Greater, greaterSlice[int16])
   138  		testInt32x8Compare(t, archsimd.Int32x8.Greater, greaterSlice[int32])
   139  		testInt64x4Compare(t, archsimd.Int64x4.Greater, greaterSlice[int64])
   140  		testInt8x32Compare(t, archsimd.Int8x32.Greater, greaterSlice[int8])
   141  	}
   142  
   143  	testUint16x8Compare(t, archsimd.Uint16x8.Greater, greaterSlice[uint16])
   144  	testUint32x4Compare(t, archsimd.Uint32x4.Greater, greaterSlice[uint32])
   145  	testUint64x2Compare(t, archsimd.Uint64x2.Greater, greaterSlice[uint64])
   146  	testUint8x16Compare(t, archsimd.Uint8x16.Greater, greaterSlice[uint8])
   147  
   148  	if archsimd.X86.AVX2() {
   149  		testUint16x16Compare(t, archsimd.Uint16x16.Greater, greaterSlice[uint16])
   150  		testUint32x8Compare(t, archsimd.Uint32x8.Greater, greaterSlice[uint32])
   151  		testUint64x4Compare(t, archsimd.Uint64x4.Greater, greaterSlice[uint64])
   152  		testUint8x32Compare(t, archsimd.Uint8x32.Greater, greaterSlice[uint8])
   153  	}
   154  
   155  	if archsimd.X86.AVX512() {
   156  
   157  		testFloat32x16Compare(t, archsimd.Float32x16.Greater, greaterSlice[float32])
   158  		testFloat64x8Compare(t, archsimd.Float64x8.Greater, greaterSlice[float64])
   159  		testInt8x64Compare(t, archsimd.Int8x64.Greater, greaterSlice[int8])
   160  		testInt16x32Compare(t, archsimd.Int16x32.Greater, greaterSlice[int16])
   161  		testInt32x16Compare(t, archsimd.Int32x16.Greater, greaterSlice[int32])
   162  		testInt64x8Compare(t, archsimd.Int64x8.Greater, greaterSlice[int64])
   163  		testUint8x64Compare(t, archsimd.Uint8x64.Greater, greaterSlice[uint8])
   164  		testUint16x32Compare(t, archsimd.Uint16x32.Greater, greaterSlice[uint16])
   165  		testUint32x16Compare(t, archsimd.Uint32x16.Greater, greaterSlice[uint32])
   166  		testUint64x8Compare(t, archsimd.Uint64x8.Greater, greaterSlice[uint64])
   167  	}
   168  }
   169  
   170  func TestGreaterEqual(t *testing.T) {
   171  	testFloat32x4Compare(t, archsimd.Float32x4.GreaterEqual, greaterEqualSlice[float32])
   172  	testFloat32x8Compare(t, archsimd.Float32x8.GreaterEqual, greaterEqualSlice[float32])
   173  	testFloat64x2Compare(t, archsimd.Float64x2.GreaterEqual, greaterEqualSlice[float64])
   174  	testFloat64x4Compare(t, archsimd.Float64x4.GreaterEqual, greaterEqualSlice[float64])
   175  
   176  	testInt16x8Compare(t, archsimd.Int16x8.GreaterEqual, greaterEqualSlice[int16])
   177  	testInt32x4Compare(t, archsimd.Int32x4.GreaterEqual, greaterEqualSlice[int32])
   178  	testInt64x2Compare(t, archsimd.Int64x2.GreaterEqual, greaterEqualSlice[int64])
   179  	testInt8x16Compare(t, archsimd.Int8x16.GreaterEqual, greaterEqualSlice[int8])
   180  
   181  	if archsimd.X86.AVX2() {
   182  		testInt16x16Compare(t, archsimd.Int16x16.GreaterEqual, greaterEqualSlice[int16])
   183  		testInt32x8Compare(t, archsimd.Int32x8.GreaterEqual, greaterEqualSlice[int32])
   184  		testInt64x4Compare(t, archsimd.Int64x4.GreaterEqual, greaterEqualSlice[int64])
   185  		testInt8x32Compare(t, archsimd.Int8x32.GreaterEqual, greaterEqualSlice[int8])
   186  	}
   187  
   188  	testUint16x8Compare(t, archsimd.Uint16x8.GreaterEqual, greaterEqualSlice[uint16])
   189  	testUint32x4Compare(t, archsimd.Uint32x4.GreaterEqual, greaterEqualSlice[uint32])
   190  	testUint64x2Compare(t, archsimd.Uint64x2.GreaterEqual, greaterEqualSlice[uint64])
   191  	testUint8x16Compare(t, archsimd.Uint8x16.GreaterEqual, greaterEqualSlice[uint8])
   192  
   193  	if archsimd.X86.AVX2() {
   194  		testUint16x16Compare(t, archsimd.Uint16x16.GreaterEqual, greaterEqualSlice[uint16])
   195  		testUint32x8Compare(t, archsimd.Uint32x8.GreaterEqual, greaterEqualSlice[uint32])
   196  		testUint64x4Compare(t, archsimd.Uint64x4.GreaterEqual, greaterEqualSlice[uint64])
   197  		testUint8x32Compare(t, archsimd.Uint8x32.GreaterEqual, greaterEqualSlice[uint8])
   198  	}
   199  
   200  	if archsimd.X86.AVX512() {
   201  		testFloat32x16Compare(t, archsimd.Float32x16.GreaterEqual, greaterEqualSlice[float32])
   202  		testFloat64x8Compare(t, archsimd.Float64x8.GreaterEqual, greaterEqualSlice[float64])
   203  		testInt8x64Compare(t, archsimd.Int8x64.GreaterEqual, greaterEqualSlice[int8])
   204  		testInt16x32Compare(t, archsimd.Int16x32.GreaterEqual, greaterEqualSlice[int16])
   205  		testInt32x16Compare(t, archsimd.Int32x16.GreaterEqual, greaterEqualSlice[int32])
   206  		testInt64x8Compare(t, archsimd.Int64x8.GreaterEqual, greaterEqualSlice[int64])
   207  		testUint8x64Compare(t, archsimd.Uint8x64.GreaterEqual, greaterEqualSlice[uint8])
   208  		testUint16x32Compare(t, archsimd.Uint16x32.GreaterEqual, greaterEqualSlice[uint16])
   209  		testUint32x16Compare(t, archsimd.Uint32x16.GreaterEqual, greaterEqualSlice[uint32])
   210  		testUint64x8Compare(t, archsimd.Uint64x8.GreaterEqual, greaterEqualSlice[uint64])
   211  	}
   212  }
   213  
   214  func TestEqual(t *testing.T) {
   215  	testFloat32x4Compare(t, archsimd.Float32x4.Equal, equalSlice[float32])
   216  	testFloat32x8Compare(t, archsimd.Float32x8.Equal, equalSlice[float32])
   217  	testFloat64x2Compare(t, archsimd.Float64x2.Equal, equalSlice[float64])
   218  	testFloat64x4Compare(t, archsimd.Float64x4.Equal, equalSlice[float64])
   219  
   220  	testInt16x8Compare(t, archsimd.Int16x8.Equal, equalSlice[int16])
   221  	testInt32x4Compare(t, archsimd.Int32x4.Equal, equalSlice[int32])
   222  	testInt64x2Compare(t, archsimd.Int64x2.Equal, equalSlice[int64])
   223  	testInt8x16Compare(t, archsimd.Int8x16.Equal, equalSlice[int8])
   224  
   225  	if archsimd.X86.AVX2() {
   226  		testInt16x16Compare(t, archsimd.Int16x16.Equal, equalSlice[int16])
   227  		testInt32x8Compare(t, archsimd.Int32x8.Equal, equalSlice[int32])
   228  		testInt64x4Compare(t, archsimd.Int64x4.Equal, equalSlice[int64])
   229  		testInt8x32Compare(t, archsimd.Int8x32.Equal, equalSlice[int8])
   230  	}
   231  
   232  	testUint16x8Compare(t, archsimd.Uint16x8.Equal, equalSlice[uint16])
   233  	testUint32x4Compare(t, archsimd.Uint32x4.Equal, equalSlice[uint32])
   234  	testUint64x2Compare(t, archsimd.Uint64x2.Equal, equalSlice[uint64])
   235  	testUint8x16Compare(t, archsimd.Uint8x16.Equal, equalSlice[uint8])
   236  
   237  	if archsimd.X86.AVX2() {
   238  		testUint16x16Compare(t, archsimd.Uint16x16.Equal, equalSlice[uint16])
   239  		testUint32x8Compare(t, archsimd.Uint32x8.Equal, equalSlice[uint32])
   240  		testUint64x4Compare(t, archsimd.Uint64x4.Equal, equalSlice[uint64])
   241  		testUint8x32Compare(t, archsimd.Uint8x32.Equal, equalSlice[uint8])
   242  	}
   243  
   244  	if archsimd.X86.AVX512() {
   245  		testFloat32x16Compare(t, archsimd.Float32x16.Equal, equalSlice[float32])
   246  		testFloat64x8Compare(t, archsimd.Float64x8.Equal, equalSlice[float64])
   247  		testInt8x64Compare(t, archsimd.Int8x64.Equal, equalSlice[int8])
   248  		testInt16x32Compare(t, archsimd.Int16x32.Equal, equalSlice[int16])
   249  		testInt32x16Compare(t, archsimd.Int32x16.Equal, equalSlice[int32])
   250  		testInt64x8Compare(t, archsimd.Int64x8.Equal, equalSlice[int64])
   251  		testUint8x64Compare(t, archsimd.Uint8x64.Equal, equalSlice[uint8])
   252  		testUint16x32Compare(t, archsimd.Uint16x32.Equal, equalSlice[uint16])
   253  		testUint32x16Compare(t, archsimd.Uint32x16.Equal, equalSlice[uint32])
   254  		testUint64x8Compare(t, archsimd.Uint64x8.Equal, equalSlice[uint64])
   255  	}
   256  }
   257  
   258  func TestNotEqual(t *testing.T) {
   259  	testFloat32x4Compare(t, archsimd.Float32x4.NotEqual, notEqualSlice[float32])
   260  	testFloat32x8Compare(t, archsimd.Float32x8.NotEqual, notEqualSlice[float32])
   261  	testFloat64x2Compare(t, archsimd.Float64x2.NotEqual, notEqualSlice[float64])
   262  	testFloat64x4Compare(t, archsimd.Float64x4.NotEqual, notEqualSlice[float64])
   263  
   264  	testInt16x8Compare(t, archsimd.Int16x8.NotEqual, notEqualSlice[int16])
   265  	testInt32x4Compare(t, archsimd.Int32x4.NotEqual, notEqualSlice[int32])
   266  	testInt64x2Compare(t, archsimd.Int64x2.NotEqual, notEqualSlice[int64])
   267  	testInt8x16Compare(t, archsimd.Int8x16.NotEqual, notEqualSlice[int8])
   268  
   269  	if archsimd.X86.AVX2() {
   270  		testInt16x16Compare(t, archsimd.Int16x16.NotEqual, notEqualSlice[int16])
   271  		testInt32x8Compare(t, archsimd.Int32x8.NotEqual, notEqualSlice[int32])
   272  		testInt64x4Compare(t, archsimd.Int64x4.NotEqual, notEqualSlice[int64])
   273  		testInt8x32Compare(t, archsimd.Int8x32.NotEqual, notEqualSlice[int8])
   274  	}
   275  
   276  	testUint16x8Compare(t, archsimd.Uint16x8.NotEqual, notEqualSlice[uint16])
   277  	testUint32x4Compare(t, archsimd.Uint32x4.NotEqual, notEqualSlice[uint32])
   278  	testUint64x2Compare(t, archsimd.Uint64x2.NotEqual, notEqualSlice[uint64])
   279  	testUint8x16Compare(t, archsimd.Uint8x16.NotEqual, notEqualSlice[uint8])
   280  
   281  	if archsimd.X86.AVX2() {
   282  		testUint16x16Compare(t, archsimd.Uint16x16.NotEqual, notEqualSlice[uint16])
   283  		testUint32x8Compare(t, archsimd.Uint32x8.NotEqual, notEqualSlice[uint32])
   284  		testUint64x4Compare(t, archsimd.Uint64x4.NotEqual, notEqualSlice[uint64])
   285  		testUint8x32Compare(t, archsimd.Uint8x32.NotEqual, notEqualSlice[uint8])
   286  	}
   287  
   288  	if archsimd.X86.AVX512() {
   289  		testFloat32x16Compare(t, archsimd.Float32x16.NotEqual, notEqualSlice[float32])
   290  		testFloat64x8Compare(t, archsimd.Float64x8.NotEqual, notEqualSlice[float64])
   291  		testInt8x64Compare(t, archsimd.Int8x64.NotEqual, notEqualSlice[int8])
   292  		testInt16x32Compare(t, archsimd.Int16x32.NotEqual, notEqualSlice[int16])
   293  		testInt32x16Compare(t, archsimd.Int32x16.NotEqual, notEqualSlice[int32])
   294  		testInt64x8Compare(t, archsimd.Int64x8.NotEqual, notEqualSlice[int64])
   295  		testUint8x64Compare(t, archsimd.Uint8x64.NotEqual, notEqualSlice[uint8])
   296  		testUint16x32Compare(t, archsimd.Uint16x32.NotEqual, notEqualSlice[uint16])
   297  		testUint32x16Compare(t, archsimd.Uint32x16.NotEqual, notEqualSlice[uint32])
   298  		testUint64x8Compare(t, archsimd.Uint64x8.NotEqual, notEqualSlice[uint64])
   299  	}
   300  }
   301  
   302  func TestIsNaN(t *testing.T) {
   303  	testFloat32x4UnaryCompare(t, archsimd.Float32x4.IsNaN, isNaNSlice[float32])
   304  	testFloat32x8UnaryCompare(t, archsimd.Float32x8.IsNaN, isNaNSlice[float32])
   305  	testFloat64x2UnaryCompare(t, archsimd.Float64x2.IsNaN, isNaNSlice[float64])
   306  	testFloat64x4UnaryCompare(t, archsimd.Float64x4.IsNaN, isNaNSlice[float64])
   307  
   308  	if archsimd.X86.AVX512() {
   309  		testFloat32x16UnaryCompare(t, archsimd.Float32x16.IsNaN, isNaNSlice[float32])
   310  		testFloat64x8UnaryCompare(t, archsimd.Float64x8.IsNaN, isNaNSlice[float64])
   311  	}
   312  
   313  	// Test x.IsNaN().Or(y.IsNaN()), which is optimized to VCMPP(S|D) $3, x, y.
   314  	want32 := mapCompare(func(x, y float32) bool { return x != x || y != y })
   315  	want64 := mapCompare(func(x, y float64) bool { return x != x || y != y })
   316  	testFloat32x4Compare(t,
   317  		func(x, y archsimd.Float32x4) archsimd.Mask32x4 {
   318  			return x.IsNaN().Or(y.IsNaN())
   319  		}, want32)
   320  	testFloat64x2Compare(t,
   321  		func(x, y archsimd.Float64x2) archsimd.Mask64x2 {
   322  			return x.IsNaN().Or(y.IsNaN())
   323  		}, want64)
   324  
   325  	if archsimd.X86.AVX2() {
   326  		testFloat32x8Compare(t,
   327  			func(x, y archsimd.Float32x8) archsimd.Mask32x8 {
   328  				return x.IsNaN().Or(y.IsNaN())
   329  			}, want32)
   330  		testFloat64x4Compare(t,
   331  			func(x, y archsimd.Float64x4) archsimd.Mask64x4 {
   332  				return x.IsNaN().Or(y.IsNaN())
   333  			}, want64)
   334  	}
   335  
   336  	if archsimd.X86.AVX512() {
   337  		testFloat32x16Compare(t,
   338  			func(x, y archsimd.Float32x16) archsimd.Mask32x16 {
   339  				return x.IsNaN().Or(y.IsNaN())
   340  			}, want32)
   341  		testFloat64x8Compare(t,
   342  			func(x, y archsimd.Float64x8) archsimd.Mask64x8 {
   343  				return x.IsNaN().Or(y.IsNaN())
   344  			}, want64)
   345  	}
   346  }
   347  

View as plain text