| SIMD spec transition progress | |
| Generated by archsimd/_gen/cmd/specstats; do not edit. | |
| Regenerate with: go run ./cmd/specstats -w | |
| Every fraction heads for 100%; every count heads for zero. Bracketed | |
| names are SPEC-TRANSITION.md tasks that move the figure. Indented, | |
| untagged numbers are context breaking down the figure above them. | |
| String, Len, ToArch, and FromArch are excluded throughout (§2.7). | |
| ## Summary | |
| Heading for 100%: | |
| spec coverage, by (receiver, name) (§1) 1823 / 2929 62% [spec-common, spec-all] | |
| docs sourced from spec (§3) 2958 / 3206 92% [gen-docs, comments-yaml, handwritten-fill, template-docs] | |
| Heading for zero: | |
| type mismatches with spec (§2) 0 -> 0 [fill-enforce] | |
| type divergence across targets (§2) 0 -> 0 [fill-enforce] | |
| spec coverage gaps in defined names (§5) 8 -> 0 [spec-all, convert-lo, mask-bits] | |
| hand-written doc conflicts with spec (§3) 164 -> 0 [doc-triage] | |
| simd mirror drift (§3) 0 -> 0 [comments-yaml] | |
| categories.yaml entries (§4) 229 -> 0 [cat-rehome, compiler-ops-impl, cat-delete] | |
| midway/comments.yaml entries spec covers (§4) 0 -> 0 [comments-yaml, spec-all] | |
| ## 1. Spec coverage of API [spec-common, spec-all] | |
| by (target, receiver, name) 3934 / 5204 76% | |
| by (receiver, name) 1823 / 2929 62% | |
| by name 276 / 462 60% | |
| By build configuration: | |
| amd64 1737 / 2692 65% | |
| arm64 1099 / 1311 84% | |
| wasm 750 / 829 90% | |
| portable 348 / 372 94% | |
| By generator (declarations per tool, counted once per tool per pair): | |
| hand-written 502 / 561 89% | |
| midway 348 / 348 100% | |
| simdgen 1293 / 2272 57% | |
| tmplgen 373 / 421 89% | |
| wasmgen 337 / 392 86% | |
| High-drift-risk names (emitted by >1 generator): | |
| covered 135 / 143 94% [spec-all] | |
| portable core (comments.yaml .common_methods) 65 / 65 100% [spec-common] | |
| spec operations written so far 81 | |
| expanding to distinct names 287 | |
| expanding to (receiver, name) pairs 2672 | |
| ## 2. Signatures and names [named-results, fill-enforce] | |
| Spec/API disagreement, for declarations spec covers. As in specdoc.Fill, | |
| a named argument whose name differs from spec's is a mismatch; an unnamed | |
| one (or _) is not, and is counted below as a name Fill fills in instead: | |
| type mismatches 0 -> 0 [fill-enforce] | |
| parameter-name mismatches 0 -> 0 [named-results] | |
| result-name mismatches 0 -> 0 [named-results] | |
| Names spec gives that the API leaves unnamed, for declarations spec covers: | |
| declarations with unnamed parameters 0 -> 0 [named-results] | |
| declarations with unnamed results 0 -> 0 [named-results] | |
| API consistency across targets (the "one meaning" invariant), for | |
| (receiver, name) pairs declared for more than one target. An unnamed | |
| argument agrees with any name: | |
| divergent parameter or result types 0 -> 0 [fill-enforce] | |
| divergent parameter names 0 -> 0 [fill-enforce, spec-all] | |
| divergent result names 0 -> 0 [named-results] | |
| ## 3. Documentation [gen-docs, comments-yaml, handwritten-fill, template-docs] | |
| A declaration counts as sourced from spec when its doc comment begins with | |
| spec's text (a prefix test, because Fill leaves generator notes below). | |
| covered declarations whose doc comes from spec 2958 / 3206 92% [gen-docs, comments-yaml, handwritten-fill, template-docs] | |
| simd ∩ archsimd methods with matching docs 270 / 270 100% [gen-docs, comments-yaml] | |
| hand-written doc conflicts with spec 164 -> 0 [doc-triage] | |
| archsimd/clmul_arm64.go 4 -> 0 [doc-triage] | |
| archsimd/extra_amd64.go 6 -> 0 [doc-triage] | |
| archsimd/maskrange_128.go 4 -> 0 [doc-triage] | |
| archsimd/maskrange_amd64.go 12 -> 0 [doc-triage] | |
| archsimd/ops_emulated_amd64.go 48 -> 0 [doc-triage] | |
| archsimd/ops_emulated_arm64.go 1 -> 0 [doc-triage] | |
| archsimd/ops_emulated_wasm.go 29 -> 0 [doc-triage] | |
| archsimd/shuffles_amd64.go 12 -> 0 [doc-triage] | |
| archsimd/slicepart_128.go 8 -> 0 [doc-triage] | |
| archsimd/slicepart_amd64.go 4 -> 0 [doc-triage] | |
| archsimd/slicepart_arm64.go 12 -> 0 [doc-triage] | |
| archsimd/slicepart_wasm.go 12 -> 0 [doc-triage] | |
| simd_emulated.go 12 -> 0 [doc-triage] | |
| drifted docs in simd mirror (stubs vs emulated) 0 -> 0 [comments-yaml] | |
| mirrored declarations 372 | |
| ## 4. Retiring the old inputs | |
| [comments-yaml, cat-rehome, compiler-ops-impl, cat-delete] | |
| categories.yaml's exported entries are emptied field by field: template-docs | |
| removes documentation, cat-rehome removes the rest, sig-from-spec removes | |
| commutative, and cat-delete removes the file. Compiler-only entries are | |
| handled wholesale by compiler-ops-impl. | |
| categories.yaml entries 229 -> 0 [cat-rehome, compiler-ops-impl, cat-delete] | |
| unique operation names 200 | |
| exported 167 | |
| compiler-only categories.yaml entries 42 -> 0 [compiler-ops-impl] | |
| exported entries, by field: | |
| base 6 -> 0 [cat-rehome] | |
| commutative 187 -> 0 [sig-from-spec] | |
| constImm 22 -> 0 [cat-rehome] | |
| documentation 186 -> 0 [cat-rehome] | |
| elemBits 14 -> 0 [cat-rehome] | |
| out 20 -> 0 [cat-rehome] | |
| regexpTag 25 -> 0 [cat-rehome] | |
| signed 6 -> 0 [cat-rehome] | |
| midway/comments.yaml entries spec covers 0 -> 0 [comments-yaml, spec-all] | |
| commutativity disagreements, spec vs categories.yaml 7 -> 0 [spec-all] | |
| ## 5. Spec/API coverage disagreement detail [spec-all, convert-lo, mask-bits] | |
| Where both sides define a name, receivers only the API declares are spec | |
| bugs (a constraint is wrong or a sibling function is missing). Receivers | |
| only spec generates are a review queue -- spec is deliberately maximal. | |
| spec misses receivers of a name it defines 8 -> 0 [spec-all, convert-lo, mask-bits] | |
| declarations affected, counting each target 8 -> 0 [spec-all, convert-lo, mask-bits] | |
| spec operations implemented nowhere 1 -> 0 [spec-all] | |
| TrailingZeros | |
| Every name either side defines, less the 186 spec has never defined at all | |
| (1098 receivers, counted as coverage in §1 rather than disagreement): | |
| relation names Σ|api - spec| Σ|spec - api| | |
| (-> 0) (review) | |
| api = spec 219 0 0 | |
| api ⊂ spec 51 0 799 | |
| api ⊃ spec 0 0 0 | |
| overlapping 0 0 0 | |
| disjoint 6 8 16 | |
| api = ∅ 11 0 34 | |
| total 287 8 849 | |
| Names that disagree, with api - spec receivers (the defects): | |
| name relation |api| |spec| |api - spec| |spec - api| | |
| AddSaturated api ⊂ spec 24 32 0 8 | |
| Average api ⊂ spec 12 32 0 20 | |
| CarrylessMultiplyEven api ⊂ spec 4 16 0 12 | |
| CarrylessMultiplyEvenOdd api ⊂ spec 3 16 0 13 | |
| CarrylessMultiplyOdd api ⊂ spec 4 16 0 12 | |
| CarrylessMultiplyOddEven api ⊂ spec 3 16 0 13 | |
| ConcatAddPairs api ⊂ spec 10 40 0 30 | |
| ConcatAddPairsGrouped api ⊂ spec 6 40 0 34 | |
| ConcatAddPairsSaturated api ⊂ spec 1 32 0 31 | |
| ConcatAddPairsSaturatedGrouped api ⊂ spec 1 32 0 31 | |
| ConcatSubPairs api ⊂ spec 6 40 0 34 | |
| ConcatSubPairsGrouped api ⊂ spec 6 40 0 34 | |
| ConcatSubPairsSaturated api ⊂ spec 1 32 0 31 | |
| ConcatSubPairsSaturatedGrouped api ⊂ spec 1 32 0 31 | |
| ConvertLo16ToFloat32 api = ∅ 0 4 0 4 | |
| ConvertLo2ToFloat64 api ⊂ spec 3 7 0 4 | |
| ConvertLo4ToFloat32 api = ∅ 0 4 0 4 | |
| ConvertLo4ToFloat64 api = ∅ 0 7 0 7 | |
| ConvertLo8ToFloat32 api = ∅ 0 4 0 4 | |
| ConvertLo8ToFloat64 api = ∅ 0 7 0 7 | |
| ConvertToFloat32 api ⊂ spec 16 23 0 7 | |
| ConvertToFloat64 api ⊂ spec 12 16 0 4 | |
| ConvertToInt16 api ⊂ spec 4 26 0 22 | |
| ConvertToInt32 api ⊂ spec 11 23 0 12 | |
| ConvertToInt64 api ⊂ spec 9 16 0 7 | |
| ConvertToInt8 api ⊂ spec 4 28 0 24 | |
| ConvertToUint16 api ⊂ spec 4 26 0 22 | |
| ConvertToUint32 api ⊂ spec 10 23 0 13 | |
| ConvertToUint64 api ⊂ spec 9 16 0 7 | |
| ConvertToUint8 api ⊂ spec 4 28 0 24 | |
| Div api ⊂ spec 12 40 0 28 | |
| DotProductPairs api ⊂ spec 3 28 0 25 | |
| DotProductPairsSaturated api ⊂ spec 3 12 0 9 | |
| ExtendLo16ToInt16 api = ∅ 0 1 0 1 | |
| ExtendLo16ToInt32 api = ∅ 0 2 0 2 | |
| ExtendLo16ToUint16 api = ∅ 0 1 0 1 | |
| ExtendLo16ToUint32 api = ∅ 0 2 0 2 | |
| ExtendLo32ToInt16 api = ∅ 0 1 0 1 | |
| ExtendLo32ToUint16 api = ∅ 0 1 0 1 | |
| ExtendLo4ToInt64 disjoint 2 3 2 3 | |
| api - spec = Int16x8 Int8x16 | |
| ExtendLo4ToUint64 disjoint 2 3 2 3 | |
| api - spec = Uint16x8 Uint8x16 | |
| ExtendLo8ToInt32 disjoint 1 2 1 2 | |
| api - spec = Int8x16 | |
| ExtendLo8ToInt64 disjoint 1 3 1 3 | |
| api - spec = Int8x16 | |
| ExtendLo8ToUint32 disjoint 1 2 1 2 | |
| api - spec = Uint8x16 | |
| ExtendLo8ToUint64 disjoint 1 3 1 3 | |
| api - spec = Uint8x16 | |
| IsNaN api ⊂ spec 6 8 0 2 | |
| LeadingZeros api ⊂ spec 16 32 0 16 | |
| Less api ⊂ spec 39 40 0 1 | |
| LessEqual api ⊂ spec 39 40 0 1 | |
| MulAdd api ⊂ spec 22 40 0 18 | |
| NotEqual api ⊂ spec 40 56 0 16 | |
| OnesCount api ⊂ spec 26 32 0 6 | |
| Permute api ⊂ spec 24 40 0 16 | |
| ReduceMax api ⊂ spec 10 40 0 30 | |
| ReduceSum api ⊂ spec 34 40 0 6 | |
| RotateAllLeft api ⊂ spec 13 16 0 3 | |
| RotateAllRight api ⊂ spec 13 16 0 3 | |
| RotateLeft api ⊂ spec 6 16 0 10 | |
| RotateRight api ⊂ spec 6 16 0 10 | |
| ScaleSaturated api ⊂ spec 8 32 0 24 | |
| ShiftAllLeft api ⊂ spec 28 32 0 4 | |
| ShiftAllRight api ⊂ spec 25 32 0 7 | |
| ShiftLeft api ⊂ spec 18 32 0 14 | |
| ShiftRight api ⊂ spec 18 32 0 14 | |
| StoreArrayMasked api ⊂ spec 22 30 0 8 | |
| SubSaturated api ⊂ spec 24 32 0 8 | |
| ToMask api ⊂ spec 16 40 0 24 | |
| TrailingZeros api ⊂ spec 16 32 0 16 |