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) 1919 / 3025 63% [spec-common, spec-all]
17 docs sourced from spec (§3) 3124 / 3398 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) 190 -> 0 [doc-triage]
25 simd mirror drift (§3) 26 -> 0 [comments-yaml]
26 categories.yaml entries (§4) 229 -> 0 [cat-rehome, compiler-ops-impl, cat-delete]
27 midway/comments.yaml entries spec covers (§4) 2 -> 0 [comments-yaml, spec-all]
28
29
30 ## 1. Spec coverage of API [spec-common, spec-all]
31
32 by (target, receiver, name) 4174 / 5444 77%
33 by (receiver, name) 1919 / 3025 63%
34 by name 278 / 464 60%
35
36 By build configuration:
37
38 amd64 1833 / 2788 66%
39 arm64 1171 / 1383 85%
40 wasm 798 / 877 91%
41 portable 372 / 396 94%
42
43 By generator (declarations per tool, counted once per tool per pair):
44
45 hand-written 526 / 585 90%
46 midway 372 / 372 100%
47 simdgen 1347 / 2326 58%
48 tmplgen 415 / 463 90%
49 wasmgen 361 / 416 87%
50
51 High-drift-risk names (emitted by >1 generator):
52
53 covered 137 / 145 94% [spec-all]
54 portable core (comments.yaml .common_methods) 67 / 67 100% [spec-common]
55
56 spec operations written so far 86
57 expanding to distinct names 289
58 expanding to (receiver, name) pairs 2784
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 3124 / 3398 92% [gen-docs, comments-yaml, handwritten-fill, template-docs]
91
92 simd ∩ archsimd methods with matching docs 294 / 294 100% [gen-docs, comments-yaml]
93
94 hand-written doc conflicts with spec 190 -> 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 1 -> 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 38 -> 0 [doc-triage]
108 drifted docs in simd mirror (stubs vs emulated) 26 -> 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 229 -> 0 [cat-rehome, compiler-ops-impl, cat-delete]
121 unique operation names 200
122 exported 167
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 187 -> 0 [sig-from-spec]
128 constImm 22 -> 0 [cat-rehome]
129 documentation 186 -> 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 2 -> 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 186 spec has never defined at all
152 (1098 receivers, counted as coverage in §1 rather than disagreement):
153
154 relation names Σ|api - spec| Σ|spec - api|
155 (-> 0) (review)
156 api = spec 220 0 0
157 api ⊂ spec 52 0 815
158 api ⊃ spec 0 0 0
159 overlapping 0 0 0
160 disjoint 6 8 16
161 api = ∅ 11 0 34
162 total 289 8 865
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 Len api ⊂ spec 40 56 0 16
221 Less api ⊂ spec 39 40 0 1
222 LessEqual api ⊂ spec 39 40 0 1
223 MulAdd api ⊂ spec 22 40 0 18
224 NotEqual api ⊂ spec 40 56 0 16
225 OnesCount api ⊂ spec 26 32 0 6
226 Permute api ⊂ spec 24 40 0 16
227 ReduceMax api ⊂ spec 10 40 0 30
228 ReduceSum api ⊂ spec 34 40 0 6
229 RotateAllLeft api ⊂ spec 13 16 0 3
230 RotateAllRight api ⊂ spec 13 16 0 3
231 RotateLeft api ⊂ spec 6 16 0 10
232 RotateRight api ⊂ spec 6 16 0 10
233 ScaleSaturated api ⊂ spec 8 32 0 24
234 ShiftAllLeft api ⊂ spec 28 32 0 4
235 ShiftAllRight api ⊂ spec 25 32 0 7
236 ShiftLeft api ⊂ spec 18 32 0 14
237 ShiftRight api ⊂ spec 18 32 0 14
238 StoreArrayMasked api ⊂ spec 22 30 0 8
239 SubSaturated api ⊂ spec 24 32 0 8
240 ToMask api ⊂ spec 16 40 0 24
241 TrailingZeros api ⊂ spec 16 32 0 16
242
View as plain text