// 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 ( "fmt" "simd" "testing" ) func TestIP(t *testing.T) { var a, b [50]float32 for i := 0; i < 50; i++ { a[i] = float32(i) b[i] = float32(i) } x, sumWidth, emulated := ip(a[:50], b[:50]) if x != 40425 { t.Errorf("Expected 40425, got %f", x) } fmt.Printf("ip: sum was computed in width %d, emulated = %v\n", sumWidth, emulated) } func TestIPGoTo(t *testing.T) { var a, b [50]float32 for i := 0; i < 50; i++ { a[i] = float32(i) b[i] = float32(i) } x, sumWidth, emulated := ipGoTo(a[:50], b[:50]) if x != 40425 { t.Errorf("Expected 40425, got %f", x) } fmt.Printf("ipgoto: sum was computed in width %d, emulated = %v\n", sumWidth, emulated) } func first[T, U any](t T, u U) T { return t } func ip(x, y []float32) (float32, int, bool) { var a simd.Float32s sumWidth := a.Len() * 32 emulated := simd.Emulated() var i int for i = 0; i < len(x)-a.Len()+1; i += a.Len() { u := simd.LoadFloat32s(x[i : i+a.Len()]) v := simd.LoadFloat32s(y[i : i+a.Len()]) a = a.Add(u.Mul(v)) } if i < len(x) { a = a.Add(first(simd.LoadFloat32sPart(x[i:])). Mul(first(simd.LoadFloat32sPart(y[i:])))) } return sum(a), sumWidth, emulated } func ipGoTo(x, y []float32) (float32, int, bool) { var a simd.Float32s sumWidth := a.Len() * 32 emulated := simd.Emulated() var i int var u, v simd.Float32s loop: if !(i < len(x)-a.Len()+1) { goto done } u = simd.LoadFloat32s(x[i : i+a.Len()]) v = simd.LoadFloat32s(y[i : i+a.Len()]) a = a.Add(u.Mul(v)) i += a.Len() goto loop done: if i < len(x) { a = a.Add(first(simd.LoadFloat32sPart(x[i:])). Mul(first(simd.LoadFloat32sPart(y[i:])))) } return sum(a), sumWidth, emulated } func boringSum(x simd.Float32s) float32 { s := make([]float32, x.Len()) x.Store(s) var r float32 for _, e := range s { r += e } return r }