(no commit message)
[libreriscv.git] / openpower / sv / rfc / ls001.mdwn
1 # OPF ISA WG External RFC LS001 08Sep2022
2
3 * RFC Author: Luke Kenneth Casson Leighton.
4 * RFC Contributors/Ideas: Brad Frey, Paul Mackerras, Konstantinos Magritis,
5 Cesar Strauss, Jacob Lifshay, Toshaan Bharvani, Dimitry Selyutin, Andrey
6 Miroshnikov
7 * Funded by NLnet under the Privacy and Enhanced Trust Programme, EU
8 Horizon2020 Grant 825310
9 * <https://git.openpower.foundation/isa/PowerISA/issues/64>
10 [[ls001/discussion]]
11
12 This proposal is to extend the Power ISA with an Abstract RISC-Paradigm
13 Vectorisation Concept that may be orthogonally applied to **all and any** suitable
14 Scalar instructions, present and future, in the Scalar Power ISA.
15 The Vectorisation System is called
16 ["Simple-V"](https://libre-soc.org/openpower/sv/)
17 and the Prefix Format is called
18 ["SVP64"](https://libre-soc.org/openpower/sv/).
19 **Simple-V is not a Traditional Vector ISA and therefore
20 does not add Vector opcodes or regfiles**.
21 An ISA Concept similar to Simple-V was originally invented in 1994 by
22 Peter Hsu (Architect of the MIPS R8000) but was dropped as MIPS did not
23 have an Out-of-Order Microarchitecture.
24
25 Simple-V is designed for Embedded Scenarios right the way through
26 Audio/Visual DSPs to 3D GPUs and Supercomputing. As it does **not**
27 add actual Vector Instructions, relying solely and exclusively on the
28 **Scalar** ISA, it is **Scalar** instructions that need to be added to
29 the **Scalar** Power ISA before Simple-V may orthogonally Vectorise them.
30
31 The goal of RED Semiconductor Ltd, an OpenPOWER
32 Stakeholder, is to bring to market mass-volume general-purpose compute
33 processors that are competitive in the 3D GPU Audio Visual DSP EDGE IoT
34 desktop chromebook netbook smartphone laptop markets, performance-leveraged
35 by Simple-V. Simple-V thus has to
36 be accompanied by corresponding **Scalar** instructions that bring the
37 **Scalar** Power ISA up-to-date. These include IEEE754
38 [Transcendentals](https://libre-soc.org/openpower/transcendentals/)
39 [AV](https://libre-soc.org/openpower/sv/av_opcodes/)
40 cryptographic
41 [Biginteger](https://libre-soc.org/openpower/sv/biginteger/) and
42 [bitmanipulation](https://libre-soc.org/openpower/sv/bitmanip)
43 operations that ARM
44 Intel AMD and many other ISAs have been adding over the past 12 years
45 and Power ISA has not. Three additional FP-related sets are needed
46 (missing from SFFS) -
47 [int_fp_mv](https://libre-soc.org/openpower/sv/int_fp_mv/)
48 [fclass](https://libre-soc.org/openpower/sv/fclass/) and
49 [fcvt](https://libre-soc.org/openpower/sv/fcvt/)
50 and one set named
51 [crweird](https://libre-soc.org/openpower/sv/cr_int_predication/)
52 increase the capability of CR Fields.
53
54 *Thus it becomes necesary to consider the Architectural Resource
55 Allocation of not just Simple-V but the 80-100 Scalar instructions all
56 at the same time*.
57
58 It is also critical to note that Simple-V **does not modify the Scalar
59 Power ISA**, that **only** Scalar words may be
60 Vectorised, and that Vectorised instructions are **not** permitted to be
61 different from their Scalar words.
62 The sole exception to that is Vectorised
63 Branch Conditional, in order to provide the usual Advanced Branching
64 capability present in every Commercial 3D GPU ISA, but it
65 is the *Vectorised* Branch-Conditional that is augmented, not Scalar
66 Branch.
67
68 # Extension Levels
69
70 Simple-V has been subdivided into levels akin to the Power ISA Compliancy
71 Levels. For now let us call them "SV Extension Levels" to differentiate
72 the two. The reason for the
73 [SV Extension Levels](https://libre-soc.org/openpower/sv/compliancy_levels/)
74 is the same as for the
75 Power ISA Compliancy Levels (SFFS, SFS): to not overburden implementors
76 with features that they do not need. *There is no dependence between
77 the two types of Levels*. The resources below therefore are
78 not all required for all SV Extension Levels but they are all required
79 to be reserved.
80
81 # Binary Interoperability
82
83 Power ISA has a reputation as being long-term stable.
84 **Simple-V guarantees binary interoperability** by defining fixed
85 register file bitwidths and size for all instructions.
86 The seduction of permitting different implementors to choose a register file
87 bitwidth and size with the same instructions unfortunately has
88 the catastrophic side-effect of introducing not only binary incompatibility
89 but silent data corruption as well as no means to trap-and-emulate differing
90 bitwidths.[^vsx256]
91
92 Thus "Silicon-Partner" Scalability
93 is prohibited in the Simple-V Scalable Vector ISA,
94 This does
95 mean that `RESERVED` space is crucial to have, in order
96 to safely provide future expanded register file bitwidths and sizes[^msr]
97 **at the discretion of and with the full authority of the OPF ISA WG**,
98 not the implementor ("Silicon Partner").
99
100 # Hardware Implementations
101
102 The fundamental principle of Simple-V is that it sits between Issue and
103 Decode, pausing the Program-Counter to service a "Sub-PC"
104 hardware for-loop. This is very similar to "Zero-Overhead Loops"
105 in High-end DSPs (TI MSP Series).
106
107 Considerable effort has been expended to ensure that Simple-V is
108 practical to implement on an extremely wide range of Industry-wide
109 common **Scalar** micro-architectures. Finite State Machine (for
110 ultra-low-resource and Mission-Critical), In-order single-issue, all the
111 way through to Great-Big Out-of-Order Superscalar Multi-Issue. The
112 SV Extension Levels specifically recognise these differing scenarios.
113
114 SIMD back-end ALUs particularly those with element-level predicate
115 masks may be exploited to good effect with very little additional
116 complexity to achieve high throughput, even on a single-issue in-order
117 microarchitecture. As usually becomes quickly apparent with in-order, its
118 limitations extend also to when Simple-V is deployed, which is why
119 Multi-Issue Out-of-Order is the recommended (but not mandatory) Scalar
120 Micro-architecture.
121
122 The only major concern is in the upper SV Extension Levels: the Hazard
123 Management for increased number of Scalar Registers to 128 (in current
124 versions) but given that IBM POWER9/10 has VSX register numbering 64,
125 and modern GPUs have 128, 256 amd even 512 registers this was deemed
126 acceptable. Strategies do exist in hardware for Hazard Management of
127 such large numbers of registers, even for Multi-Issue microarchitectures.
128
129 # Simple-V Architectural Resources
130
131 * No new Interrupt types are required.
132 (**No modifications to existing Power ISA opcodes are required either**).
133 * GPR FPR and CR Field Register extend to 128. A future
134 version may extend to 256 or beyond[^extend] or also extend VSX[^futurevsx]
135 * 24-bits are needed within the main SVP64 Prefix (equivalent to a 2-bit XO)
136 * Another 24-bit (a second 2-bit XO) is needed for a planned future encoding,
137 currently named "SVP64-Single"[^likeext001]
138 * A third 24-bits (third 2-bit XO) is strongly recommended to be `RESERVED`
139 such that future unforeseen capability is needed (although this may be
140 alternatively achieved with a mandatory PCR or MSR bit)
141 * To hold all Vector Context, five SPRs are needed for userspace.
142 If Supervisor and Hypervisor mode are to
143 also support Simple-V they will correspondingly need five SPRs each.
144 (Some 32/32-to-64 aliases are advantageous but not critical).
145 * Five 6-bit XO (A-Form) "Management" instructions are needed. These are
146 Scalar 32-bit instructions and *may* be 64-bit-extended in future
147 (safely within the SVP64 space: no need for an EXT001 encoding).
148
149 **Summary of Simple-V Opcode space**
150
151 * 75% of one Major Opcode (equivalent to the rest of EXT017)
152 * Five 6-bit XO 32-bit operations.
153
154 No further opcode space *for Simple-V* is envisaged to be required for
155 at least the next decade (including if added on VSX)
156
157 **Simple-V SPRs**
158
159 * **SVSTATE** - Vectorisation State sufficient for Precise-Interrupt
160 Context-switching and no adverse latency.
161 * **SVSRR0** - identical in purpose to SRR0/1: storing SVSTATE on context-switch
162 along-side MSR and PC.
163 * **SVSHAPE0-3** - these are 32-bit and may be grouped in pairs, they REMAP
164 (shape) the Vectors
165 * **SVLR** - again similar to LR for exactly the same purpose, SVSTATE
166 is swapped with SVLR by SV-Branch-Conditional for exactly the same
167 reason that NIA is swapped with LR
168
169 **Vector Management Instructions**
170
171 These fit into QTY 5of 6-bit XO 32-bit encoding (svshape and svshape2 share
172 the same space):
173
174 * **setvl** - Cray-style Scalar Vector Length instruction
175 * **svstep** - used for Vertical-First Mode and for enquiring about internal
176 state
177 * **svremap** - "tags" registers for activating REMAP
178 * **svshape** - convenience instruction for quickly setting up Matrix, DCT,
179 FFT and Parallel Reduction REMAP
180 * **svshape2** - additional convenience instruction to set up "Offset" REMAP
181 (fits within svshape's XO encoding)
182 * **svindex** - convenience instruction for setting up "Indexed" REMAP.
183
184 # SVP64 24-bit Prefixes
185
186 The SVP64 24-bit Prefix (RM) provides several options,
187 all fitting within the 24-bit space (and no other).
188 These Modes do not interact with SVSTATE per se. SVSTATE
189 primarily controls the looping (quantity, order), RM
190 influences the *elements* (the Suffix). There is however
191 some close interaction when it comes to predication.
192 REMAP is separately
193 outlined in another section.
194
195 The primary options all of which are aimed at reducing instruction
196 count and reducing assembler complexity are:
197
198 * element-width overrides, which dynamically redefine each SFFS or SFS
199 Scalar prefixed instruction to be 8-bit, 16-bit, 32-bit or 64-bit
200 operands **without requiring new 8/16/32 instructions.**[^pseudorewrite]
201 This results in full BF16 and FP16 opcodes being added to the Power ISA
202 **without adding BF16 or FP16 opcodes** including full conversion
203 between all formats.
204 * predication. this is an absolutely essential feature for a 3D GPU VPU ISA.
205 CR Fields are available as Predicate Masks hence the reason for their
206 extension to 128. Twin-Predication is also provided: this may best
207 be envisaged as back-to-back VGATHER-VSCATTER but is not restricted
208 to LD/ST, its use saves on instruction count. Enabling one or other
209 of the predicates provides all of the other types of operations
210 found in Vector ISAs (VEXTRACT, VINSERT etc) again with no need
211 to actually provide explicit such instructions.
212 * Saturation. **all** LD/ST and Arithmetic and Logical operations may
213 be saturated (without adding explicit scalar saturated opcodes)
214 * Reduction and Prefix-Sum (Fibonnacci Series) Modes
215 * vec2/3/4 "Packing" and "Unpacking" (similar to VSX `vpack` and `vpkss`)
216 accessible in a way that is easier than REMAP, added for the same reasons
217 that drove `vpack` and `vpkss` etc. to be added: pixel, audio, and 3D
218 data manipulation. With Pack/Unpack being part of SVSTATE it can be
219 applied *in-place* saving register file space (no copy/mv needed).
220 * Load/Store speculative "fault-first" behaviour, identical to ARM and RVV
221 Fault-first: provides auto-truncation of a speculative LD/ST helping
222 solve the "SIMD Considered Harmful" stripmining problem from a Memory
223 Access perspective.
224 * Data-Dependent Fail-First: a 100% Deterministic extension of the LDST
225 ffirst concept: first `Rc=1 BO test` failure terminates looping and
226 truncates VL to that exact point. Useful for implementing algorithms
227 such as `strcpy` in around 14 high-performance Vector instructions, the
228 option exists to include or exclude the failing element.
229 * Predicate-result: a strategic mode that effectively turns all and any
230 operations into a type of `cmp`. An `Rc=1 BO test` is performed and if
231 failing the result is **not** written to the regfile. The `Rc=1`
232 Vector of co-results **is** always written (subject to predication).
233 Termed "predicate-result" because the combination of producing then
234 testing a result is as if the test was in a follow-up predicated
235 copy/mv operation, it reduces regfile pressure and instruction count.
236 Also useful on saturated or other overflowing operations, the overflowing
237 elements may be excluded from outputting to the regfile then
238 post-analysed outside of critical hot-loops.
239
240 **RM Modes**
241
242 There are five primary categories of instructions in Power ISA, each of
243 which needed slightly different Modes. For example, saturation and
244 element-width overrides are meaningless to Condition Register Field
245 operations, and Reduction is meaningless to LD/ST but Saturation
246 saves register file ports in critical hot-loops. Thus the 24 bits may
247 be suitably adapted to each category.
248
249 * Normal - arithmetic and logical including IEEE754 FP
250 * LD/ST immediate - includes element-strided and unit-strided
251 * LD/ST indexed
252 * CR Field ops
253 * Branch-Conditional - saves on instruction count in 3D parallel if/else
254
255 It does have to be pointed out that there is huge pressure on the
256 Mode bits. There was therefore insufficient room, unlike the way that
257 EXT001 was designed, to provide "identifying bits" *without first partially
258 decoding the Suffix*. This should in no way be conflated with or taken
259 as an indicator that changing the meaning of the Suffix is performed
260 or desirable.
261
262 Some considerable care has been taken to ensure that Decoding may be
263 performed in a strict forward-pipelined fashion that, aside from changes in
264 SVSTATE and aside from the initial 32/64 length detection (also kept simple),
265 a Multi-Issue Engine would have no difficulty (performance maximisable).
266 With the initial partial RM identification
267 decode performed above the Vector operations may easily be passed downstream
268 to independent parallel units for further analysis.
269
270 **Vectorised Branch-Conditional**
271
272 As mentioned in the introduction this is the one sole instruction group
273 that
274 is different pseudocode from its scalar equivalent. However even there
275 its various Mode bits and options can be set such that in the degenerate
276 case the behaviour becomes identical to Scalar Branch-Conditional.
277
278 The two additional Modes within Vectorised Branch-Conditional, both of
279 which may be combined, are `CTR-Mode` and `VLI-Test` (aka "Data Fail First").
280 CTR Mode extends the way that CTR may be decremented unconditionally
281 within Scalar Branch-Conditional, and not only makes it conditional but
282 also interacts with predication. VLI-Test provides the same option
283 as Data-Dependent Fault-First to Deterministically truncate the Vector
284 Length at the fail **or success** point.
285
286 Boolean Logic rules on sets (treating the Vector of CR Fields to be tested by
287 `BO` as a set) dictate that the Branch should take place on either 'ALL'
288 tests succeeding (or failing) or whether 'SOME' tests succeed (or fail).
289 These options provide the ability to cover the majority of Parallel
290 3D GPU Conditions, saving a not inconsiderable number of instructions
291 especially given the close interaction with CTR in hot-loops.
292
293 Also `SVLR` is introduced, which is a parallel twin of `LR`, and saving
294 and restoring of LR and SVLR may be deferred until the final decision
295 as to whether to branch. In this way `sv.bclrl` does not corrupt `LR`.
296
297 **SVP64Single**
298
299 The `SVP64-Single` 24-bit encoding focusses primarily on ensuring that
300 all 128 Scalar registers are fully accessible, provides element-width
301 overrides, one-bit predication
302 and brings Saturation to all existing Scalar operations.
303 BF16 and FP16 are thus
304 provided in the Scalar Power ISA without one single explicit FP16 or BF16
305 32-bit opcode being added. The downside: such Scalar operations are
306 all 64-bit encodings.
307
308 # Vertical-First Mode
309
310 This is a Computer Science term that needed first to be invented.
311 There exists only one other Vertical-First Vector ISA in the world:
312 Mitch Alsup's VVM Extension for the 66000. Several people have
313 independently derived Vertical-First: it simply did not have a
314 Computer Science term associated with it.
315
316 If we envisage register and Memory layout to be Horizontal and
317 instructions to be Vertical, and to then have some form of Loop
318 System (wherther Zero-Overhead or just branch-conditional based)
319 it is easier to then conceptualise VF vs HF Mode:
320
321 * Vertical-First progresses through *instructions* first before
322 moving on to the next *register* (or Memory-address in the case
323 of Mitch Alsup's VVM).
324 * Horizontal-First (also known as Cray-style Vectors) progresses
325 through **registers** (or, register *elements* in traditional
326 Cray-Vector ISAs) in full before moving on to the next instruction.
327
328 Mitch Alsup's VVM Extension is a form of hardware-level auto-vectorisation
329 based around Zero-Overhead Loops. Using a Variable-Length Encoding all
330 loop-invariant registers are "tagged" such that the Hazard Management
331 Engine may perform optimally and do less work in automatically identifying
332 parallelism opportunities.
333 With it not being appropriate to use Variable-Length Encoding in the Power
334 ISA a different much more explicit strategy was taken in Simple-V.
335
336 The biggest advantage inherent in Vertical-First is that it is very easy
337 to introduce into compilers, because all looping, as far as the architecture
338 is concerned, remains expressed as *Scalar assembler*. Whilst Mitch Alsup's
339 VVM advocates auto-vectorisation and is limited in its ability to call
340 functions, Simple-V's Vertical-First provides explicit control over the
341 parallelism ("hphint") and also allows for full state to be stored/restored
342 (SVLR combined with LR), permitting full function calls to be made.
343
344 Simple-V Vertical-First Looping requires an explicit instruction to
345 move `SVSTATE` regfile offsets forward: `svstep`. An early version of
346 Vectorised
347 Branch-Conditional attempted to merge the functionality of `svstep`
348 into `sv.bc`: it became CISC-like and was reverted.
349
350 \newpage{}
351 # Simple-V REMAP subsystem
352
353 [REMAP](https://libre-soc.org/openpower/sv/remap)
354 is extremely advanced but brings features already present in other
355 DSPs and Supercomputing ISAs.
356
357 * **DCT/FFT** REMAP brings more capability than TI's MSP-Series DSPs and
358 Qualcom Hexagon DSPs, and is not restricted to Integer or FP.
359 (Galois Field is possible, implementing NTT). Operates *in-place*
360 significantly reducing register usage.
361 * **Matrix** REMAP brings more capability than any other Matrix Extension
362 (AMD GPUs, Intel, ARM), not being restricted to Power-2 sizes. Also not
363 limited to the type of operation, it may perform Warshall Transitive
364 Closure, Integer Matrix, Bitmanipulation Matrix, Galois Field (carryless
365 mul) Matrix, and with care potentially Graph Maximum Flow as well. Also
366 suited to Convolutions, Matrix Transpose and rotate, *all* of which is
367 in-place.
368 * **General-purpose Indexed** REMAP, this option is provided to implement
369 an equivalent of VSX `vperm`
370 * **Parallel Reduction** REMAP, performs an automatic map-reduce using
371 *any suitable scalar operation*.
372
373 # Scalar Operations
374
375 The primary reason for mentioning the additional Scalar operations
376 is because they are so numerous, with Power ISA not having advanced
377 in the *general purpose* compute area in the past 12 years, that some
378 considerable care is needed.
379
380 Summary:
381 **Including Simple-V, to fit everything at least 75% of 3 separate
382 Major Opcodes would be required**
383
384 Candidates (for all but the X-Form instructions) include:
385
386 * EXT006 (80% free)
387 * EXT017 (75% free but not recommended)
388 * EXT001 (50% free)
389 * EXT009 (100% free)
390 * EXT005 (100% free)
391 * brownfield space in EXT019 (25% but NOT recommended)
392
393 SVP64, SVP64-Single and SVP64-Reserved would require on their own each 25%
394 of one Major Opcode for a total of 75% of one Major Opcode. The remaining
395 **Scalar** opcodes, due to there being two separate sets of operations
396 with 16-bit immediates, will require the other space totalling two 75%
397 Majors.
398
399 Note critically that:
400
401 * Unlike EXT001, SVP64's 24-bits may **not** hold also any Scalar
402 operations. There is no free available space: a 25th bit would
403 be required. The entire 24-bits is **required** for the abstracted
404 Hardware-Looping Concept **even when these 24-bits are zero**
405 * Any Scalar 64-bit instruction (regardless of how it is encoded) is unsafe to
406 then Vectorise because this creates the situation of Prefixed-Prefixed,
407 resulting in deep complexity in Hardware Decode at a critical juncture, as
408 well as introducing 96-bit instructions.
409 * **All** of these Scalar instructions are candidates for Vectorisation.
410 Thus none of them may be 64-bit-Scalar-only.
411
412 **Minor Opcodes to fit candidates above**
413
414 In order of size, for bitmanip and A/V DSP purposes:
415
416 * QTY 3of 2-bit XO: ternlogi, crternlogi, grevlogi
417 * QTY 7of 3-bit XO: xpermi, binlut, grevlog, swizzle-mv/fmv, bitmask, bmrevi
418 * QTY 8of 5/6-bit (A-Form): xpermi, bincrflut, bmask, fmvis, fishmv, bmrev,
419 Galois Field
420 * QTY 30of 10-bit (X-Form): cldiv/mul, av-min/max/diff, absdac, xperm etc.
421 (easily fit EXT019, EXT031).
422
423 Note: Some of the Galois Field operations will require QTY 1of Polynomial
424 SPR (per userspace supervisor hypervisor).
425
426 **EXT004**
427
428 For biginteger math, two instructions in the same space as "madd" are to
429 be proposed. They are both 3-in 2-out operations taking or producing a
430 64-bit "pair" (like RTp), and perform 128/64 mul and div/mod operations
431 respectively. These are **not** the same as VSX operations which are
432 128/128, and they are **not** the same as existing Scalar mul/div/mod,
433 all of which are 64/64 (or 64/32).
434
435 **EXT059 and EXT063**
436
437 Additionally for High-Performance Compute and Competitive 3D GPU, IEEE754 FP
438 Transcendentals are required, as are some DCT/FFT "Twin-Butterfly" operations.
439 For each of EXT059 and EXT063:
440
441 * QTY 33of X-Form "1-argument" (fsin, fsins, fcos, fcoss)
442 * QTY 15of X-Form "2-argument" (pow, atan2, fhypot)
443 * QTY 5of A-Form "3-in 2-out" FP Butterfly operations for DCT/FFT
444 * QTY 8of X-Form "2-in 2-out" FP Butterfly operations (again for DCT/FFT)
445 * An additional 16 instructions for IEEE754-2019
446 (fminss/fmaxss, fminmag/fmaxmag)
447 [under evaluation](https://bugs.libre-soc.org/show_bug.cgi?id=923)
448 as of 08Sep2022
449
450 \newpage{}
451 # Potential Opcode allocation solution
452
453 There are unfortunately some inviolate requirements that directly place
454 pressure on the EXT000-EXT063 (32-bit) opcode space to such a degree that
455 it risks jeapordising the Power ISA. These requirements are:
456
457 * all of the scalar operations must be Vectoriseable
458 * all of the scalar operations intended for Vectorisation
459 must be in a 32-bit encoding (not prefixed-prefixed to 96-bit)
460 * bringing Scalar Power ISA up-to-date from the past 12 years
461 needs 75% of two Major opcodes all on its own
462
463 There exists a potential scheme which meets (exceeds) the above criteria,
464 providing plenty of room for both Scalar (and Vectorised) operations,
465 *and* provides SVP64-Single with room to grow. It
466 is based loosely around Public v3.1 EXT001 Encoding.[^ext001]
467
468 | 0-5 | 6 | 7 | 8-31 | Description |
469 |-----|---|---|-------|---------------------------|
470 | PO | 0 | 0 | 0000 | new-suffix `RESERVED1` |
471 | PO | 0 | 0 | !zero | new-suffix, scalar (SVP64Single) |
472 | PO | 1 | 0 | 0000 | new scalar-only word, or `RESERVED2` |
473 | PO | 1 | 0 | !zero | old-suffix, scalar (SVP64Single) |
474 | PO | 0 | 1 | nnnn | new-suffix, vector (SVP64) |
475 | PO | 1 | 1 | nnnn | old-suffix, vector (SVP64) |
476
477 * **PO** - Primary Opcode. Likely candidates: EXT005, EXT009
478 * **bit 6** - specifies whether the suffix is old (EXT000-EXT063)
479 or new (EXTn00-EXTn63, n greater than 1)
480 * **bit 7** - defines whether the Suffix is Scalar-Prefixed or Vector-Prefixed
481 (caveat: see bits 8-31)
482 * **old-suffix** - the EXT000 to EXT063 32-bit Major opcodes of Power ISA 3.0
483 * **new scalar-only** - a **new** Major Opcode area **exclusively**
484 for Scalar-only instructions that shall **never** be Prefixed by SVP64
485 (RESERVED2 EXT300-EXT363)
486 * **new-suffix** - a **new** Major Opcode area (RESERVED1 EXT200-EXT263)
487 that **may** be Prefixed by SVP64 and SVP64Single
488 * **0000** - all 24 bits bits 8-31 are zero (0x000000)
489 * **!zero** - bits 8-31 may be any value *other* than zero (0x000001-0xffffff)
490 * **nnnn** - bits 8-31 may be any value in the range 0x000000 to 0xffffff
491 * **SVP64Single** - a ([TBD](https://bugs.libre-soc.org/show_bug.cgi?id=905))
492 *Scalar* Encoding that is near-identical to SVP64
493 except that it is equivalent to hard-coded VL=1
494 at all times. Predication is permitted, Element-width-overrides is
495 permitted, Saturation is permitted.
496 * **SVP64** - a (well-defined, 2 years) DRAFT Proposal for a Vectorisation
497 Augmentation of suffixes.
498
499 For the needs identified by Libre-SOC (75% of 2 POs),
500 `RESERVED1` space *needs*
501 allocation to new POs, `RESERVED2` does not.[^only2]
502
503 | | Scalar (bit7=0,8-31=0000) | Scalar (bit7=0,8-31=!zero)| Vector (bit7=1) |
504 |----------|---------------------------|---------------------------|------------------|
505 |new bit6=0| `RESERVED1`:{EXT200-263} | SVP64-Single:{EXT200-263} | SVP64:{EXT200-263} |
506 |old bit6=1| `RESERVED2`:{EXT300-363} | SVP64-Single:{EXT000-063} | SVP64:{EXT000-063} |
507
508 * **`RESERVED2`:{EXT300-363}** (not strictly necessary to be added) is not
509 and **cannot** ever be Vectorised or Augmented by Simple-V or any future
510 Simple-V Scheme.
511 it is a pure **Scalar-only** word-length PO Group. It may remain `RESERVED`.
512 * **`RESERVED1`:{EXT200-263}** is also a new set of 64 word-length Major
513 Opcodes.
514 These opcodes do not *need* to be Simple-V-Augmented
515 *but the option to do so exists* should an Implementor choose to do so.
516 This is unlike `EXT300-363` which may **never** be Simple-V-Augmented
517 under any circumstances.
518 * **`SVP64-Single:{EXT200-263}`** - Major opcodes 200-263 with
519 Single-Augmentation, providing a one-bit predicate mask, element-width
520 overrides on source and destination, and the option to extend the Scalar
521 Register numbering (r0-32 extends to r0-127). **Placing of alternative
522 instruction encodings other than those exactly defined in EXT200-263
523 is prohibited**.
524 * **`SVP64-Single:{EXT000-063}`** - Major opcodes 000-063 with
525 Single-Augmentation, just like SVP64-Single on EXT200-263, these are
526 in effect Single-Augmented-Prefixed variants of the v3.0 32-bit Power ISA.
527 Alternative instruction encodings other than the exact same 32-bit word
528 from EXT000-EXT063 are likewise prohibited.
529 * **`SVP64:{EXT000-063}`** and **`SVP64:{EXT200-263}`** - Full Vectorisation
530 of EXT000-063 and EXT200-263 respectively, these Prefixed instructions
531 are likewise prohibited from being a different encoding from their
532 32-bit scalar versions.
533
534 Limitations of this scheme is that new 32-bit Scalar operations have to have
535 a 32-bit "prefix pattern" in front of them. If commonly-used this could
536 increase binary size. Thus the Encodings EXT300-363 and EXT200-263 should
537 only be allocated for less-popular operations. However the scheme does
538 have the strong advantage of *tripling* the available number of Major
539 Opcodes in the Power ISA, caveat being that care on allocation is needed
540 because EXT200-EXT263 may be SVP64-Augmented whilst EXT300-EXT363 may **not**.
541 The issues of allocation for bitmanip etc. from Libre-SOC is therefore
542 overwhelmingly made moot. The only downside is that there is no
543 `SVP64-Reserved` which will have to be achieved with SPRs (PCR or MSR).
544
545 \newpage{}
546 **EXT000-EXT063**
547
548 These are Scalar word-encodings. Often termed "v3.0 Scalar" in this document
549 Power ISA v3.1 Section 1.6.3 Book I calls it a "defined word".
550
551 | 0-5 | 6-31 |
552 |--------|--------|
553 | PO | EXT000-063 Scalar (v3.0 or v3.1) operation |
554
555 **RESERVED2 / EXT300-363** bit6=old bit7=scalar
556
557 This is entirely at the discretion of the ISA WG. Libre-SOC is *not*
558 proposing the addition of EXT300-363: it is merely a possibility for
559 future. The reason the space is not needed is because this is within
560 the realm of Scalar-extended (SVP64Single), and with the 24-bit prefix
561 area being all-zero (bits 8-31) this is defined as "having no augmentation"
562 (in the Simple-V Specification it is termed `Scalar Identity Behaviour`).
563 This in turn makes this prefix a *degenerate duplicate* so may be allocated
564 for other purposes.
565
566 | 0-5 | 6 | 7 | 8-31 | 32-63 |
567 |--------|---|---|-------|---------|
568 | PO (9)?| 1 | 0 | 0000 | EXT300-363 or `RESERVED1` |
569
570 **{EXT200-263}** bit6=new bit7=scalar
571
572 This encoding represents the opportunity to introduce EXT200-263.
573 It is a Scalar-word encoding, and does not require implementing
574 SVP64 or SVP64-Single.
575 PO2 is in the range 0b00000 to 0b11111 to represent EXT200-263 respectively.
576
577 | 0-5 | 6 | 7 | 8-31 | 32-37 | 38-63 |
578 |--------|---|---|-------|--------|---------|
579 | PO (9)?| 0 | 0 | 0000 | PO2 | {EXT200-263} |
580
581 **SVP64Single:{EXT200-263}** bit6=new bit7=scalar
582
583 This encoding, which is effectively "implicit VL=1"
584 and comprising (from bits 8-31)
585 *at least some* form of Augmentation, it represents the opportunity
586 to Augment EXT200-263 with the SVP64Single capabilities.
587 Instructions may not be placed in this category without also being
588 implemented as pure Scalar.
589
590 | 0-5 | 6 | 7 | 8-31 | 32-37 | 38-63 |
591 |--------|---|---|-------|--------|---------|
592 | PO (9)?| 0 | 0 | !zero | PO2 | SVP64Single:{EXT200-263} |
593
594 **SVP64Single:{EXT000-063}** bit6=old bit7=scalar
595
596 This encoding, identical to SVP64Single:{EXT200-263},
597 introduces SVP64Single Augmentation of v3.0 Scalar word instructions.
598 All meanings must be identical to EXT000 to EXT063, and is is likewise
599 prohibited to add an instruction in this area without also adding
600 the exact same (non-Augmented) instruction in EXT000-063 with the
601 exact same Scalar word.
602 PO2 is in the range 0b00000 to 0b11111 to represent EXT000-063 respectively.
603 Augmenting EXT001 is prohibited.
604
605 | 0-5 | 6 | 7 | 8-31 | 32-37 | 38-63 |
606 |--------|---|---|-------|--------|---------|
607 | PO (9)?| 1 | 0 | !zero | PO2 | SVP64Single:{EXT000-063} |
608
609 **SVP64:{EXT200-263}** bit6=new bit7=vector
610
611 This encoding, which permits VL to be dynamic (settable from GPR or CTR)
612 is the Vectorisation of EXT200-263.
613 Instructions may not be placed in this category without also being
614 implemented as pure Scalar *and* SVP64Single. Unlike SVP64Single
615 however, there is **no reserved encoding** (bits 8-24 zero).
616 VL=1 may occur dynamically
617 at runtime, even when bits 8-31 are zero.
618
619 | 0-5 | 6 | 7 | 8-31 | 32-37 | 38-63 |
620 |--------|---|---|-------|--------|---------|
621 | PO (9)?| 0 | 1 | nnnn | PO2 | SVP64:{EXT200-263} |
622
623 **SVP64:{EXT000-063}** bit6=old bit7=vector
624
625 This encoding is identical to **SVP64:{EXT200-263}** except it
626 is the Vectorisation of existing v3.0/3.1 Scalar-words, EXT000-063.
627 All the same rules apply with the addition that
628 Vectorisation of EXT001 is prohibited.
629
630 | 0-5 | 6 | 7 | 8-31 | 32-37 | 38-63 |
631 |--------|---|---|-------|--------|---------|
632 | PO (9)?| 1 | 1 | nnnn | PO2 | SVP64:{EXT000-063} |
633
634 \newpage{}
635 # Use cases
636
637 In the following examples the programs are fully executable under the
638 Libre-SOC Simple-V-augmented Power ISA Simulator. Reproducible
639 (scripted) Installation instructions:
640 <https://libre-soc.org/HDL_workflow/devscripts/>
641
642 ## LD/ST-Multi
643
644 Context-switching saving and restoring of registers on the stack often
645 requires explicit loop-unrolling to achieve effectively. In SVP64 it
646 is possible to use a Predicate Mask to "compact" or "expand" a swathe
647 of desired registers, dynamically. Known as "VCOMPRESS" and "VEXPAND",
648 runtime-configurable LD/ST-Multi is achievable with 2 instructions.
649
650 ```
651 # load 64 registers off the stack, in-order, skipping unneeded ones
652 # by using CR0-CR63's "EQ" bits to select only those needed.
653 setvli 64
654 sv.ld/sm=EQ *rt,0(ra)
655 ```
656
657 ## Twin-Predication, re-entrant
658
659 This example demonstrates two key concepts: firstly Twin-Predication
660 (separate source predicate mask from destination predicate mask) and
661 that sufficient state is stored within the Vector Context SPR, SVSTATE,
662 for full re-entrancy on a Context Switch or function call *even if
663 in the middle of executing a loop*. Also demonstrates that it is
664 permissible for a programmer to write **directly** to the SVSTATE
665 SPR, and still expect Deterministic Behaviour. It's not exactly recommended
666 (performance may be impacted by direct SVSTATE access), but it is not
667 prohibited either.
668
669 ```
670 292 # checks that we are able to resume in the middle of a VL loop,
671 293 # after an interrupt, or after the user has updated src/dst step
672 294 # let's assume the user has prepared src/dst step before running this
673 295 # vector instruction
674 296 # test_intpred_reentrant
675 297 # reg num 0 1 2 3 4 5 6 7 8 9 10 11 12
676 298 # srcstep=1 v
677 299 # src r3=0b0101 Y N Y N
678 300 # : |
679 301 # + - - + |
680 302 # : +-------+
681 303 # : |
682 304 # dest ~r3=0b1010 N Y N Y
683 305 # dststep=2 ^
684 306
685 307 sv.extsb/sm=r3/dm=~r3 *5, *9
686 ```
687
688 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_predication.py;hb=HEAD>
689
690 ## 3D GPU style "Branch Conditional"
691
692 (*Note: Specification is ready, Simulator still under development of
693 full specification capabilities*)
694 This example demonstrates a 2-long Vector Branch-Conditional only
695 succeeding if *all* elements in the Vector are successful. This
696 avoids the need for additional instructions that would need to
697 perform a Parallel Reduction of a Vector of Condition Register
698 tests down to a single value, on which a Scalar Branch-Conditional
699 could then be performed. Full Rationale at
700 <https://libre-soc.org/openpower/sv/branches/>
701
702 ```
703 80 # test_sv_branch_cond_all
704 81 for i in [7, 8, 9]:
705 83 addi 1, 0, i+1 # set r1 to i
706 84 addi 2, 0, i # set r2 to i
707 85 cmpi cr0, 1, 1, 8 # compare r1 with 10 and store to cr0
708 86 cmpi cr1, 1, 2, 8 # compare r2 with 10 and store to cr1
709 87 sv.bc/all 12, *1, 0xc # bgt 0xc - branch if BOTH
710 88 # r1 AND r2 greater 8 to the nop below
711 89 addi 3, 0, 0x1234, # if tests fail this shouldn't execute
712 90 or 0, 0, 0 # branch target
713 ```
714
715 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_bc.py;hb=HEAD>
716
717 \newpage{}
718 ## DCT
719
720 DCT has dozens of uses in Audio-Visual processing and CODECs.
721 A full 8-wide in-place triple-loop Inverse DCT may be achieved
722 in 8 instructions. Expanding this to 16-wide is a matter of setting
723 `svshape 16` **and the same instructions used**.
724 Lee Composition may be deployed to construct non-power-two DCTs.
725 The cosine table may be computed (once) with 18 Vector instructions
726 (one of them `fcos`)
727
728 ```
729 1014 # test_sv_remap_fpmadds_ldbrev_idct_8_mode_4
730 1015 # LOAD bit-reversed with half-swap
731 1016 svshape 8, 1, 1, 14, 0
732 1017 svremap 1, 0, 0, 0, 0, 0, 0
733 1018 sv.lfs/els *0, 4(1)
734 1019 # Outer butterfly, iterative sum
735 1020 svremap 31, 0, 1, 2, 1, 0, 1
736 1021 svshape 8, 1, 1, 11, 0
737 1022 sv.fadds *0, *0, *0
738 1023 # Inner butterfly, twin +/- MUL-ADD-SUB
739 1024 svshape 8, 1, 1, 10, 0
740 1025 sv.ffmadds *0, *0, *0, *8
741 ```
742
743 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_dct.py;hb=HEAD>
744
745 ## Matrix Multiply
746
747 Matrix Multiply of any size (non-power-2) up to a total of 127 operations
748 is achievable with only three instructions. Normally in any other SIMD
749 ISA at least one source requires Transposition and often massive rolling
750 repetition of data is required. These 3 instructions may be used as the
751 "inner triple-loop kernel" of the usual 6-loop Massive Matrix Multiply.
752
753 ```
754 28 # test_sv_remap1 5x4 by 4x3 matrix multiply
755 29 svshape 5, 4, 3, 0, 0
756 30 svremap 31, 1, 2, 3, 0, 0, 0
757 31 sv.fmadds *0, *8, *16, *0
758 ```
759
760 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_matrix.py;hb=HEAD>
761
762 ## Parallel Reduction
763
764 Parallel (Horizontal) Reduction is often deeply problematic in SIMD and
765 Vector ISAs. Parallel Reduction is Fully Deterministic in Simple-V and
766 thus may even usefully be deployed on non-associative and non-commutative
767 operations.
768
769 ```
770 75 # test_sv_remap2
771 76 svshape 7, 0, 0, 7, 0
772 77 svremap 31, 1, 0, 0, 0, 0, 0 # different order
773 78 sv.subf *0, *8, *16
774 79
775 80 REMAP sv.subf RT,RA,RB - inverted application of RA/RB
776 81 left/right due to subf
777 ```
778
779 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_parallel_reduce.py;hb=HEAD>
780
781 [[!tag opf_rfc]]
782
783 [^msr]: an MSR bit or bits, conceptually equivalent to `MSR.SF` and added for the same reasons, would suffice perfectly.
784 [^extend]: Prefix opcode space (or MSR bits) **must** be reserved in advance to do so, in order to avoid the catastrophic binary-incompatibility mistake made by RISC-V RVV and ARM SVE/2
785 [^likeext001]: SVP64-Single is remarkably similar to the "bit 1" of EXT001 being set to indicate that the 64-bits is to be allocated in full to a new encoding, but in fact SVP64-single still embeds v3.0 Scalar operations.
786 [^pseudorewrite]: elwidth overrides does however mean that all SFS / SFFS pseudocode will need rewriting to be in terms of XLEN. This has the indirect side-effect of automatically making a 32-bit Scalar Power ISA Specification possible, as well as a future 128-bit one (Cross-reference: RISC-V RV32 and RV128
787 [^only2]: reminder that this proposal only needs 75% of two POs for Scalar instructions. The rest of EXT200-263 is for general use.
788 [^ext001]: Recall that EXT100 to EXT163 is for Public v3.1 64-bit-augmented Operations prefixed by EXT001, for which, from Section 1.6.3, bit 6 is set to 1. This concept is where the above scheme originated. Section 1.6.3 uses the term "defined word" to refer to pre-existing EXT000-EXT063 32-bit instructions so prefixed to create the new numbering EXT100-EXT163, respectively
789 [^futurevsx]: A future version or other Stakeholder *may* wish to drop Simple-V onto VSX: this would be a separate RFC
790 [^vsx256]: imagine a hypothetical future VSX-256 using the exact same instructions as VSX. it would catstrophically damage existing IBM POWER8,9,10 hardware's reputation and that of Power ISA overall.