Help us shape the future of Go! Take the 2026 Go Developer Survey

Working in the SIMD packages

What these packages are, how the generators fit together, how to run them is in archsimd/_gen/README.md. This file is only about not burning your context window.

Most of this tree, by volume, is generated — and some of it is enormous

Generated files here are machine-uniform: hundreds to thousands of near-identical stanzas, each a doc comment plus one declaration.

// Add adds corresponding elements of two vectors.
//
// Asm: VPADDD, CPU Feature: AVX
func (x Int32x4) Add(y Int32x4) Int32x4

Two or three stanzas tell you what the whole file would. Reading one end to end can consume a large fraction of your context and teach you nothing the sample didn’t. This stays true as the API grows: these files get longer, not more varied.

A file is generated if its first line says so:

head -1 <file> | grep 'Code generated'

Don’t rely on a remembered list of which files are big — measure:

find . -name '*.go' -size +50k -not -path '*/_gen/*' | xargs ls -lS

archsimd/ops_*.go, internal/simdref/simdref.go, internal/bridge/decls_*.go and the simd_test helpers are usually on that list. Treat it as a starting point, not an inventory.

Sample; don’t read

Anchor the pattern, ask for little context:

# the shape of one declaration, with its full doc comment
GOEXPERIMENT=simd go doc simd/archsimd.Int32x4.Add

# which receivers carry an op — count first, list if you need to
grep -c '^func ([^)]*) Add(' archsimd/ops_amd64.go

An unanchored grep Add also matches AddSub, MulAdd, PairwiseAdd and every // Asm: line mentioning one. On a file of uniform stanzas, -A5/-B5 returns most of the file.

Size tool output before you read it

specls prints the expanded spec API. Its output is as large as the files it describes, so use -f (a regexp) to narrow it, and anchor the pattern:

go run ./cmd/specls -f '^Add$'   # one spec function
go run ./cmd/specls -f Add       # every name containing "Add" — much larger
go run ./cmd/specls              # the entire expanded API — very large

Same caution for diffs. The README says to use -diff constantly, and that’s right — but regenerating a family can produce thousands of lines. Get the shape first, then read what matters:

git diff --stat
go run . -tools <tool> -diff | wc -l

Don’t edit generated files

Edit the generator input and regenerate. The first line of each generated file names the inputs it was built from; use those to find what to edit, but regenerate with go generate (see the README), not by re-running the command in that line. Commit regenerated output in the same commit as the change that caused it.

If you were handed one spec transition task

archsimd/_gen/SPEC-TRANSITION.md is the active plan. Read Part 2 (the rationale; tasks cite it by section number) and your own task from Part 4. Don’t read Part 4 end to end — it is every task in the project, and you were given one.