Source file src/simd/endianness_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
     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