]> Cypherpunks repositories - gostls13.git/commitdiff
simd/archsimd: add tests for Saturate operations
authorCherry Mui <cherryyz@google.com>
Mon, 29 Dec 2025 19:56:53 +0000 (14:56 -0500)
committerCherry Mui <cherryyz@google.com>
Tue, 30 Dec 2025 00:22:10 +0000 (16:22 -0800)
Change-Id: Iea095112310802b29b4ef9ca6e559ea3c5aa83ed
Reviewed-on: https://go-review.googlesource.com/c/go/+/733140
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
src/simd/archsimd/internal/simd_test/simulation_helpers_test.go
src/simd/archsimd/internal/simd_test/unary_test.go

index a51912a47f6e07891198ed7753bdbb22d338b469..da107d806179493b96dcfc482c6e7993ae996417 100644 (file)
@@ -330,3 +330,90 @@ func imaSlice[T integer](x, y, z []T) []T {
 func fmaSlice[T float](x, y, z []T) []T {
        return map3[T](fma)(x, y, z)
 }
+
+func satToInt8[T integer](x T) int8 {
+       var m int8 = -128
+       var M int8 = 127
+       if T(M) < T(m) { // expecting T being a larger type
+               panic("bad input type")
+       }
+       if x < T(m) {
+               return m
+       }
+       if x > T(M) {
+               return M
+       }
+       return int8(x)
+}
+
+func satToUint8[T integer](x T) uint8 {
+       var M uint8 = 255
+       if T(M) < 0 { // expecting T being a larger type
+               panic("bad input type")
+       }
+       if x < 0 {
+               return 0
+       }
+       if x > T(M) {
+               return M
+       }
+       return uint8(x)
+}
+
+func satToInt16[T integer](x T) int16 {
+       var m int16 = -32768
+       var M int16 = 32767
+       if T(M) < T(m) { // expecting T being a larger type
+               panic("bad input type")
+       }
+       if x < T(m) {
+               return m
+       }
+       if x > T(M) {
+               return M
+       }
+       return int16(x)
+}
+
+func satToUint16[T integer](x T) uint16 {
+       var M uint16 = 65535
+       if T(M) < 0 { // expecting T being a larger type
+               panic("bad input type")
+       }
+       if x < 0 {
+               return 0
+       }
+       if x > T(M) {
+               return M
+       }
+       return uint16(x)
+}
+
+func satToInt32[T integer](x T) int32 {
+       var m int32 = -1 << 31
+       var M int32 = 1<<31 - 1
+       if T(M) < T(m) { // expecting T being a larger type
+               panic("bad input type")
+       }
+       if x < T(m) {
+               return m
+       }
+       if x > T(M) {
+               return M
+       }
+       return int32(x)
+}
+
+func satToUint32[T integer](x T) uint32 {
+       var M uint32 = 1<<32 - 1
+       if T(M) < 0 { // expecting T being a larger type
+               panic("bad input type")
+       }
+       if x < 0 {
+               return 0
+       }
+       if x > T(M) {
+               return M
+       }
+       return uint32(x)
+}
index 5d00eba03dad0659401457e9c9248e8cdb404e1f..097feb60ed655884e8c7aa924087f5f638d5f04f 100644 (file)
@@ -270,3 +270,45 @@ func TestTruncate(t *testing.T) {
                testUint64x8ConvertToUint32(t, archsimd.Uint64x8.TruncateToUint32, map1[uint64](toUint32))
        }
 }
