Source file src/simd/archsimd/internal/simd_test/shift_arm64_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 && arm64
     6  
     7  package simd_test
     8  
     9  import (
    10  	"simd/archsimd"
    11  	"testing"
    12  )
    13  
    14  func TestShift(t *testing.T) {
    15  	// Signed — reuse binary helpers, same-type operand pairs
    16  	testInt8x16Binary(t, archsimd.Int8x16.Shift, shiftSlice[int8])
    17  	testInt16x8Binary(t, archsimd.Int16x8.Shift, shiftSlice[int16])
    18  	testInt32x4Binary(t, archsimd.Int32x4.Shift, shiftSlice[int32])
    19  	testInt64x2Binary(t, archsimd.Int64x2.Shift, shiftSlice[int64])
    20  
    21  	// Unsigned — mixed-type operand pairs
    22  	testUint8x16Shift(t, archsimd.Uint8x16.Shift, shiftMixedSlice[uint8, int8])
    23  	testUint16x8Shift(t, archsimd.Uint16x8.Shift, shiftMixedSlice[uint16, int16])
    24  	testUint32x4Shift(t, archsimd.Uint32x4.Shift, shiftMixedSlice[uint32, int32])
    25  	testUint64x2Shift(t, archsimd.Uint64x2.Shift, shiftMixedSlice[uint64, int64])
    26  }
    27  
    28  func TestShiftSaturated(t *testing.T) {
    29  	// Signed — reuse binary helpers
    30  	testInt8x16Binary(t, archsimd.Int8x16.ShiftSaturated, shiftSaturatingSignedSlice[int8])
    31  	testInt16x8Binary(t, archsimd.Int16x8.ShiftSaturated, shiftSaturatingSignedSlice[int16])
    32  	testInt32x4Binary(t, archsimd.Int32x4.ShiftSaturated, shiftSaturatingSignedSlice[int32])
    33  	testInt64x2Binary(t, archsimd.Int64x2.ShiftSaturated, shiftSaturatingSignedSlice[int64])
    34  
    35  	// Unsigned — mixed-type
    36  	testUint8x16Shift(t, archsimd.Uint8x16.ShiftSaturated, shiftSaturatingUnsignedSlice[uint8, int8])
    37  	testUint16x8Shift(t, archsimd.Uint16x8.ShiftSaturated, shiftSaturatingUnsignedSlice[uint16, int16])
    38  	testUint32x4Shift(t, archsimd.Uint32x4.ShiftSaturated, shiftSaturatingUnsignedSlice[uint32, int32])
    39  	testUint64x2Shift(t, archsimd.Uint64x2.ShiftSaturated, shiftSaturatingUnsignedSlice[uint64, int64])
    40  }
    41  
    42  func TestConcatShiftBytesRight(t *testing.T) {
    43  	hide := hideConst[uint64]
    44  
    45  	csbr := func(shift uint64) func(x, y []uint8) []uint8 {
    46  		return func(x, y []uint8) []uint8 {
    47  			z := make([]uint8, len(x))
    48  			for i := range z {
    49  				target := i + int(shift)
    50  				if target < 16 {
    51  					z[i] = y[target]
    52  				} else if target < 32 {
    53  					z[i] = x[(target - 16)]
    54  				}
    55  			}
    56  			return z
    57  		}
    58  	}
    59  
    60  	t.Run("Uint8x16", func(t *testing.T) {
    61  		for _, shift := range []uint64{0, 2, 8, 15} {
    62  			t.Log("shift", shift)
    63  			testUint8x16Binary(t,
    64  				func(x, y archsimd.Uint8x16) archsimd.Uint8x16 { return x.ConcatShiftBytesRight(y, shift) },
    65  				csbr(shift))
    66  			testUint8x16Binary(t,
    67  				func(x, y archsimd.Uint8x16) archsimd.Uint8x16 { return x.ConcatShiftBytesRight(y, hide(shift)) },
    68  				csbr(hide(shift)))
    69  		}
    70  	})
    71  }
    72  
    73  func TestShiftAll8(t *testing.T) {
    74  	testInt8x16ShiftAll(t, archsimd.Int8x16.ShiftAllLeft, shiftAllLeftSlice[int8])
    75  	testUint8x16ShiftAll(t, archsimd.Uint8x16.ShiftAllLeft, shiftAllLeftSlice[uint8])
    76  	testInt8x16ShiftAll(t, archsimd.Int8x16.ShiftAllRight, shiftAllRightSlice[int8])
    77  	testUint8x16ShiftAll(t, archsimd.Uint8x16.ShiftAllRight, shiftAllRightSlice[uint8])
    78  }
    79  

View as plain text