Source file src/simd/archsimd/internal/simd_test/compare_amd64_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  func TestLessAMD64(t *testing.T) {
    15  	testFloat32x8Compare(t, archsimd.Float32x8.Less, lessSlice[float32])
    16  	testFloat64x4Compare(t, archsimd.Float64x4.Less, lessSlice[float64])
    17  
    18  	if archsimd.X86.AVX2() {
    19  		testInt16x16Compare(t, archsimd.Int16x16.Less, lessSlice[int16])
    20  		testInt32x8Compare(t, archsimd.Int32x8.Less, lessSlice[int32])
    21  		testInt64x4Compare(t, archsimd.Int64x4.Less, lessSlice[int64])
    22  		testInt8x32Compare(t, archsimd.Int8x32.Less, lessSlice[int8])
    23  
    24  		testUint16x16Compare(t, archsimd.Uint16x16.Less, lessSlice[uint16])
    25  		testUint32x8Compare(t, archsimd.Uint32x8.Less, lessSlice[uint32])
    26  		testUint64x4Compare(t, archsimd.Uint64x4.Less, lessSlice[uint64])
    27  		testUint8x32Compare(t, archsimd.Uint8x32.Less, lessSlice[uint8])
    28  	}
    29  
    30  	if archsimd.X86.AVX512() {
    31  		testUint16x16Compare(t, archsimd.Uint16x16.Less, lessSlice[uint16])
    32  		testUint16x8Compare(t, archsimd.Uint16x8.Less, lessSlice[uint16])
    33  		testUint32x4Compare(t, archsimd.Uint32x4.Less, lessSlice[uint32])
    34  		testUint32x8Compare(t, archsimd.Uint32x8.Less, lessSlice[uint32])
    35  		testUint64x2Compare(t, archsimd.Uint64x2.Less, lessSlice[uint64])
    36  		testUint64x4Compare(t, archsimd.Uint64x4.Less, lessSlice[uint64])
    37  		testUint8x16Compare(t, archsimd.Uint8x16.Less, lessSlice[uint8])
    38  		testUint8x32Compare(t, archsimd.Uint8x32.Less, lessSlice[uint8])
    39  
    40  		testFloat32x16Compare(t, archsimd.Float32x16.Less, lessSlice[float32])
    41  		testFloat64x8Compare(t, archsimd.Float64x8.Less, lessSlice[float64])
    42  		testInt8x64Compare(t, archsimd.Int8x64.Less, lessSlice[int8])
    43  		testInt16x32Compare(t, archsimd.Int16x32.Less, lessSlice[int16])
    44  		testInt32x16Compare(t, archsimd.Int32x16.Less, lessSlice[int32])
    45  		testInt64x8Compare(t, archsimd.Int64x8.Less, lessSlice[int64])
    46  		testUint8x64Compare(t, archsimd.Uint8x64.Less, lessSlice[uint8])
    47  		testUint16x32Compare(t, archsimd.Uint16x32.Less, lessSlice[uint16])
    48  		testUint32x16Compare(t, archsimd.Uint32x16.Less, lessSlice[uint32])
    49  		testUint64x8Compare(t, archsimd.Uint64x8.Less, lessSlice[uint64])
    50  	}
    51  }
    52  
    53  func TestLessEqualAMD64(t *testing.T) {
    54  	testFloat32x8Compare(t, archsimd.Float32x8.LessEqual, lessEqualSlice[float32])
    55  	testFloat64x4Compare(t, archsimd.Float64x4.LessEqual, lessEqualSlice[float64])
    56  
    57  	if archsimd.X86.AVX2() {
    58  		testInt16x16Compare(t, archsimd.Int16x16.LessEqual, lessEqualSlice[int16])
    59  		testInt32x8Compare(t, archsimd.Int32x8.LessEqual, lessEqualSlice[int32])
    60  		testInt64x4Compare(t, archsimd.Int64x4.LessEqual, lessEqualSlice[int64])
    61  		testInt8x32Compare(t, archsimd.Int8x32.LessEqual, lessEqualSlice[int8])
    62  
    63  		testUint16x16Compare(t, archsimd.Uint16x16.LessEqual, lessEqualSlice[uint16])
    64  		testUint32x8Compare(t, archsimd.Uint32x8.LessEqual, lessEqualSlice[uint32])
    65  		testUint64x4Compare(t, archsimd.Uint64x4.LessEqual, lessEqualSlice[uint64])
    66  		testUint8x32Compare(t, archsimd.Uint8x32.LessEqual, lessEqualSlice[uint8])
    67  	}
    68  
    69  	if archsimd.X86.AVX512() {
    70  		testFloat32x16Compare(t, archsimd.Float32x16.LessEqual, lessEqualSlice[float32])
    71  		testFloat64x8Compare(t, archsimd.Float64x8.LessEqual, lessEqualSlice[float64])
    72  		testInt8x64Compare(t, archsimd.Int8x64.LessEqual, lessEqualSlice[int8])
    73  		testInt16x32Compare(t, archsimd.Int16x32.LessEqual, lessEqualSlice[int16])
    74  		testInt32x16Compare(t, archsimd.Int32x16.LessEqual, lessEqualSlice[int32])
    75  		testInt64x8Compare(t, archsimd.Int64x8.LessEqual, lessEqualSlice[int64])
    76  		testUint8x64Compare(t, archsimd.Uint8x64.LessEqual, lessEqualSlice[uint8])
    77  		testUint16x32Compare(t, archsimd.Uint16x32.LessEqual, lessEqualSlice[uint16])
    78  		testUint32x16Compare(t, archsimd.Uint32x16.LessEqual, lessEqualSlice[uint32])
    79  		testUint64x8Compare(t, archsimd.Uint64x8.LessEqual, lessEqualSlice[uint64])
    80  	}
    81  }
    82  
    83  func TestGreaterAMD64(t *testing.T) {
    84  	testFloat32x8Compare(t, archsimd.Float32x8.Greater, greaterSlice[float32])
    85  	testFloat64x4Compare(t, archsimd.Float64x4.Greater, greaterSlice[float64])
    86  
    87  	if archsimd.X86.AVX2() {
    88  		testInt16x16Compare(t, archsimd.Int16x16.Greater, greaterSlice[int16])
    89  		testInt32x8Compare(t, archsimd.Int32x8.Greater, greaterSlice[int32])
    90  		testInt64x4Compare(t, archsimd.Int64x4.Greater, greaterSlice[int64])
    91  		testInt8x32Compare(t, archsimd.Int8x32.Greater, greaterSlice[int8])
    92  
    93  		testUint16x16Compare(t, archsimd.Uint16x16.Greater, greaterSlice[uint16])
    94  		testUint32x8Compare(t, archsimd.Uint32x8.Greater, greaterSlice[uint32])
    95  		testUint64x4Compare(t, archsimd.Uint64x4.Greater, greaterSlice[uint64])
    96  		testUint8x32Compare(t, archsimd.Uint8x32.Greater, greaterSlice[uint8])
    97  	}
    98  
    99  	if archsimd.X86.AVX512() {
   100  
   101  		testFloat32x16Compare(t, archsimd.Float32x16.Greater, greaterSlice[float32])
   102  		testFloat64x8Compare(t, archsimd.Float64x8.Greater, greaterSlice[float64])
   103  		testInt8x64Compare(t, archsimd.Int8x64.Greater, greaterSlice[int8])
   104  		testInt16x32Compare(t, archsimd.Int16x32.Greater, greaterSlice[int16])
   105  		testInt32x16Compare(t, archsimd.Int32x16.Greater, greaterSlice[int32])
   106  		testInt64x8Compare(t, archsimd.Int64x8.Greater, greaterSlice[int64])
   107  		testUint8x64Compare(t, archsimd.Uint8x64.Greater, greaterSlice[uint8])
   108  		testUint16x32Compare(t, archsimd.Uint16x32.Greater, greaterSlice[uint16])
   109  		testUint32x16Compare(t, archsimd.Uint32x16.Greater, greaterSlice[uint32])
   110  		testUint64x8Compare(t, archsimd.Uint64x8.Greater, greaterSlice[uint64])
   111  	}
   112  }
   113  
   114  func TestGreaterEqualAMD64(t *testing.T) {
   115  	testFloat32x8Compare(t, archsimd.Float32x8.GreaterEqual, greaterEqualSlice[float32])
   116  	testFloat64x4Compare(t, archsimd.Float64x4.GreaterEqual, greaterEqualSlice[float64])
   117  
   118  	if archsimd.X86.AVX2() {
   119  		testInt16x16Compare(t, archsimd.Int16x16.GreaterEqual, greaterEqualSlice[int16])
   120  		testInt32x8Compare(t, archsimd.Int32x8.GreaterEqual, greaterEqualSlice[int32])
   121  		testInt64x4Compare(t, archsimd.Int64x4.GreaterEqual, greaterEqualSlice[int64])
   122  		testInt8x32Compare(t, archsimd.Int8x32.GreaterEqual, greaterEqualSlice[int8])
   123  
   124  		testUint16x16Compare(t, archsimd.Uint16x16.GreaterEqual, greaterEqualSlice[uint16])
   125  		testUint32x8Compare(t, archsimd.Uint32x8.GreaterEqual, greaterEqualSlice[uint32])
   126  		testUint64x4Compare(t, archsimd.Uint64x4.GreaterEqual, greaterEqualSlice[uint64])
   127  		testUint8x32Compare(t, archsimd.Uint8x32.GreaterEqual, greaterEqualSlice[uint8])
   128  	}
   129  
   130  	if archsimd.X86.AVX512() {
   131  		testFloat32x16Compare(t, archsimd.Float32x16.GreaterEqual, greaterEqualSlice[float32])
   132  		testFloat64x8Compare(t, archsimd.Float64x8.GreaterEqual, greaterEqualSlice[float64])
   133  		testInt8x64Compare(t, archsimd.Int8x64.GreaterEqual, greaterEqualSlice[int8])
   134  		testInt16x32Compare(t, archsimd.Int16x32.GreaterEqual, greaterEqualSlice[int16])
   135  		testInt32x16Compare(t, archsimd.Int32x16.GreaterEqual, greaterEqualSlice[int32])
   136  		testInt64x8Compare(t, archsimd.Int64x8.GreaterEqual, greaterEqualSlice[int64])
   137  		testUint8x64Compare(t, archsimd.Uint8x64.GreaterEqual, greaterEqualSlice[uint8])
   138  		testUint16x32Compare(t, archsimd.Uint16x32.GreaterEqual, greaterEqualSlice[uint16])
   139  		testUint32x16Compare(t, archsimd.Uint32x16.GreaterEqual, greaterEqualSlice[uint32])
   140  		testUint64x8Compare(t, archsimd.Uint64x8.GreaterEqual, greaterEqualSlice[uint64])
   141  	}
   142  }
   143  
   144  func TestEqualAMD64(t *testing.T) {
   145  	testFloat32x8Compare(t, archsimd.Float32x8.Equal, equalSlice[float32])
   146  	testFloat64x4Compare(t, archsimd.Float64x4.Equal, equalSlice[float64])
   147  
   148  	if archsimd.X86.AVX2() {
   149  		testInt16x16Compare(t, archsimd.Int16x16.Equal, equalSlice[int16])
   150  		testInt32x8Compare(t, archsimd.Int32x8.Equal, equalSlice[int32])
   151  		testInt64x4Compare(t, archsimd.Int64x4.Equal, equalSlice[int64])
   152  		testInt8x32Compare(t, archsimd.Int8x32.Equal, equalSlice[int8])
   153  
   154  		testUint16x16Compare(t, archsimd.Uint16x16.Equal, equalSlice[uint16])
   155  		testUint32x8Compare(t, archsimd.Uint32x8.Equal, equalSlice[uint32])
   156  		testUint64x4Compare(t, archsimd.Uint64x4.Equal, equalSlice[uint64])
   157  		testUint8x32Compare(t, archsimd.Uint8x32.Equal, equalSlice[uint8])
   158  	}
   159  
   160  	if archsimd.X86.AVX512() {
   161  		testFloat32x16Compare(t, archsimd.Float32x16.Equal, equalSlice[float32])
   162  		testFloat64x8Compare(t, archsimd.Float64x8.Equal, equalSlice[float64])
   163  		testInt8x64Compare(t, archsimd.Int8x64.Equal, equalSlice[int8])
   164  		testInt16x32Compare(t, archsimd.Int16x32.Equal, equalSlice[int16])
   165  		testInt32x16Compare(t, archsimd.Int32x16.Equal, equalSlice[int32])
   166  		testInt64x8Compare(t, archsimd.Int64x8.Equal, equalSlice[int64])
   167  		testUint8x64Compare(t, archsimd.Uint8x64.Equal, equalSlice[uint8])
   168  		testUint16x32Compare(t, archsimd.Uint16x32.Equal, equalSlice[uint16])
   169  		testUint32x16Compare(t, archsimd.Uint32x16.Equal, equalSlice[uint32])
   170  		testUint64x8Compare(t, archsimd.Uint64x8.Equal, equalSlice[uint64])
   171  	}
   172  }
   173  
   174  func TestNotEqualAMD64(t *testing.T) {
   175  	testFloat32x8Compare(t, archsimd.Float32x8.NotEqual, notEqualSlice[float32])
   176  	testFloat64x4Compare(t, archsimd.Float64x4.NotEqual, notEqualSlice[float64])
   177  
   178  	if archsimd.X86.AVX2() {
   179  		testInt16x16Compare(t, archsimd.Int16x16.NotEqual, notEqualSlice[int16])
   180  		testInt32x8Compare(t, archsimd.Int32x8.NotEqual, notEqualSlice[int32])
   181  		testInt64x4Compare(t, archsimd.Int64x4.NotEqual, notEqualSlice[int64])
   182  		testInt8x32Compare(t, archsimd.Int8x32.NotEqual, notEqualSlice[int8])
   183  
   184  		testUint16x16Compare(t, archsimd.Uint16x16.NotEqual, notEqualSlice[uint16])
   185  		testUint32x8Compare(t, archsimd.Uint32x8.NotEqual, notEqualSlice[uint32])
   186  		testUint64x4Compare(t, archsimd.Uint64x4.NotEqual, notEqualSlice[uint64])
   187  		testUint8x32Compare(t, archsimd.Uint8x32.NotEqual, notEqualSlice[uint8])
   188  	}
   189  
   190  	if archsimd.X86.AVX512() {
   191  		testFloat32x16Compare(t, archsimd.Float32x16.NotEqual, notEqualSlice[float32])
   192  		testFloat64x8Compare(t, archsimd.Float64x8.NotEqual, notEqualSlice[float64])
   193  		testInt8x64Compare(t, archsimd.Int8x64.NotEqual, notEqualSlice[int8])
   194  		testInt16x32Compare(t, archsimd.Int16x32.NotEqual, notEqualSlice[int16])
   195  		testInt32x16Compare(t, archsimd.Int32x16.NotEqual, notEqualSlice[int32])
   196  		testInt64x8Compare(t, archsimd.Int64x8.NotEqual, notEqualSlice[int64])
   197  		testUint8x64Compare(t, archsimd.Uint8x64.NotEqual, notEqualSlice[uint8])
   198  		testUint16x32Compare(t, archsimd.Uint16x32.NotEqual, notEqualSlice[uint16])
   199  		testUint32x16Compare(t, archsimd.Uint32x16.NotEqual, notEqualSlice[uint32])
   200  		testUint64x8Compare(t, archsimd.Uint64x8.NotEqual, notEqualSlice[uint64])
   201  	}
   202  }
   203  
   204  func TestIsNaN(t *testing.T) {
   205  	testFloat32x4UnaryCompare(t, archsimd.Float32x4.IsNaN, isNaNSlice[float32])
   206  	testFloat32x8UnaryCompare(t, archsimd.Float32x8.IsNaN, isNaNSlice[float32])
   207  	testFloat64x2UnaryCompare(t, archsimd.Float64x2.IsNaN, isNaNSlice[float64])
   208  	testFloat64x4UnaryCompare(t, archsimd.Float64x4.IsNaN, isNaNSlice[float64])
   209  
   210  	if archsimd.X86.AVX512() {
   211  		testFloat32x16UnaryCompare(t, archsimd.Float32x16.IsNaN, isNaNSlice[float32])
   212  		testFloat64x8UnaryCompare(t, archsimd.Float64x8.IsNaN, isNaNSlice[float64])
   213  	}
   214  
   215  	// Test x.IsNaN().Or(y.IsNaN()), which is optimized to VCMPP(S|D) $3, x, y.
   216  	want32 := mapCompare(func(x, y float32) bool { return x != x || y != y })
   217  	want64 := mapCompare(func(x, y float64) bool { return x != x || y != y })
   218  	testFloat32x4Compare(t,
   219  		func(x, y archsimd.Float32x4) archsimd.Mask32x4 {
   220  			return x.IsNaN().Or(y.IsNaN())
   221  		}, want32)
   222  	testFloat64x2Compare(t,
   223  		func(x, y archsimd.Float64x2) archsimd.Mask64x2 {
   224  			return x.IsNaN().Or(y.IsNaN())
   225  		}, want64)
   226  
   227  	if archsimd.X86.AVX2() {
   228  		testFloat32x8Compare(t,
   229  			func(x, y archsimd.Float32x8) archsimd.Mask32x8 {
   230  				return x.IsNaN().Or(y.IsNaN())
   231  			}, want32)
   232  		testFloat64x4Compare(t,
   233  			func(x, y archsimd.Float64x4) archsimd.Mask64x4 {
   234  				return x.IsNaN().Or(y.IsNaN())
   235  			}, want64)
   236  	}
   237  
   238  	if archsimd.X86.AVX512() {
   239  		testFloat32x16Compare(t,
   240  			func(x, y archsimd.Float32x16) archsimd.Mask32x16 {
   241  				return x.IsNaN().Or(y.IsNaN())
   242  			}, want32)
   243  		testFloat64x8Compare(t,
   244  			func(x, y archsimd.Float64x8) archsimd.Mask64x8 {
   245  				return x.IsNaN().Or(y.IsNaN())
   246  			}, want64)
   247  	}
   248  }
   249  

View as plain text