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.