Source file src/simd/archsimd/internal/simd_test/binary_128_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 && wasm
     6  
     7  package simd_test
     8  
     9  import (
    10  	"simd/archsimd"
    11  	"testing"
    12  )
    13  
    14  func TestAdd(t *testing.T) {
    15  	testFloat32x4Binary(t, archsimd.Float32x4.Add, addSlice[float32])
    16  	testFloat64x2Binary(t, archsimd.Float64x2.Add, addSlice[float64])
    17  
    18  	testInt16x8Binary(t, archsimd.Int16x8.Add, addSlice[int16])
    19  	testInt32x4Binary(t, archsimd.Int32x4.Add, addSlice[int32])
    20  	testInt64x2Binary(t, archsimd.Int64x2.Add, addSlice[int64])
    21  	testInt8x16Binary(t, archsimd.Int8x16.Add, addSlice[int8])
    22  
    23  	testUint32x4Binary(t, archsimd.Uint32x4.Add, addSlice[uint32])
    24  	testUint64x2Binary(t, archsimd.Uint64x2.Add, addSlice[uint64])
    25  	testUint16x8Binary(t, archsimd.Uint16x8.Add, addSlice[uint16])
    26  	testUint8x16Binary(t, archsimd.Uint8x16.Add, addSlice[uint8])
    27  }
    28  
    29  func TestSub(t *testing.T) {
    30  	testFloat32x4Binary(t, archsimd.Float32x4.Sub, subSlice[float32])
    31  	testFloat64x2Binary(t, archsimd.Float64x2.Sub, subSlice[float64])
    32  
    33  	testInt32x4Binary(t, archsimd.Int32x4.Sub, subSlice[int32])
    34  	testInt16x8Binary(t, archsimd.Int16x8.Sub, subSlice[int16])
    35  	testInt64x2Binary(t, archsimd.Int64x2.Sub, subSlice[int64])
    36  	testInt8x16Binary(t, archsimd.Int8x16.Sub, subSlice[int8])
    37  
    38  	testUint32x4Binary(t, archsimd.Uint32x4.Sub, subSlice[uint32])
    39  	testUint16x8Binary(t, archsimd.Uint16x8.Sub, subSlice[uint16])
    40  	testUint64x2Binary(t, archsimd.Uint64x2.Sub, subSlice[uint64])
    41  	testUint8x16Binary(t, archsimd.Uint8x16.Sub, subSlice[uint8])
    42  }
    43  
    44  func TestMax(t *testing.T) {
    45  	testInt16x8Binary(t, archsimd.Int16x8.Max, maxSlice[int16])
    46  	testInt32x4Binary(t, archsimd.Int32x4.Max, maxSlice[int32])
    47  
    48  	testInt64x2Binary(t, archsimd.Int64x2.Max, maxSlice[int64])
    49  
    50  	testInt8x16Binary(t, archsimd.Int8x16.Max, maxSlice[int8])
    51  
    52  	testUint16x8Binary(t, archsimd.Uint16x8.Max, maxSlice[uint16])
    53  	testUint32x4Binary(t, archsimd.Uint32x4.Max, maxSlice[uint32])
    54  
    55  	testUint64x2Binary(t, archsimd.Uint64x2.Max, maxSlice[uint64])
    56  
    57  	testUint8x16Binary(t, archsimd.Uint8x16.Max, maxSlice[uint8])
    58  }
    59  
    60  func TestMin(t *testing.T) {
    61  	testInt16x8Binary(t, archsimd.Int16x8.Min, minSlice[int16])
    62  	testInt32x4Binary(t, archsimd.Int32x4.Min, minSlice[int32])
    63  
    64  	testInt64x2Binary(t, archsimd.Int64x2.Min, minSlice[int64])
    65  
    66  	testInt8x16Binary(t, archsimd.Int8x16.Min, minSlice[int8])
    67  
    68  	testUint16x8Binary(t, archsimd.Uint16x8.Min, minSlice[uint16])
    69  	testUint32x4Binary(t, archsimd.Uint32x4.Min, minSlice[uint32])
    70  
    71  	testUint64x2Binary(t, archsimd.Uint64x2.Min, minSlice[uint64])
    72  
    73  	testUint8x16Binary(t, archsimd.Uint8x16.Min, minSlice[uint8])
    74  }
    75  
    76  func TestAnd(t *testing.T) {
    77  	testInt16x8Binary(t, archsimd.Int16x8.And, andSlice[int16])
    78  	testInt32x4Binary(t, archsimd.Int32x4.And, andSlice[int32])
    79  	testInt64x2Binary(t, archsimd.Int64x2.And, andSlice[int64])
    80  	testInt8x16Binary(t, archsimd.Int8x16.And, andSlice[int8])
    81  
    82  	testUint16x8Binary(t, archsimd.Uint16x8.And, andSlice[uint16])
    83  	testUint32x4Binary(t, archsimd.Uint32x4.And, andSlice[uint32])
    84  	testUint64x2Binary(t, archsimd.Uint64x2.And, andSlice[uint64])
    85  	testUint8x16Binary(t, archsimd.Uint8x16.And, andSlice[uint8])
    86  }
    87  
    88  func TestAndNot(t *testing.T) {
    89  	testInt16x8Binary(t, archsimd.Int16x8.AndNot, andNotSlice[int16])
    90  	testInt32x4Binary(t, archsimd.Int32x4.AndNot, andNotSlice[int32])
    91  	testInt64x2Binary(t, archsimd.Int64x2.AndNot, andNotSlice[int64])
    92  	testInt8x16Binary(t, archsimd.Int8x16.AndNot, andNotSlice[int8])
    93  
    94  	testUint8x16Binary(t, archsimd.Uint8x16.AndNot, andNotSlice[uint8])
    95  	testUint16x8Binary(t, archsimd.Uint16x8.AndNot, andNotSlice[uint16])
    96  	testUint32x4Binary(t, archsimd.Uint32x4.AndNot, andNotSlice[uint32])
    97  	testUint64x2Binary(t, archsimd.Uint64x2.AndNot, andNotSlice[uint64])
    98  }
    99  
   100  func TestXor(t *testing.T) {
   101  	testInt16x8Binary(t, archsimd.Int16x8.Xor, xorSlice[int16])
   102  	testInt32x4Binary(t, archsimd.Int32x4.Xor, xorSlice[int32])
   103  	testInt64x2Binary(t, archsimd.Int64x2.Xor, xorSlice[int64])
   104  	testInt8x16Binary(t, archsimd.Int8x16.Xor, xorSlice[int8])
   105  
   106  	testUint16x8Binary(t, archsimd.Uint16x8.Xor, xorSlice[uint16])
   107  	testUint32x4Binary(t, archsimd.Uint32x4.Xor, xorSlice[uint32])
   108  	testUint64x2Binary(t, archsimd.Uint64x2.Xor, xorSlice[uint64])
   109  	testUint8x16Binary(t, archsimd.Uint8x16.Xor, xorSlice[uint8])
   110  }
   111  
   112  func TestOr(t *testing.T) {
   113  	testInt16x8Binary(t, archsimd.Int16x8.Or, orSlice[int16])
   114  	testInt32x4Binary(t, archsimd.Int32x4.Or, orSlice[int32])
   115  	testInt64x2Binary(t, archsimd.Int64x2.Or, orSlice[int64])
   116  	testInt8x16Binary(t, archsimd.Int8x16.Or, orSlice[int8])
   117  
   118  	testUint16x8Binary(t, archsimd.Uint16x8.Or, orSlice[uint16])
   119  	testUint32x4Binary(t, archsimd.Uint32x4.Or, orSlice[uint32])
   120  	testUint64x2Binary(t, archsimd.Uint64x2.Or, orSlice[uint64])
   121  	testUint8x16Binary(t, archsimd.Uint8x16.Or, orSlice[uint8])
   122  }
   123  
   124  func TestMul(t *testing.T) {
   125  	testFloat32x4Binary(t, archsimd.Float32x4.Mul, mulSlice[float32])
   126  	testFloat64x2Binary(t, archsimd.Float64x2.Mul, mulSlice[float64])
   127  
   128  	testInt8x16Binary(t, archsimd.Int8x16.Mul, mulSlice[int8])
   129  	testUint8x16Binary(t, archsimd.Uint8x16.Mul, mulSlice[uint8])
   130  	testInt16x8Binary(t, archsimd.Int16x8.Mul, mulSlice[int16])
   131  	testInt32x4Binary(t, archsimd.Int32x4.Mul, mulSlice[int32])
   132  
   133  	if archsimd.X86.AVX512() {
   134  		testInt64x2Binary(t, archsimd.Int64x2.Mul, mulSlice[int64])
   135  	}
   136  }
   137  
   138  func TestDiv(t *testing.T) {
   139  	testFloat32x4Binary(t, archsimd.Float32x4.Div, divSlice[float32])
   140  	testFloat64x2Binary(t, archsimd.Float64x2.Div, divSlice[float64])
   141  }
   142  

View as plain text