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

     1  // Copyright 2026 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 || arm64 || wasm)
     6  
     7  package simd_test
     8  
     9  import (
    10  	"math"
    11  	"simd/archsimd"
    12  	"testing"
    13  )
    14  
    15  // Values around the limits of the narrower integer types, which the general
    16  // test data doesn't cover well.
    17  var (
    18  	narrowEdgesI16 = []int16{math.MinInt16, math.MinInt8 - 1, math.MinInt8, -1, 0, 1, math.MaxInt8, math.MaxInt8 + 1, math.MaxUint8, math.MaxUint8 + 1, math.MaxInt16}
    19  	narrowEdgesU16 = []uint16{0, 1, math.MaxInt8, math.MaxInt8 + 1, math.MaxUint8, math.MaxUint8 + 1, math.MaxInt16, math.MaxInt16 + 1, math.MaxUint16}
    20  	narrowEdgesI32 = []int32{math.MinInt32, math.MinInt16 - 1, math.MinInt16, -1, 0, 1, math.MaxInt16, math.MaxInt16 + 1, math.MaxUint16, math.MaxUint16 + 1, math.MaxInt32}
    21  	narrowEdgesU32 = []uint32{0, 1, math.MaxInt16, math.MaxInt16 + 1, math.MaxUint16, math.MaxUint16 + 1, math.MaxInt32, math.MaxInt32 + 1, math.MaxUint32}
    22  	narrowEdgesI64 = []int64{math.MinInt64, math.MinInt32 - 1, math.MinInt32, -1, 0, 1, math.MaxInt32, math.MaxInt32 + 1, math.MaxUint32, math.MaxUint32 + 1, math.MaxInt64}
    23  	narrowEdgesU64 = []uint64{0, 1, math.MaxInt32, math.MaxInt32 + 1, math.MaxUint32, math.MaxUint32 + 1, 1 << 33, math.MaxInt64, math.MaxInt64 + 1, math.MaxUint64}
    24  )
    25  
    26  // TestNarrowEdges128 tests the 128-bit 2:1 narrowing conversions on values
    27  // around the limits of the result type.
    28  func TestNarrowEdges128(t *testing.T) {
    29  	testNarrowEdges(t, narrowEdgesI16, archsimd.LoadInt16x8, archsimd.Int16x8.TruncToInt8, toInt8[int16])
    30  	testNarrowEdges(t, narrowEdgesU16, archsimd.LoadUint16x8, archsimd.Uint16x8.TruncToUint8, toUint8[uint16])
    31  	testNarrowEdges(t, narrowEdgesI32, archsimd.LoadInt32x4, archsimd.Int32x4.TruncToInt16, toInt16[int32])
    32  	testNarrowEdges(t, narrowEdgesU32, archsimd.LoadUint32x4, archsimd.Uint32x4.TruncToUint16, toUint16[uint32])
    33  	testNarrowEdges(t, narrowEdgesI64, archsimd.LoadInt64x2, archsimd.Int64x2.TruncToInt32, toInt32[int64])
    34  	testNarrowEdges(t, narrowEdgesU64, archsimd.LoadUint64x2, archsimd.Uint64x2.TruncToUint32, toUint32[uint64])
    35  	testNarrowEdges(t, narrowEdgesI16, archsimd.LoadInt16x8, archsimd.Int16x8.SaturateToInt8, satToInt8[int16])
    36  	testNarrowEdges(t, narrowEdgesI16, archsimd.LoadInt16x8, archsimd.Int16x8.SaturateToUint8, satToUint8[int16])
    37  	testNarrowEdges(t, narrowEdgesU16, archsimd.LoadUint16x8, archsimd.Uint16x8.SaturateToUint8, satToUint8[uint16])
    38  	testNarrowEdges(t, narrowEdgesI32, archsimd.LoadInt32x4, archsimd.Int32x4.SaturateToInt16, satToInt16[int32])
    39  	testNarrowEdges(t, narrowEdgesI32, archsimd.LoadInt32x4, archsimd.Int32x4.SaturateToUint16, satToUint16[int32])
    40  	testNarrowEdges(t, narrowEdgesU32, archsimd.LoadUint32x4, archsimd.Uint32x4.SaturateToUint16, satToUint16[uint32])
    41  	testNarrowEdges(t, narrowEdgesI64, archsimd.LoadInt64x2, archsimd.Int64x2.SaturateToInt32, satToInt32[int64])
    42  	testNarrowEdges(t, narrowEdgesI64, archsimd.LoadInt64x2, archsimd.Int64x2.SaturateToUint32, satToUint32[int64])
    43  	testNarrowEdges(t, narrowEdgesU64, archsimd.LoadUint64x2, archsimd.Uint64x2.SaturateToUint32, satToUint32[uint64])
    44  }
    45  

View as plain text