1 SIMD spec transition progress
2
3 Generated by archsimd/_gen/cmd/specstats; do not edit.
4 Regenerate with: go run ./cmd/specstats -w
5
6 Every fraction heads for 100%; every count heads for zero. Bracketed
7 names are SPEC-TRANSITION.md tasks that move the figure. Indented,
8 untagged numbers are context breaking down the figure above them.
9 String, Len, ToArch, and FromArch are excluded throughout (§2.7).
10
11
12 ## Summary
13
14 Heading for 100%:
15
16 spec coverage, by (receiver, name) (§1) 1809 / 2917 62% [spec-common, spec-all]
17 docs sourced from spec (§3) 2926 / 3175 92% [gen-docs, comments-yaml, handwritten-fill, template-docs]
18
19 Heading for zero:
20
21 type mismatches with spec (§2) 0 -> 0 [fill-enforce]
22 type divergence across targets (§2) 0 -> 0 [fill-enforce]
23 spec coverage gaps in defined names (§5) 8 -> 0 [spec-all, convert-lo, mask-bits]
24 hand-written doc conflicts with spec (§3) 165 -> 0 [doc-triage]
25 simd mirror drift (§3) 0 -> 0 [comments-yaml]
26 categories.yaml entries (§4) 227 -> 0 [cat-rehome, compiler-ops-impl, cat-delete]
27 midway/comments.yaml entries spec covers (§4) 0 -> 0 [comments-yaml, spec-all]
28
29
30 ## 1. Spec coverage of API [spec-common, spec-all]
31
32 by (target, receiver, name) 3903 / 5175 75%
33 by (receiver, name) 1809 / 2917 62%
34 by name 275 / 458 60%
35
36 By build configuration:
37
38 amd64 1737 / 2692 65%
39 arm64 1068 / 1282 83%
40 wasm 750 / 829 90%
41 portable 348 / 372 94%
42
43 By generator (declarations per tool, counted once per tool per pair):
44
45 hand-written 502 / 561 89%
46 midway 348 / 348 100%
47 simdgen 1272 / 2247 57%
48 tmplgen 362 / 416 87%
49 wasmgen 337 / 392 86%
50
51 High-drift-risk names (emitted by >1 generator):
52
53 covered 130 / 138 94% [spec-all]
54 portable core (comments.yaml .common_methods) 65 / 65 100% [spec-common]
55
56 spec operations written so far 80
57 expanding to distinct names 286
58 expanding to (receiver, name) pairs 2632
59
60
61 ## 2. Signatures and names [named-results, fill-enforce]
62
63 Spec/API disagreement, for declarations spec covers. As in specdoc.Fill,
64 a named argument whose name differs from spec's is a mismatch; an unnamed
65 one (or _) is not, and is counted below as a name Fill fills in instead:
66
67 type mismatches 0 -> 0 [fill-enforce]
68 parameter-name mismatches 0 -> 0 [named-results]
69 result-name mismatches 0 -> 0 [named-results]
70
71 Names spec gives that the API leaves unnamed, for declarations spec covers:
72
73 declarations with unnamed parameters 0 -> 0 [named-results]
74 declarations with unnamed results 0 -> 0 [named-results]
75
76 API consistency across targets (the "one meaning" invariant), for
77 (receiver, name) pairs declared for more than one target. An unnamed
78 argument agrees with any name:
79
80 divergent parameter or result types 0 -> 0 [fill-enforce]
81 divergent parameter names 0 -> 0 [fill-enforce, spec-all]
82 divergent result names 0 -> 0 [named-results]
83
84
85 ## 3. Documentation [gen-docs, comments-yaml, handwritten-fill, template-docs]
86
87 A declaration counts as sourced from spec when its doc comment begins with
88 spec's text (a prefix test, because Fill leaves generator notes below).
89
90 covered declarations whose doc comes from spec 2926 / 3175 92% [gen-docs, comments-yaml, handwritten-fill, template-docs]
91
92 simd ∩ archsimd methods with matching docs 253 / 253 100% [gen-docs, comments-yaml]
93
94 hand-written doc conflicts with spec 165 -> 0 [doc-triage]
95 archsimd/clmul_arm64.go 4 -> 0 [doc-triage]
96 archsimd/extra_amd64.go 6 -> 0 [doc-triage]
97 archsimd/maskrange_128.go 4 -> 0 [doc-triage]
98 archsimd/maskrange_amd64.go 12 -> 0 [doc-triage]
99 archsimd/ops_emulated_amd64.go 48 -> 0 [doc-triage]
100 archsimd/ops_emulated_arm64.go 2 -> 0 [doc-triage]
101 archsimd/ops_emulated_wasm.go 29 -> 0 [doc-triage]
102 archsimd/shuffles_amd64.go 12 -> 0 [doc-triage]
103 archsimd/slicepart_128.go 8 -> 0 [doc-triage]
104 archsimd/slicepart_amd64.go 4 -> 0 [doc-triage]
105 archsimd/slicepart_arm64.go 12 -> 0 [doc-triage]
106 archsimd/slicepart_wasm.go 12 -> 0 [doc-triage]
107 simd_emulated.go 12 -> 0 [doc-triage]
108 drifted docs in simd mirror (stubs vs emulated) 0 -> 0 [comments-yaml]
109 mirrored declarations 372
110
111
112 ## 4. Retiring the old inputs
113 [comments-yaml, cat-rehome, compiler-ops-impl, cat-delete]
114
115 categories.yaml's exported entries are emptied field by field: template-docs
116 removes documentation, cat-rehome removes the rest, sig-from-spec removes
117 commutative, and cat-delete removes the file. Compiler-only entries are
118 handled wholesale by compiler-ops-impl.
119
120 categories.yaml entries 227 -> 0 [cat-rehome, compiler-ops-impl, cat-delete]
121 unique operation names 198
122 exported 165
123 compiler-only categories.yaml entries 42 -> 0 [compiler-ops-impl]
124
125 exported entries, by field:
126 base 6 -> 0 [cat-rehome]
127 commutative 185 -> 0 [sig-from-spec]
128 constImm 22 -> 0 [cat-rehome]
129 documentation 184 -> 0 [cat-rehome]
130 elemBits 14 -> 0 [cat-rehome]
131 out 20 -> 0 [cat-rehome]
132 regexpTag 25 -> 0 [cat-rehome]
133 signed 6 -> 0 [cat-rehome]
134
135 midway/comments.yaml entries spec covers 0 -> 0 [comments-yaml, spec-all]
136
137 commutativity disagreements, spec vs categories.yaml 7 -> 0 [spec-all]
138
139
140 ## 5. Spec/API coverage disagreement detail [spec-all, convert-lo, mask-bits]
141
142 Where both sides define a name, receivers only the API declares are spec
143 bugs (a constraint is wrong or a sibling function is missing). Receivers
144 only spec generates are a review queue -- spec is deliberately maximal.
145
146 spec misses receivers of a name it defines 8 -> 0 [spec-all, convert-lo, mask-bits]
147 declarations affected, counting each target 8 -> 0 [spec-all, convert-lo, mask-bits]
148 spec operations implemented nowhere 1 -> 0 [spec-all]
149 TrailingZeros
150
151 Every name either side defines, less the 183 spec has never defined at all
152 (1100 receivers, counted as coverage in §1 rather than disagreement):
153
154 relation names Σ|api - spec| Σ|spec - api|
155 (-> 0) (review)
156 api = spec 219 0 0
157 api ⊂ spec 50 0 773
158 api ⊃ spec 0 0 0
159 overlapping 0 0 0
160 disjoint 6 8 16
161 api = ∅ 11 0 34
162 total 286 8 823
163
164 Names that disagree, with api - spec receivers (the defects):
165
166 name relation |api| |spec| |api - spec| |spec - api|
167 AddSaturated api ⊂ spec 24 32 0 8
168 Average api ⊂ spec 12 32 0 20
169 CarrylessMultiplyEven api ⊂ spec 4 16 0 12
170 CarrylessMultiplyEvenOdd api ⊂ spec 3 16 0 13
171 CarrylessMultiplyOdd api ⊂ spec 4 16 0 12
172 CarrylessMultiplyOddEven api ⊂ spec 3 16 0 13
173 ConcatAddPairs api ⊂ spec 10 40 0 30
174 ConcatAddPairsGrouped api ⊂ spec 6 40 0 34
175 ConcatAddPairsSaturated api ⊂ spec 1 32 0 31
176 ConcatAddPairsSaturatedGrouped api ⊂ spec 1 32 0 31
177 ConcatSubPairs api ⊂ spec 6 40 0 34
178 ConcatSubPairsGrouped api ⊂ spec 6 40 0 34
179 ConcatSubPairsSaturated api ⊂ spec 1 32 0 31
180 ConcatSubPairsSaturatedGrouped api ⊂ spec 1 32 0 31
181 ConvertLo16ToFloat32 api = ∅ 0 4 0 4
182 ConvertLo2ToFloat64 api ⊂ spec 3 7 0 4
183 ConvertLo4ToFloat32 api = ∅ 0 4 0 4
184 ConvertLo4ToFloat64 api = ∅ 0 7 0 7
185 ConvertLo8ToFloat32 api = ∅ 0 4 0 4
186 ConvertLo8ToFloat64 api = ∅ 0 7 0 7
187 ConvertToFloat32 api ⊂ spec 16 23 0 7
188 ConvertToFloat64 api ⊂ spec 12 16 0 4
189 ConvertToInt16 api ⊂ spec 4 26 0 22
190 ConvertToInt32 api ⊂ spec 11 23 0 12
191 ConvertToInt64 api ⊂ spec 9 16 0 7
192 ConvertToInt8 api ⊂ spec 4 28 0 24
193 ConvertToUint16 api ⊂ spec 4 26 0 22
194 ConvertToUint32 api ⊂ spec 10 23 0 13
195 ConvertToUint64 api ⊂ spec 9 16 0 7
196 ConvertToUint8 api ⊂ spec 4 28 0 24
197 Div api ⊂ spec 12 40 0 28
198 DotProductPairs api ⊂ spec 3 28 0 25
199 DotProductPairsSaturated api ⊂ spec 3 12 0 9
200 ExtendLo16ToInt16 api = ∅ 0 1 0 1
201 ExtendLo16ToInt32 api = ∅ 0 2 0 2
202 ExtendLo16ToUint16 api = ∅ 0 1 0 1
203 ExtendLo16ToUint32 api = ∅ 0 2 0 2
204 ExtendLo32ToInt16 api = ∅ 0 1 0 1
205 ExtendLo32ToUint16 api = ∅ 0 1 0 1
206 ExtendLo4ToInt64 disjoint 2 3 2 3
207 api - spec = Int16x8 Int8x16
208 ExtendLo4ToUint64 disjoint 2 3 2 3
209 api - spec = Uint16x8 Uint8x16
210 ExtendLo8ToInt32 disjoint 1 2 1 2
211 api - spec = Int8x16
212 ExtendLo8ToInt64 disjoint 1 3 1 3
213 api - spec = Int8x16
214 ExtendLo8ToUint32 disjoint 1 2 1 2
215 api - spec = Uint8x16
216 ExtendLo8ToUint64 disjoint 1 3 1 3
217 api - spec = Uint8x16
218 IsNaN api ⊂ spec 6 8 0 2
219 LeadingZeros api ⊂ spec 16 32 0 16
220 Less api ⊂ spec 39 40 0 1
221 LessEqual api ⊂ spec 39 40 0 1
222 MulAdd api ⊂ spec 22 40 0 18
223 NotEqual api ⊂ spec 40 56 0 16
224 OnesCount api ⊂ spec 26 32 0 6
225 Permute api ⊂ spec 24 40 0 16
226 ReduceSum api ⊂ spec 32 40 0 8
227 RotateAllLeft api ⊂ spec 13 16 0 3
228 RotateAllRight api ⊂ spec 13 16 0 3
229 RotateLeft api ⊂ spec 6 16 0 10
230 RotateRight api ⊂ spec 6 16 0 10
231 ScaleSaturated api ⊂ spec 8 32 0 24
232 ShiftAllLeft api ⊂ spec 26 32 0 6
233 ShiftAllRight api ⊂ spec 25 32 0 7
234 ShiftLeft api ⊂ spec 18 32 0 14
235 ShiftRight api ⊂ spec 18 32 0 14
236 StoreArrayMasked api ⊂ spec 22 30 0 8
237 SubSaturated api ⊂ spec 24 32 0 8
238 ToMask api ⊂ spec 16 40 0 24
239 TrailingZeros api ⊂ spec 16 32 0 16
240
View as plain text