+
+func TestSaturate(t *testing.T) {
+       if archsimd.X86.AVX512() {
+               testInt16x8ConvertToInt8(t, archsimd.Int16x8.SaturateToInt8, map1n[int16](satToInt8, 16))
+               testInt16x16ConvertToInt8(t, archsimd.Int16x16.SaturateToInt8, map1[int16](satToInt8))
+               testInt16x32ConvertToInt8(t, archsimd.Int16x32.SaturateToInt8, map1[int16](satToInt8))
+               testInt32x4ConvertToInt8(t, archsimd.Int32x4.SaturateToInt8, map1n[int32](satToInt8, 16))
+               testInt32x8ConvertToInt8(t, archsimd.Int32x8.SaturateToInt8, map1n[int32](satToInt8, 16))
+               testInt32x16ConvertToInt8(t, archsimd.Int32x16.SaturateToInt8, map1[int32](satToInt8))
+               testInt64x2ConvertToInt8(t, archsimd.Int64x2.SaturateToInt8, map1n[int64](satToInt8, 16))
+               testInt64x4ConvertToInt8(t, archsimd.Int64x4.SaturateToInt8, map1n[int64](satToInt8, 16))
+               testInt64x8ConvertToInt8(t, archsimd.Int64x8.SaturateToInt8, map1n[int64](satToInt8, 16))
+               testInt32x4ConvertToInt16(t, archsimd.Int32x4.SaturateToInt16, map1n[int32](satToInt16, 8))
+               testInt32x8ConvertToInt16(t, archsimd.Int32x8.SaturateToInt16, map1[int32](satToInt16))
+               testInt32x16ConvertToInt16(t, archsimd.Int32x16.SaturateToInt16, map1[int32](satToInt16))
+               testInt64x2ConvertToInt16(t, archsimd.Int64x2.SaturateToInt16, map1n[int64](satToInt16, 8))
+               testInt64x4ConvertToInt16(t, archsimd.Int64x4.SaturateToInt16, map1n[int64](satToInt16, 8))
+               testInt64x8ConvertToInt16(t, archsimd.Int64x8.SaturateToInt16, map1[int64](satToInt16))
+               testInt64x2ConvertToInt32(t, archsimd.Int64x2.SaturateToInt32, map1n[int64](satToInt32, 4))
+               testInt64x4ConvertToInt32(t, archsimd.Int64x4.SaturateToInt32, map1[int64](satToInt32))
+               testInt64x8ConvertToInt32(t, archsimd.Int64x8.SaturateToInt32, map1[int64](satToInt32))
+
+               testUint16x8ConvertToUint8(t, archsimd.Uint16x8.SaturateToUint8, map1n[uint16](satToUint8, 16))
+               testUint16x16ConvertToUint8(t, archsimd.Uint16x16.SaturateToUint8, map1[uint16](satToUint8))
+               testUint16x32ConvertToUint8(t, archsimd.Uint16x32.SaturateToUint8, map1[uint16](satToUint8))
+               testUint32x4ConvertToUint8(t, archsimd.Uint32x4.SaturateToUint8, map1n[uint32](satToUint8, 16))
+               testUint32x8ConvertToUint8(t, archsimd.Uint32x8.SaturateToUint8, map1n[uint32](satToUint8, 16))
+               testUint32x16ConvertToUint8(t, archsimd.Uint32x16.SaturateToUint8, map1[uint32](satToUint8))
+               testUint64x2ConvertToUint8(t, archsimd.Uint64x2.SaturateToUint8, map1n[uint64](satToUint8, 16))
+               testUint64x4ConvertToUint8(t, archsimd.Uint64x4.SaturateToUint8, map1n[uint64](satToUint8, 16))
+               testUint64x8ConvertToUint8(t, archsimd.Uint64x8.SaturateToUint8, map1n[uint64](satToUint8, 16))
+               testUint32x4ConvertToUint16(t, archsimd.Uint32x4.SaturateToUint16, map1n[uint32](satToUint16, 8))
+               testUint32x8ConvertToUint16(t, archsimd.Uint32x8.SaturateToUint16, map1[uint32](satToUint16))
+               testUint32x16ConvertToUint16(t, archsimd.Uint32x16.SaturateToUint16, map1[uint32](satToUint16))
+               testUint64x2ConvertToUint16(t, archsimd.Uint64x2.SaturateToUint16, map1n[uint64](satToUint16, 8))
+               testUint64x4ConvertToUint16(t, archsimd.Uint64x4.SaturateToUint16, map1n[uint64](satToUint16, 8))
+               testUint64x8ConvertToUint16(t, archsimd.Uint64x8.SaturateToUint16, map1[uint64](satToUint16))
+               testUint64x2ConvertToUint32(t, archsimd.Uint64x2.SaturateToUint32, map1n[uint64](satToUint32, 4))
+               testUint64x4ConvertToUint32(t, archsimd.Uint64x4.SaturateToUint32, map1[uint64](satToUint32))
+               testUint64x8ConvertToUint32(t, archsimd.Uint64x8.SaturateToUint32, map1[uint64](satToUint32))
+       }
+}