// 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 iface import ( "simd" ) // A SIMD-dependent type alias type MyInt8s = simd.Int8s func Generic[T haslen](x int) int { var v T return x + v.Len() } // VL = Generic[MyInt8s](1) doesn't currently work. // TODO: automatically transform those initializers into what is done here instead. var VL int func init() { VL = Generic[MyInt8s](1) } // A struct dependent on SIMD type VectorC struct { Field simd.Float32s } type Ftype func(x any) any var Fvar Ftype // A dependent function with a dependent signature func (v *VectorC) MethodOfSimd() bool { return false } func (v VectorC) Data() simd.Float32s { return v.Field } func (v VectorC) Foo(x VectorC) VectorC { return VectorC{Field: v.Field.Add(x.Field)} } func (v VectorC) Bar(x VectorC) VectorC { return VectorC{Field: v.Field.Add(x.Field)} } type Vint interface { MethodOfSimd() bool } type haslen interface { Len() int } type HasFoo[T any] interface { Foo(x T) T } type HasBar interface { Bar(x VectorC) VectorC } //go:noinline func MakeHasFoo[T HasFoo[T]](v T) HasFoo[T] { return v } func MakeHasBar(v VectorC) HasBar { return v } func VC(x simd.Float32s) VectorC { return VectorC{x} } type EmbedBar struct { HasBar } type EmbedFoo[T HasFoo[T]] struct { HasFoo[T] } func MakeHasEmbedFoo[T HasFoo[T]](v T) EmbedFoo[T] { return EmbedFoo[T]{MakeHasFoo[T](v)} } //go:noinline func MakeHasEmbedBar(v VectorC) EmbedBar { return EmbedBar{MakeHasBar(v)} } type HasQux[T any] interface { Qux(x T) HasFoo[T] } type Q struct { q *Q } func (q *Q) Qux(v VectorC) HasFoo[VectorC] { return v }