blob: f95d3ccfd6a0d86091a59f04624e52da8e96d31f [file]
// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build goexperiment.simd && arm64
package simd_test
import (
"simd/archsimd"
"testing"
)
func TestReduceSum(t *testing.T) {
testInt8x16Reduce(t, archsimd.Int8x16.ReduceSum, func(x []int8) int8 { return reduceSlice(x, add[int8]) })
testInt16x8Reduce(t, archsimd.Int16x8.ReduceSum, func(x []int16) int16 { return reduceSlice(x, add[int16]) })
testInt32x4Reduce(t, archsimd.Int32x4.ReduceSum, func(x []int32) int32 { return reduceSlice(x, add[int32]) })
testUint8x16Reduce(t, archsimd.Uint8x16.ReduceSum, func(x []uint8) uint8 { return reduceSlice(x, add[uint8]) })
testUint16x8Reduce(t, archsimd.Uint16x8.ReduceSum, func(x []uint16) uint16 { return reduceSlice(x, add[uint16]) })
testUint32x4Reduce(t, archsimd.Uint32x4.ReduceSum, func(x []uint32) uint32 { return reduceSlice(x, add[uint32]) })
}
func TestReduceMax(t *testing.T) {
testInt8x16Reduce(t, archsimd.Int8x16.ReduceMax, func(x []int8) int8 { return reduceSlice(x, max_[int8]) })
testInt16x8Reduce(t, archsimd.Int16x8.ReduceMax, func(x []int16) int16 { return reduceSlice(x, max_[int16]) })
testInt32x4Reduce(t, archsimd.Int32x4.ReduceMax, func(x []int32) int32 { return reduceSlice(x, max_[int32]) })
testUint8x16Reduce(t, archsimd.Uint8x16.ReduceMax, func(x []uint8) uint8 { return reduceSlice(x, max_[uint8]) })
testUint16x8Reduce(t, archsimd.Uint16x8.ReduceMax, func(x []uint16) uint16 { return reduceSlice(x, max_[uint16]) })
testUint32x4Reduce(t, archsimd.Uint32x4.ReduceMax, func(x []uint32) uint32 { return reduceSlice(x, max_[uint32]) })
testFloat32x4Reduce(t, archsimd.Float32x4.ReduceMax, func(x []float32) float32 { return reduceSlice(x, max_[float32]) })
}
func TestReduceMin(t *testing.T) {
testInt8x16Reduce(t, archsimd.Int8x16.ReduceMin, func(x []int8) int8 { return reduceSlice(x, min_[int8]) })
testInt16x8Reduce(t, archsimd.Int16x8.ReduceMin, func(x []int16) int16 { return reduceSlice(x, min_[int16]) })
testInt32x4Reduce(t, archsimd.Int32x4.ReduceMin, func(x []int32) int32 { return reduceSlice(x, min_[int32]) })
testUint8x16Reduce(t, archsimd.Uint8x16.ReduceMin, func(x []uint8) uint8 { return reduceSlice(x, min_[uint8]) })
testUint16x8Reduce(t, archsimd.Uint16x8.ReduceMin, func(x []uint16) uint16 { return reduceSlice(x, min_[uint16]) })
testUint32x4Reduce(t, archsimd.Uint32x4.ReduceMin, func(x []uint32) uint32 { return reduceSlice(x, min_[uint32]) })
testFloat32x4Reduce(t, archsimd.Float32x4.ReduceMin, func(x []float32) float32 { return reduceSlice(x, min_[float32]) })
}