Source file
src/simd/endianness_test.go
1
2
3
4
5
6
7 package simd_test
8
9 import (
10 "simd"
11 "testing"
12 )
13
14 func assertEQ[T number](t *testing.T, x, y T, what string) {
15 t.Helper()
16 if x != y {
17 t.Errorf("%v != %v, %s", x, y, what)
18 }
19 }
20
21 func makeSlice[T number](l int) []T {
22 x := make([]T, l)
23 var i T
24 for ; int(i) < len(x); i++ {
25 x[int(i)] = i + 1
26 }
27 return x
28 }
29
30 func TestLen(t *testing.T) {
31 var U64s simd.Uint64s
32 var U32s simd.Uint32s
33 var U16s simd.Uint16s
34 var U8s simd.Uint8s
35
36 assertEQ(t, 2*U64s.Len(), U32s.Len(), "2*U64s.Len()==U32s.Len()")
37 assertEQ(t, 2*U32s.Len(), U16s.Len(), "2*U32.Len()==U16s.Len()")
38 assertEQ(t, 2*U16s.Len(), U8s.Len(), "2*U16s.Len()==U8s.Len()")
39 }
40
41 func getElem64(x simd.Uint64s, i int) uint64 {
42 s := make([]uint64, x.Len())
43 x.Store(s)
44 return s[i]
45 }
46
47 func getElem32(x simd.Uint32s, i int) uint32 {
48 s := make([]uint32, x.Len())
49 x.Store(s)
50 return s[i]
51 }
52
53 func getElem16(x simd.Uint16s, i int) uint16 {
54 s := make([]uint16, x.Len())
55 x.Store(s)
56 return s[i]
57 }
58
59 func getElem8(x simd.Uint8s, i int) uint8 {
60 s := make([]uint8, x.Len())
61 x.Store(s)
62 return s[i]
63 }
64
65 func TestEndian(t *testing.T) {
66 var U64s simd.Uint64s
67 var U32s simd.Uint32s
68 var U16s simd.Uint16s
69 var U8s simd.Uint8s
70
71 u64s := makeSlice[uint64](U64s.Len())
72 u32s := makeSlice[uint32](U32s.Len())
73 u16s := makeSlice[uint16](U16s.Len())
74 u8s := makeSlice[uint8](U8s.Len())
75
76 U64s = simd.LoadUint64s(u64s)
77 U32s = simd.LoadUint32s(u32s)
78 U16s = simd.LoadUint16s(u16s)
79 U8s = simd.LoadUint8s(u8s)
80
81 assertEQ(t, getElem64(U64s, 1), 2, "U64s[1] == 2")
82 assertEQ(t, getElem32(U32s, 1), 2, "U32s[1] == 2")
83 assertEQ(t, getElem16(U16s, 1), 2, "U16s[1] == 2")
84 assertEQ(t, getElem8(U8s, 1), 2, "U8s[1] == 2")
85 }
86
87 func TestReshape(t *testing.T) {
88 var U64s simd.Uint64s
89 var U32s simd.Uint32s
90 var U16s simd.Uint16s
91 var U8s simd.Uint8s
92
93 u64s := makeSlice[uint64](U64s.Len())
94 u32s := makeSlice[uint32](U32s.Len())
95 u16s := makeSlice[uint16](U16s.Len())
96 u8s := makeSlice[uint8](U8s.Len())
97
98 U64s = simd.LoadUint64s(u64s)
99 U32s = simd.LoadUint32s(u32s)
100 U16s = simd.LoadUint16s(u16s)
101 U8s = simd.LoadUint8s(u8s)
102
103 assertEQ(t, getElem8(U8s, 0), 1, "U8s[0] == 1")
104 assertEQ(t, getElem8(U16s.ReshapeToUint8s(), 0), 1, "U16s.ReshapeToUint8s()[0] == 1")
105 assertEQ(t, getElem8(U32s.ReshapeToUint8s(), 0), 1, "U32s.ReshapeToUint8s()[0] == 1")
106 assertEQ(t, getElem8(U64s.ReshapeToUint8s(), 0), 1, "U64s.ReshapeToUint8s()[0] == 1")
107
108 assertEQ(t, getElem16(U8s.ReshapeToUint16s(), 0), 0x0201, "U8s.ReshapeToUint16s()[0] == 0x0201")
109 assertEQ(t, getElem16(U16s, 0), 1, "U16s[0] == 1")
110 assertEQ(t, getElem16(U32s.ReshapeToUint16s(), 0), 1, "U32s.ReshapeToUint16s()[0] == 1")
111 assertEQ(t, getElem16(U64s.ReshapeToUint16s(), 0), 1, "U64s.ReshapeToUint16s()[0] == 1")
112
113 assertEQ(t, getElem32(U8s.ReshapeToUint32s(), 0), 0x04030201, "U8s.ReshapeToUint16s()[0] == 0x04030201")
114 assertEQ(t, getElem32(U16s.ReshapeToUint32s(), 0), 0x00020001, "U16s.ReshapeToUint32s()[0] == 0x00020001")
115 assertEQ(t, getElem32(U32s, 0), 1, "U32s[0] == 1")
116 assertEQ(t, getElem32(U64s.ReshapeToUint32s(), 0), 1, "U64s.ReshapeToUint32s()[0] == 1")
117
118 assertEQ(t, getElem64(U8s.ReshapeToUint64s(), 0), 0x0807060504030201, "U8s.ReshapeToUint64s()[0] == 0x0807060504030201")
119 assertEQ(t, getElem64(U16s.ReshapeToUint64s(), 0), 0x0004000300020001, "U16s.ReshapeToUint64s()[0] == 0x0004000300020001")
120 assertEQ(t, getElem64(U32s.ReshapeToUint64s(), 0), 0x0000000200000001, "U32s.ReshapeToUint64s()[0] == 0x0000000200000001")
121 assertEQ(t, getElem64(U64s, 0), 1, "U64s[0] == 1")
122
123 t.Logf("U8s=%v", U8s)
124 t.Logf("U16s=%v", U16s)
125 t.Logf("U32s=%v", U32s)
126 t.Logf("U64s=%v", U64s)
127
128 }
129
View as plain text