| // 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 | |
| package simd_test | |
| import ( | |
| "simd" | |
| "testing" | |
| ) | |
| func assertEQ[T number](t *testing.T, x, y T, what string) { | |
| t.Helper() | |
| if x != y { | |
| t.Errorf("%v != %v, %s", x, y, what) | |
| } | |
| } | |
| func makeSlice[T number](l int) []T { | |
| x := make([]T, l) | |
| var i T | |
| for ; int(i) < len(x); i++ { | |
| x[int(i)] = i + 1 | |
| } | |
| return x | |
| } | |
| func TestLen(t *testing.T) { | |
| var U64s simd.Uint64s | |
| var U32s simd.Uint32s | |
| var U16s simd.Uint16s | |
| var U8s simd.Uint8s | |
| assertEQ(t, 2*U64s.Len(), U32s.Len(), "2*U64s.Len()==U32s.Len()") | |
| assertEQ(t, 2*U32s.Len(), U16s.Len(), "2*U32.Len()==U16s.Len()") | |
| assertEQ(t, 2*U16s.Len(), U8s.Len(), "2*U16s.Len()==U8s.Len()") | |
| } | |
| func getElem64(x simd.Uint64s, i int) uint64 { | |
| s := make([]uint64, x.Len()) | |
| x.Store(s) | |
| return s[i] | |
| } | |
| func getElem32(x simd.Uint32s, i int) uint32 { | |
| s := make([]uint32, x.Len()) | |
| x.Store(s) | |
| return s[i] | |
| } | |
| func getElem16(x simd.Uint16s, i int) uint16 { | |
| s := make([]uint16, x.Len()) | |
| x.Store(s) | |
| return s[i] | |
| } | |
| func getElem8(x simd.Uint8s, i int) uint8 { | |
| s := make([]uint8, x.Len()) | |
| x.Store(s) | |
| return s[i] | |
| } | |
| func TestEndian(t *testing.T) { | |
| var U64s simd.Uint64s | |
| var U32s simd.Uint32s | |
| var U16s simd.Uint16s | |
| var U8s simd.Uint8s | |
| u64s := makeSlice[uint64](U64s.Len()) | |
| u32s := makeSlice[uint32](U32s.Len()) | |
| u16s := makeSlice[uint16](U16s.Len()) | |
| u8s := makeSlice[uint8](U8s.Len()) | |
| U64s = simd.LoadUint64s(u64s) | |
| U32s = simd.LoadUint32s(u32s) | |
| U16s = simd.LoadUint16s(u16s) | |
| U8s = simd.LoadUint8s(u8s) | |
| assertEQ(t, getElem64(U64s, 1), 2, "U64s[1] == 2") | |
| assertEQ(t, getElem32(U32s, 1), 2, "U32s[1] == 2") | |
| assertEQ(t, getElem16(U16s, 1), 2, "U16s[1] == 2") | |
| assertEQ(t, getElem8(U8s, 1), 2, "U8s[1] == 2") | |
| } | |
| func TestReshape(t *testing.T) { | |
| var U64s simd.Uint64s | |
| var U32s simd.Uint32s | |
| var U16s simd.Uint16s | |
| var U8s simd.Uint8s | |
| u64s := makeSlice[uint64](U64s.Len()) | |
| u32s := makeSlice[uint32](U32s.Len()) | |
| u16s := makeSlice[uint16](U16s.Len()) | |
| u8s := makeSlice[uint8](U8s.Len()) | |
| U64s = simd.LoadUint64s(u64s) | |
| U32s = simd.LoadUint32s(u32s) | |
| U16s = simd.LoadUint16s(u16s) | |
| U8s = simd.LoadUint8s(u8s) | |
| assertEQ(t, getElem8(U8s, 0), 1, "U8s[0] == 1") | |
| assertEQ(t, getElem8(U16s.ReshapeToUint8s(), 0), 1, "U16s.ReshapeToUint8s()[0] == 1") | |
| assertEQ(t, getElem8(U32s.ReshapeToUint8s(), 0), 1, "U32s.ReshapeToUint8s()[0] == 1") | |
| assertEQ(t, getElem8(U64s.ReshapeToUint8s(), 0), 1, "U64s.ReshapeToUint8s()[0] == 1") | |
| assertEQ(t, getElem16(U8s.ReshapeToUint16s(), 0), 0x0201, "U8s.ReshapeToUint16s()[0] == 0x0201") | |
| assertEQ(t, getElem16(U16s, 0), 1, "U16s[0] == 1") | |
| assertEQ(t, getElem16(U32s.ReshapeToUint16s(), 0), 1, "U32s.ReshapeToUint16s()[0] == 1") | |
| assertEQ(t, getElem16(U64s.ReshapeToUint16s(), 0), 1, "U64s.ReshapeToUint16s()[0] == 1") | |
| assertEQ(t, getElem32(U8s.ReshapeToUint32s(), 0), 0x04030201, "U8s.ReshapeToUint16s()[0] == 0x04030201") | |
| assertEQ(t, getElem32(U16s.ReshapeToUint32s(), 0), 0x00020001, "U16s.ReshapeToUint32s()[0] == 0x00020001") | |
| assertEQ(t, getElem32(U32s, 0), 1, "U32s[0] == 1") | |
| assertEQ(t, getElem32(U64s.ReshapeToUint32s(), 0), 1, "U64s.ReshapeToUint32s()[0] == 1") | |
| assertEQ(t, getElem64(U8s.ReshapeToUint64s(), 0), 0x0807060504030201, "U8s.ReshapeToUint64s()[0] == 0x0807060504030201") | |
| assertEQ(t, getElem64(U16s.ReshapeToUint64s(), 0), 0x0004000300020001, "U16s.ReshapeToUint64s()[0] == 0x0004000300020001") | |
| assertEQ(t, getElem64(U32s.ReshapeToUint64s(), 0), 0x0000000200000001, "U32s.ReshapeToUint64s()[0] == 0x0000000200000001") | |
| assertEQ(t, getElem64(U64s, 0), 1, "U64s[0] == 1") | |
| t.Logf("U8s=%v", U8s) | |
| t.Logf("U16s=%v", U16s) | |
| t.Logf("U32s=%v", U32s) | |
| t.Logf("U64s=%v", U64s) | |
| } |