| // 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. |
| |
| package simdref_test |
| |
| import ( |
| "fmt" |
| "simd/internal/simdref" |
| "simd/internal/spec" |
| "testing" |
| ) |
| |
| func TestScalableExecution(t *testing.T) { |
| // Calling scalable operation before setting width must panic |
| func() { |
| defer func() { |
| if r := recover(); r == nil { |
| t.Fatalf("expected panic on LoadInt8s when scalable width unset, but did not panic") |
| } |
| }() |
| sUnset := make([]int8, 16) |
| simdref.LoadInt8s(sUnset) |
| }() |
| |
| // Test at two different scalable widths |
| for _, width := range []int{128, 256} { |
| t.Run(fmt.Sprint(width), func(t *testing.T) { |
| s1 := make([]int8, width/8) |
| s2 := make([]int8, width/8) |
| for i := range s1 { |
| s1[i] = int8(i) |
| s2[i] = 10 |
| } |
| out := make([]int8, width/8) |
| |
| defer spec.SetScalableWidth(width)() |
| x := simdref.LoadInt8s(s1) |
| y := simdref.LoadInt8s(s2) |
| z := x.Add(y) |
| z.Store(out) |
| for i := range out { |
| if out[i] != int8(i)+10 { |
| t.Fatalf("out[%d] = %d, want %d", i, out[i], int8(i)+10) |
| } |
| } |
| }) |
| } |
| } |