Source file src/simd/internal/simd_test/unary_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  	"math"
    11  	"simd"
    12  	"testing"
    13  )
    14  
    15  func TestCeil(t *testing.T) {
    16  	testFloat32x4Unary(t, simd.Float32x4.Ceil, ceilSlice[float32])
    17  	testFloat32x8Unary(t, simd.Float32x8.Ceil, ceilSlice[float32])
    18  	testFloat64x2Unary(t, simd.Float64x2.Ceil, ceilSlice[float64])
    19  	testFloat64x4Unary(t, simd.Float64x4.Ceil, ceilSlice[float64])
    20  	if simd.X86.AVX512() {
    21  		// testFloat32x16Unary(t, simd.Float32x16.Ceil, ceilSlice[float32]) // missing
    22  		// testFloat64x8Unary(t, simd.Float64x8.Ceil, ceilSlice[float64])   // missing
    23  	}
    24  }
    25  
    26  func TestFloor(t *testing.T) {
    27  	testFloat32x4Unary(t, simd.Float32x4.Floor, floorSlice[float32])
    28  	testFloat32x8Unary(t, simd.Float32x8.Floor, floorSlice[float32])
    29  	testFloat64x2Unary(t, simd.Float64x2.Floor, floorSlice[float64])
    30  	testFloat64x4Unary(t, simd.Float64x4.Floor, floorSlice[float64])
    31  	if simd.X86.AVX512() {
    32  		// testFloat32x16Unary(t, simd.Float32x16.Floor, floorSlice[float32]) // missing
    33  		// testFloat64x8Unary(t, simd.Float64x8.Floor, floorSlice[float64])   // missing
    34  	}
    35  }
    36  
    37  func TestTrunc(t *testing.T) {
    38  	testFloat32x4Unary(t, simd.Float32x4.Trunc, truncSlice[float32])
    39  	testFloat32x8Unary(t, simd.Float32x8.Trunc, truncSlice[float32])
    40  	testFloat64x2Unary(t, simd.Float64x2.Trunc, truncSlice[float64])
    41  	testFloat64x4Unary(t, simd.Float64x4.Trunc, truncSlice[float64])
    42  	if simd.X86.AVX512() {
    43  		// testFloat32x16Unary(t, simd.Float32x16.Trunc, truncSlice[float32]) // missing
    44  		// testFloat64x8Unary(t, simd.Float64x8.Trunc, truncSlice[float64])   // missing
    45  	}
    46  }
    47  
    48  func TestRound(t *testing.T) {
    49  	testFloat32x4Unary(t, simd.Float32x4.RoundToEven, roundSlice[float32])
    50  	testFloat32x8Unary(t, simd.Float32x8.RoundToEven, roundSlice[float32])
    51  	testFloat64x2Unary(t, simd.Float64x2.RoundToEven, roundSlice[float64])
    52  	testFloat64x4Unary(t, simd.Float64x4.RoundToEven, roundSlice[float64])
    53  	if simd.X86.AVX512() {
    54  		// testFloat32x16Unary(t, simd.Float32x16.Round, roundSlice[float32]) // missing
    55  		// testFloat64x8Unary(t, simd.Float64x8.Round, roundSlice[float64])   // missing
    56  	}
    57  }
    58  
    59  func TestSqrt(t *testing.T) {
    60  	testFloat32x4Unary(t, simd.Float32x4.Sqrt, sqrtSlice[float32])
    61  	testFloat32x8Unary(t, simd.Float32x8.Sqrt, sqrtSlice[float32])
    62  	testFloat64x2Unary(t, simd.Float64x2.Sqrt, sqrtSlice[float64])
    63  	testFloat64x4Unary(t, simd.Float64x4.Sqrt, sqrtSlice[float64])
    64  	if simd.X86.AVX512() {
    65  		testFloat32x16Unary(t, simd.Float32x16.Sqrt, sqrtSlice[float32])
    66  		testFloat64x8Unary(t, simd.Float64x8.Sqrt, sqrtSlice[float64])
    67  	}
    68  }
    69  
    70  func TestNot(t *testing.T) {
    71  	testInt8x16Unary(t, simd.Int8x16.Not, map1[int8](not))
    72  	testInt8x32Unary(t, simd.Int8x32.Not, map1[int8](not))
    73  	testInt16x8Unary(t, simd.Int16x8.Not, map1[int16](not))
    74  	testInt16x16Unary(t, simd.Int16x16.Not, map1[int16](not))
    75  	testInt32x4Unary(t, simd.Int32x4.Not, map1[int32](not))
    76  	testInt32x8Unary(t, simd.Int32x8.Not, map1[int32](not))
    77  }
    78  
    79  func TestAbsolute(t *testing.T) {
    80  	testInt8x16Unary(t, simd.Int8x16.Abs, map1[int8](abs))
    81  	testInt8x32Unary(t, simd.Int8x32.Abs, map1[int8](abs))
    82  	testInt16x8Unary(t, simd.Int16x8.Abs, map1[int16](abs))
    83  	testInt16x16Unary(t, simd.Int16x16.Abs, map1[int16](abs))
    84  	testInt32x4Unary(t, simd.Int32x4.Abs, map1[int32](abs))
    85  	testInt32x8Unary(t, simd.Int32x8.Abs, map1[int32](abs))
    86  	if simd.X86.AVX512() {
    87  		testInt8x64Unary(t, simd.Int8x64.Abs, map1[int8](abs))
    88  		testInt16x32Unary(t, simd.Int16x32.Abs, map1[int16](abs))
    89  		testInt32x16Unary(t, simd.Int32x16.Abs, map1[int32](abs))
    90  		testInt64x2Unary(t, simd.Int64x2.Abs, map1[int64](abs))
    91  		testInt64x4Unary(t, simd.Int64x4.Abs, map1[int64](abs))
    92  		testInt64x8Unary(t, simd.Int64x8.Abs, map1[int64](abs))
    93  	}
    94  }
    95  
    96  func TestCeilScaledResidue(t *testing.T) {
    97  	if !simd.X86.AVX512() {
    98  		t.Skip("Needs AVX512")
    99  	}
   100  	testFloat64x8UnaryFlaky(t,
   101  		func(x simd.Float64x8) simd.Float64x8 { return x.CeilScaledResidue(0) },
   102  		map1(ceilResidueForPrecision[float64](0)),
   103  		0.001)
   104  	testFloat64x8UnaryFlaky(t,
   105  		func(x simd.Float64x8) simd.Float64x8 { return x.CeilScaledResidue(1) },
   106  		map1(ceilResidueForPrecision[float64](1)),
   107  		0.001)
   108  	testFloat64x8Unary(t,
   109  		func(x simd.Float64x8) simd.Float64x8 { return x.Sub(x.CeilScaled(0)) },
   110  		map1[float64](func(x float64) float64 { return x - math.Ceil(x) }))
   111  }
   112  
   113  func TestToUint32(t *testing.T) {
   114  	if !simd.X86.AVX512() {
   115  		t.Skip("Needs AVX512")
   116  	}
   117  	testFloat32x4ConvertToUint32(t, simd.Float32x4.ConvertToUint32, map1[float32](toUint32))
   118  	testFloat32x8ConvertToUint32(t, simd.Float32x8.ConvertToUint32, map1[float32](toUint32))
   119  	testFloat32x16ConvertToUint32(t, simd.Float32x16.ConvertToUint32, map1[float32](toUint32))
   120  }
   121  
   122  func TestToInt32(t *testing.T) {
   123  	testFloat32x4ConvertToInt32(t, simd.Float32x4.ConvertToInt32, map1[float32](toInt32))
   124  	testFloat32x8ConvertToInt32(t, simd.Float32x8.ConvertToInt32, map1[float32](toInt32))
   125  }
   126  
   127  func TestConverts(t *testing.T) {
   128  	testUint8x16ConvertToUint16(t, simd.Uint8x16.ExtendToUint16, map1[uint8](toUint16))
   129  	testUint16x8ConvertToUint32(t, simd.Uint16x8.ExtendToUint32, map1[uint16](toUint32))
   130  }
   131  
   132  func TestConvertsAVX512(t *testing.T) {
   133  	if !simd.X86.AVX512() {
   134  		t.Skip("Needs AVX512")
   135  	}
   136  	testUint8x32ConvertToUint16(t, simd.Uint8x32.ExtendToUint16, map1[uint8](toUint16))
   137  }
   138  

View as plain text