Source file src/simd/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"
    11  	"testing"
    12  )
    13  
    14  // AVX 2 lacks most comparisons, but they can be synthesized
    15  // from > and =
    16  var comparisonFixed bool = simd.X86.AVX512()
    17  
    18  func TestLess(t *testing.T) {
    19  	testFloat32x4Compare(t, simd.Float32x4.Less, lessSlice[float32])
    20  	testFloat32x8Compare(t, simd.Float32x8.Less, lessSlice[float32])
    21  	testFloat64x2Compare(t, simd.Float64x2.Less, lessSlice[float64])
    22  	testFloat64x4Compare(t, simd.Float64x4.Less, lessSlice[float64])
    23  
    24  	testInt16x16Compare(t, simd.Int16x16.Less, lessSlice[int16])
    25  	testInt16x8Compare(t, simd.Int16x8.Less, lessSlice[int16])
    26  	testInt32x4Compare(t, simd.Int32x4.Less, lessSlice[int32])
    27  	testInt32x8Compare(t, simd.Int32x8.Less, lessSlice[int32])
    28  	testInt64x2Compare(t, simd.Int64x2.Less, lessSlice[int64])
    29  	testInt64x4Compare(t, simd.Int64x4.Less, lessSlice[int64])
    30  	testInt8x16Compare(t, simd.Int8x16.Less, lessSlice[int8])
    31  	testInt8x32Compare(t, simd.Int8x32.Less, lessSlice[int8])
    32  
    33  	testInt16x16Compare(t, simd.Int16x16.Less, lessSlice[int16])
    34  	testInt16x8Compare(t, simd.Int16x8.Less, lessSlice[int16])
    35  	testInt32x4Compare(t, simd.Int32x4.Less, lessSlice[int32])
    36  	testInt32x8Compare(t, simd.Int32x8.Less, lessSlice[int32])
    37  	testInt64x2Compare(t, simd.Int64x2.Less, lessSlice[int64])
    38  	testInt64x4Compare(t, simd.Int64x4.Less, lessSlice[int64])
    39  	testInt8x16Compare(t, simd.Int8x16.Less, lessSlice[int8])
    40  	testInt8x32Compare(t, simd.Int8x32.Less, lessSlice[int8])
    41  
    42  	testUint16x16Compare(t, simd.Uint16x16.Less, lessSlice[uint16])
    43  	testUint16x8Compare(t, simd.Uint16x8.Less, lessSlice[uint16])
    44  	testUint32x4Compare(t, simd.Uint32x4.Less, lessSlice[uint32])
    45  	testUint32x8Compare(t, simd.Uint32x8.Less, lessSlice[uint32])
    46  	testUint64x2Compare(t, simd.Uint64x2.Less, lessSlice[uint64])
    47  	testUint64x4Compare(t, simd.Uint64x4.Less, lessSlice[uint64])
    48  	testUint8x16Compare(t, simd.Uint8x16.Less, lessSlice[uint8])
    49  	testUint8x32Compare(t, simd.Uint8x32.Less, lessSlice[uint8])
    50  
    51  	if simd.X86.AVX512() {
    52  		testUint16x16Compare(t, simd.Uint16x16.Less, lessSlice[uint16])
    53  		testUint16x8Compare(t, simd.Uint16x8.Less, lessSlice[uint16])
    54  		testUint32x4Compare(t, simd.Uint32x4.Less, lessSlice[uint32])
    55  		testUint32x8Compare(t, simd.Uint32x8.Less, lessSlice[uint32])
    56  		testUint64x2Compare(t, simd.Uint64x2.Less, lessSlice[uint64])
    57  		testUint64x4Compare(t, simd.Uint64x4.Less, lessSlice[uint64])
    58  		testUint8x16Compare(t, simd.Uint8x16.Less, lessSlice[uint8])
    59  		testUint8x32Compare(t, simd.Uint8x32.Less, lessSlice[uint8])
    60  
    61  		testFloat32x16Compare(t, simd.Float32x16.Less, lessSlice[float32])
    62  		testFloat64x8Compare(t, simd.Float64x8.Less, lessSlice[float64])
    63  		testInt8x64Compare(t, simd.Int8x64.Less, lessSlice[int8])
    64  		testInt16x32Compare(t, simd.Int16x32.Less, lessSlice[int16])
    65  		testInt32x16Compare(t, simd.Int32x16.Less, lessSlice[int32])
    66  		testInt64x8Compare(t, simd.Int64x8.Less, lessSlice[int64])
    67  		testUint8x64Compare(t, simd.Uint8x64.Less, lessSlice[uint8])
    68  		testUint16x32Compare(t, simd.Uint16x32.Less, lessSlice[uint16])
    69  		testUint32x16Compare(t, simd.Uint32x16.Less, lessSlice[uint32])
    70  		testUint64x8Compare(t, simd.Uint64x8.Less, lessSlice[uint64])
    71  	}
    72  }
    73  
    74  func TestLessEqual(t *testing.T) {
    75  	testFloat32x4Compare(t, simd.Float32x4.LessEqual, lessEqualSlice[float32])
    76  	testFloat32x8Compare(t, simd.Float32x8.LessEqual, lessEqualSlice[float32])
    77  	testFloat64x2Compare(t, simd.Float64x2.LessEqual, lessEqualSlice[float64])
    78  	testFloat64x4Compare(t, simd.Float64x4.LessEqual, lessEqualSlice[float64])
    79  
    80  	testInt16x16Compare(t, simd.Int16x16.LessEqual, lessEqualSlice[int16])
    81  	testInt16x8Compare(t, simd.Int16x8.LessEqual, lessEqualSlice[int16])
    82  	testInt32x4Compare(t, simd.Int32x4.LessEqual, lessEqualSlice[int32])
    83  	testInt32x8Compare(t, simd.Int32x8.LessEqual, lessEqualSlice[int32])
    84  	testInt64x2Compare(t, simd.Int64x2.LessEqual, lessEqualSlice[int64])
    85  	testInt64x4Compare(t, simd.Int64x4.LessEqual, lessEqualSlice[int64])
    86  	testInt8x16Compare(t, simd.Int8x16.LessEqual, lessEqualSlice[int8])
    87  	testInt8x32Compare(t, simd.Int8x32.LessEqual, lessEqualSlice[int8])
    88  
    89  	testUint16x16Compare(t, simd.Uint16x16.LessEqual, lessEqualSlice[uint16])
    90  	testUint16x8Compare(t, simd.Uint16x8.LessEqual, lessEqualSlice[uint16])
    91  	testUint32x4Compare(t, simd.Uint32x4.LessEqual, lessEqualSlice[uint32])
    92  	testUint32x8Compare(t, simd.Uint32x8.LessEqual, lessEqualSlice[uint32])
    93  	testUint64x2Compare(t, simd.Uint64x2.LessEqual, lessEqualSlice[uint64])
    94  	testUint64x4Compare(t, simd.Uint64x4.LessEqual, lessEqualSlice[uint64])
    95  	testUint8x16Compare(t, simd.Uint8x16.LessEqual, lessEqualSlice[uint8])
    96  	testUint8x32Compare(t, simd.Uint8x32.LessEqual, lessEqualSlice[uint8])
    97  
    98  	if simd.X86.AVX512() {
    99  		testFloat32x16Compare(t, simd.Float32x16.LessEqual, lessEqualSlice[float32])
   100  		testFloat64x8Compare(t, simd.Float64x8.LessEqual, lessEqualSlice[float64])
   101  		testInt8x64Compare(t, simd.Int8x64.LessEqual, lessEqualSlice[int8])
   102  		testInt16x32Compare(t, simd.Int16x32.LessEqual, lessEqualSlice[int16])
   103  		testInt32x16Compare(t, simd.Int32x16.LessEqual, lessEqualSlice[int32])
   104  		testInt64x8Compare(t, simd.Int64x8.LessEqual, lessEqualSlice[int64])
   105  		testUint8x64Compare(t, simd.Uint8x64.LessEqual, lessEqualSlice[uint8])
   106  		testUint16x32Compare(t, simd.Uint16x32.LessEqual, lessEqualSlice[uint16])
   107  		testUint32x16Compare(t, simd.Uint32x16.LessEqual, lessEqualSlice[uint32])
   108  		testUint64x8Compare(t, simd.Uint64x8.LessEqual, lessEqualSlice[uint64])
   109  	}
   110  }
   111  
   112  func TestGreater(t *testing.T) {
   113  	testFloat32x4Compare(t, simd.Float32x4.Greater, greaterSlice[float32])
   114  	testFloat32x8Compare(t, simd.Float32x8.Greater, greaterSlice[float32])
   115  	testFloat64x2Compare(t, simd.Float64x2.Greater, greaterSlice[float64])
   116  	testFloat64x4Compare(t, simd.Float64x4.Greater, greaterSlice[float64])
   117  
   118  	testInt16x16Compare(t, simd.Int16x16.Greater, greaterSlice[int16])
   119  	testInt16x8Compare(t, simd.Int16x8.Greater, greaterSlice[int16])
   120  	testInt32x4Compare(t, simd.Int32x4.Greater, greaterSlice[int32])
   121  	testInt32x8Compare(t, simd.Int32x8.Greater, greaterSlice[int32])
   122  
   123  	testInt64x2Compare(t, simd.Int64x2.Greater, greaterSlice[int64])
   124  	testInt64x4Compare(t, simd.Int64x4.Greater, greaterSlice[int64])
   125  	testInt8x16Compare(t, simd.Int8x16.Greater, greaterSlice[int8])
   126  	testInt8x32Compare(t, simd.Int8x32.Greater, greaterSlice[int8])
   127  
   128  	testUint16x16Compare(t, simd.Uint16x16.Greater, greaterSlice[uint16])
   129  	testUint16x8Compare(t, simd.Uint16x8.Greater, greaterSlice[uint16])
   130  	testUint32x4Compare(t, simd.Uint32x4.Greater, greaterSlice[uint32])
   131  	testUint32x8Compare(t, simd.Uint32x8.Greater, greaterSlice[uint32])
   132  
   133  	testUint64x2Compare(t, simd.Uint64x2.Greater, greaterSlice[uint64])
   134  	testUint64x4Compare(t, simd.Uint64x4.Greater, greaterSlice[uint64])
   135  	testUint8x16Compare(t, simd.Uint8x16.Greater, greaterSlice[uint8])
   136  	testUint8x32Compare(t, simd.Uint8x32.Greater, greaterSlice[uint8])
   137  
   138  	if simd.X86.AVX512() {
   139  
   140  		testFloat32x16Compare(t, simd.Float32x16.Greater, greaterSlice[float32])
   141  		testFloat64x8Compare(t, simd.Float64x8.Greater, greaterSlice[float64])
   142  		testInt8x64Compare(t, simd.Int8x64.Greater, greaterSlice[int8])
   143  		testInt16x32Compare(t, simd.Int16x32.Greater, greaterSlice[int16])
   144  		testInt32x16Compare(t, simd.Int32x16.Greater, greaterSlice[int32])
   145  		testInt64x8Compare(t, simd.Int64x8.Greater, greaterSlice[int64])
   146  		testUint8x64Compare(t, simd.Uint8x64.Greater, greaterSlice[uint8])
   147  		testUint16x32Compare(t, simd.Uint16x32.Greater, greaterSlice[uint16])
   148  		testUint32x16Compare(t, simd.Uint32x16.Greater, greaterSlice[uint32])
   149  		testUint64x8Compare(t, simd.Uint64x8.Greater, greaterSlice[uint64])
   150  	}
   151  }
   152  
   153  func TestGreaterEqual(t *testing.T) {
   154  	testFloat32x4Compare(t, simd.Float32x4.GreaterEqual, greaterEqualSlice[float32])
   155  	testFloat32x8Compare(t, simd.Float32x8.GreaterEqual, greaterEqualSlice[float32])
   156  	testFloat64x2Compare(t, simd.Float64x2.GreaterEqual, greaterEqualSlice[float64])
   157  	testFloat64x4Compare(t, simd.Float64x4.GreaterEqual, greaterEqualSlice[float64])
   158  
   159  	testInt16x16Compare(t, simd.Int16x16.GreaterEqual, greaterEqualSlice[int16])
   160  	testInt16x8Compare(t, simd.Int16x8.GreaterEqual, greaterEqualSlice[int16])
   161  	testInt32x4Compare(t, simd.Int32x4.GreaterEqual, greaterEqualSlice[int32])
   162  	testInt32x8Compare(t, simd.Int32x8.GreaterEqual, greaterEqualSlice[int32])
   163  	testInt64x2Compare(t, simd.Int64x2.GreaterEqual, greaterEqualSlice[int64])
   164  	testInt64x4Compare(t, simd.Int64x4.GreaterEqual, greaterEqualSlice[int64])
   165  	testInt8x16Compare(t, simd.Int8x16.GreaterEqual, greaterEqualSlice[int8])
   166  	testInt8x32Compare(t, simd.Int8x32.GreaterEqual, greaterEqualSlice[int8])
   167  
   168  	testUint16x16Compare(t, simd.Uint16x16.GreaterEqual, greaterEqualSlice[uint16])
   169  	testUint16x8Compare(t, simd.Uint16x8.GreaterEqual, greaterEqualSlice[uint16])
   170  	testUint32x4Compare(t, simd.Uint32x4.GreaterEqual, greaterEqualSlice[uint32])
   171  	testUint32x8Compare(t, simd.Uint32x8.GreaterEqual, greaterEqualSlice[uint32])
   172  	testUint64x2Compare(t, simd.Uint64x2.GreaterEqual, greaterEqualSlice[uint64])
   173  	testUint64x4Compare(t, simd.Uint64x4.GreaterEqual, greaterEqualSlice[uint64])
   174  	testUint8x16Compare(t, simd.Uint8x16.GreaterEqual, greaterEqualSlice[uint8])
   175  	testUint8x32Compare(t, simd.Uint8x32.GreaterEqual, greaterEqualSlice[uint8])
   176  
   177  	if simd.X86.AVX512() {
   178  		testFloat32x16Compare(t, simd.Float32x16.GreaterEqual, greaterEqualSlice[float32])
   179  		testFloat64x8Compare(t, simd.Float64x8.GreaterEqual, greaterEqualSlice[float64])
   180  		testInt8x64Compare(t, simd.Int8x64.GreaterEqual, greaterEqualSlice[int8])
   181  		testInt16x32Compare(t, simd.Int16x32.GreaterEqual, greaterEqualSlice[int16])
   182  		testInt32x16Compare(t, simd.Int32x16.GreaterEqual, greaterEqualSlice[int32])
   183  		testInt64x8Compare(t, simd.Int64x8.GreaterEqual, greaterEqualSlice[int64])
   184  		testUint8x64Compare(t, simd.Uint8x64.GreaterEqual, greaterEqualSlice[uint8])
   185  		testUint16x32Compare(t, simd.Uint16x32.GreaterEqual, greaterEqualSlice[uint16])
   186  		testUint32x16Compare(t, simd.Uint32x16.GreaterEqual, greaterEqualSlice[uint32])
   187  		testUint64x8Compare(t, simd.Uint64x8.GreaterEqual, greaterEqualSlice[uint64])
   188  	}
   189  }
   190  
   191  func TestEqual(t *testing.T) {
   192  	testFloat32x4Compare(t, simd.Float32x4.Equal, equalSlice[float32])
   193  	testFloat32x8Compare(t, simd.Float32x8.Equal, equalSlice[float32])
   194  	testFloat64x2Compare(t, simd.Float64x2.Equal, equalSlice[float64])
   195  	testFloat64x4Compare(t, simd.Float64x4.Equal, equalSlice[float64])
   196  
   197  	testInt16x16Compare(t, simd.Int16x16.Equal, equalSlice[int16])
   198  	testInt16x8Compare(t, simd.Int16x8.Equal, equalSlice[int16])
   199  	testInt32x4Compare(t, simd.Int32x4.Equal, equalSlice[int32])
   200  	testInt32x8Compare(t, simd.Int32x8.Equal, equalSlice[int32])
   201  	testInt64x2Compare(t, simd.Int64x2.Equal, equalSlice[int64])
   202  	testInt64x4Compare(t, simd.Int64x4.Equal, equalSlice[int64])
   203  	testInt8x16Compare(t, simd.Int8x16.Equal, equalSlice[int8])
   204  	testInt8x32Compare(t, simd.Int8x32.Equal, equalSlice[int8])
   205  
   206  	testUint16x16Compare(t, simd.Uint16x16.Equal, equalSlice[uint16])
   207  	testUint16x8Compare(t, simd.Uint16x8.Equal, equalSlice[uint16])
   208  	testUint32x4Compare(t, simd.Uint32x4.Equal, equalSlice[uint32])
   209  	testUint32x8Compare(t, simd.Uint32x8.Equal, equalSlice[uint32])
   210  	testUint64x2Compare(t, simd.Uint64x2.Equal, equalSlice[uint64])
   211  	testUint64x4Compare(t, simd.Uint64x4.Equal, equalSlice[uint64])
   212  	testUint8x16Compare(t, simd.Uint8x16.Equal, equalSlice[uint8])
   213  	testUint8x32Compare(t, simd.Uint8x32.Equal, equalSlice[uint8])
   214  
   215  	if simd.X86.AVX512() {
   216  		testFloat32x16Compare(t, simd.Float32x16.Equal, equalSlice[float32])
   217  		testFloat64x8Compare(t, simd.Float64x8.Equal, equalSlice[float64])
   218  		testInt8x64Compare(t, simd.Int8x64.Equal, equalSlice[int8])
   219  		testInt16x32Compare(t, simd.Int16x32.Equal, equalSlice[int16])
   220  		testInt32x16Compare(t, simd.Int32x16.Equal, equalSlice[int32])
   221  		testInt64x8Compare(t, simd.Int64x8.Equal, equalSlice[int64])
   222  		testUint8x64Compare(t, simd.Uint8x64.Equal, equalSlice[uint8])
   223  		testUint16x32Compare(t, simd.Uint16x32.Equal, equalSlice[uint16])
   224  		testUint32x16Compare(t, simd.Uint32x16.Equal, equalSlice[uint32])
   225  		testUint64x8Compare(t, simd.Uint64x8.Equal, equalSlice[uint64])
   226  	}
   227  }
   228  
   229  func TestNotEqual(t *testing.T) {
   230  	testFloat32x4Compare(t, simd.Float32x4.NotEqual, notEqualSlice[float32])
   231  	testFloat32x8Compare(t, simd.Float32x8.NotEqual, notEqualSlice[float32])
   232  	testFloat64x2Compare(t, simd.Float64x2.NotEqual, notEqualSlice[float64])
   233  	testFloat64x4Compare(t, simd.Float64x4.NotEqual, notEqualSlice[float64])
   234  
   235  	testInt16x16Compare(t, simd.Int16x16.NotEqual, notEqualSlice[int16])
   236  	testInt16x8Compare(t, simd.Int16x8.NotEqual, notEqualSlice[int16])
   237  	testInt32x4Compare(t, simd.Int32x4.NotEqual, notEqualSlice[int32])
   238  	testInt32x8Compare(t, simd.Int32x8.NotEqual, notEqualSlice[int32])
   239  	testInt64x2Compare(t, simd.Int64x2.NotEqual, notEqualSlice[int64])
   240  	testInt64x4Compare(t, simd.Int64x4.NotEqual, notEqualSlice[int64])
   241  	testInt8x16Compare(t, simd.Int8x16.NotEqual, notEqualSlice[int8])
   242  	testInt8x32Compare(t, simd.Int8x32.NotEqual, notEqualSlice[int8])
   243  
   244  	testUint16x16Compare(t, simd.Uint16x16.NotEqual, notEqualSlice[uint16])
   245  	testUint16x8Compare(t, simd.Uint16x8.NotEqual, notEqualSlice[uint16])
   246  	testUint32x4Compare(t, simd.Uint32x4.NotEqual, notEqualSlice[uint32])
   247  	testUint32x8Compare(t, simd.Uint32x8.NotEqual, notEqualSlice[uint32])
   248  	testUint64x2Compare(t, simd.Uint64x2.NotEqual, notEqualSlice[uint64])
   249  	testUint64x4Compare(t, simd.Uint64x4.NotEqual, notEqualSlice[uint64])
   250  	testUint8x16Compare(t, simd.Uint8x16.NotEqual, notEqualSlice[uint8])
   251  	testUint8x32Compare(t, simd.Uint8x32.NotEqual, notEqualSlice[uint8])
   252  
   253  	if simd.X86.AVX512() {
   254  		testFloat32x16Compare(t, simd.Float32x16.NotEqual, notEqualSlice[float32])
   255  		testFloat64x8Compare(t, simd.Float64x8.NotEqual, notEqualSlice[float64])
   256  		testInt8x64Compare(t, simd.Int8x64.NotEqual, notEqualSlice[int8])
   257  		testInt16x32Compare(t, simd.Int16x32.NotEqual, notEqualSlice[int16])
   258  		testInt32x16Compare(t, simd.Int32x16.NotEqual, notEqualSlice[int32])
   259  		testInt64x8Compare(t, simd.Int64x8.NotEqual, notEqualSlice[int64])
   260  		testUint8x64Compare(t, simd.Uint8x64.NotEqual, notEqualSlice[uint8])
   261  		testUint16x32Compare(t, simd.Uint16x32.NotEqual, notEqualSlice[uint16])
   262  		testUint32x16Compare(t, simd.Uint32x16.NotEqual, notEqualSlice[uint32])
   263  		testUint64x8Compare(t, simd.Uint64x8.NotEqual, notEqualSlice[uint64])
   264  	}
   265  }
   266  

View as plain text