(no commit message)
[libreriscv.git] / openpower / sv / rfc / ls001.mdwn
1 # OPF ISA WG External RFC LS001 v2 14Sep2022
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 at the time.
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 (`addi` must use the same Word encoding
62 as `sv.addi`, and any new Prefixed instruction added **must** also
63 be added as Scalar).
64 The sole semi-exception is Vectorised
65 Branch Conditional, in order to provide the usual Advanced Branching
66 capability present in every Commercial 3D GPU ISA, but it
67 is the *Vectorised* Branch-Conditional that is augmented, not Scalar
68 Branch.
69
70 # Basic principle
71
72 The basic principle of Simple-V is to provide a Precise-Interruptible
73 Zero-Overhead Loop system with associated register "offsetting"
74 which augments a Suffixed instruction as a "template",
75 incrementing the register numbering progressively *and automatically*
76 each time round the "loop". Thus it may be considered to be a form
77 of "Sub-Program-Counter" and at its simplest level can replace a large
78 sequence of regularly-increasing loop-unrolled instructions with just two:
79 one to set the Vector length and one saying where to
80 start from in the regfile.
81
82 On this sound and profoundly simple concept which leverages *Scalar*
83 Micro-architectural capabilities much more comprehensive festures are
84 easy to add, working up towards an ISA that easily matches the capability
85 of powerful 3D GPU Vector Supercomputing ISAs, without ever adding even
86 one single Vector opcode.
87 The inspiration for this came from the fact that on examination of every
88 Vector ISA pseudocode encountered the Vector operations were expressed
89 as a for-loop on a Scalar element
90 operation, and then both a Scalar **and** a Vector instruction was added.
91
92 It felt natural to separate the two at both the ISA and the Hardware Level
93 and thus provide only Scalar instructions (instantly halving the number
94 of instructions), leaving it up to implementors
95 to implement Superscalar and Multi-Issue Micro-architectures at their
96 discretion.
97
98 # Extension Levels
99
100 Simple-V has been subdivided into levels akin to the Power ISA Compliancy
101 Levels. For now let us call them "SV Extension Levels" to differentiate
102 the two. The reason for the
103 [SV Extension Levels](https://libre-soc.org/openpower/sv/compliancy_levels/)
104 is the same as for the
105 Power ISA Compliancy Levels (SFFS, SFS): to not overburden implementors
106 with features that they do not need. *There is no dependence between
107 the two types of Levels*. The resources below therefore are
108 not all required for all SV Extension Levels but they are all required
109 to be reserved.
110
111 # Binary Interoperability
112
113 Power ISA has a reputation as being long-term stable.
114 **Simple-V guarantees binary interoperability** by defining fixed
115 register file bitwidths and size for all instructions.
116 The seduction of permitting different implementors to choose a register file
117 bitwidth and size with the same instructions unfortunately has
118 the catastrophic side-effect of introducing not only binary incompatibility
119 but silent data corruption as well as no means to trap-and-emulate differing
120 bitwidths.[^vsx256]
121
122 Thus "Silicon-Partner" Scalability
123 is prohibited in the Simple-V Scalable Vector ISA,
124 This does
125 mean that `RESERVED` space is crucial to have, in order
126 to safely provide the option of
127 future expanded register file bitwidths and sizes[^msr],
128 under explicitly-distinguishable encoding,
129 **at the discretion of and with the full authority of the OPF ISA WG**,
130 not the implementor ("Silicon Partner").
131
132 # Hardware Implementations
133
134 The fundamental principle of Simple-V is that it sits between Issue and
135 Decode, pausing the Program-Counter to service a "Sub-PC"
136 hardware for-loop. This is very similar to "Zero-Overhead Loops"
137 in High-end DSPs (TI MSP Series).
138
139 Considerable effort has been expended to ensure that Simple-V is
140 practical to implement on an extremely wide range of Industry-wide
141 common **Scalar** micro-architectures. Finite State Machine (for
142 ultra-low-resource and Mission-Critical), In-order single-issue, all the
143 way through to Great-Big Out-of-Order Superscalar Multi-Issue. The
144 SV Extension Levels specifically recognise these differing scenarios.
145
146 SIMD back-end ALUs particularly those with element-level predicate
147 masks may be exploited to good effect with very little additional
148 complexity to achieve high throughput, even on a single-issue in-order
149 microarchitecture. As usually becomes quickly apparent with in-order, its
150 limitations extend also to when Simple-V is deployed, which is why
151 Multi-Issue Out-of-Order is the recommended (but not mandatory) Scalar
152 Micro-architecture.
153
154 The only major concern is in the upper SV Extension Levels: the Hazard
155 Management for increased number of Scalar Registers to 128 (in current
156 versions) but given that IBM POWER9/10 has VSX register numbering 64,
157 and modern GPUs have 128, 256 amd even 512 registers this was deemed
158 acceptable. Strategies do exist in hardware for Hazard Management of
159 such large numbers of registers, even for Multi-Issue microarchitectures.
160
161 # Simple-V Architectural Resources
162
163 * No new Interrupt types are required.
164 No modifications to existing Power ISA opcodes are required.
165 No new Register Files are required (all because Simple-V is a category of
166 Zero-Overhead Looping on Scalar instructions)
167 * GPR FPR and CR Field Register extend to 128. A future
168 version may extend to 256 or beyond[^extend] or also extend VSX[^futurevsx]
169 * 24-bits are needed within the main SVP64 Prefix (equivalent to a 2-bit XO)
170 * Another 24-bit (a second 2-bit XO) is needed for a planned future encoding,
171 currently named "SVP64-Single"[^likeext001]
172 * A third 24-bits (third 2-bit XO) is strongly recommended to be `RESERVED`
173 such that future unforeseen capability is needed (although this may be
174 alternatively achieved with a mandatory PCR or MSR bit)
175 * To hold all Vector Context, five SPRs are needed for userspace.
176 If Supervisor and Hypervisor mode are to
177 also support Simple-V they will correspondingly need five SPRs each.
178 (Some 32/32-to-64 aliases are advantageous but not critical).
179 * Five 6-bit XO (A-Form) "Management" instructions are needed. These are
180 Scalar 32-bit instructions and *may* be 64-bit-extended in future
181 (safely within the SVP64 space: no need for an EXT001 encoding).
182
183 **Summary of Simple-V Opcode space**
184
185 * 75% of one Major Opcode (equivalent to the rest of EXT017)
186 * Five 6-bit XO 32-bit operations.
187
188 No further opcode space *for Simple-V* is envisaged to be required for
189 at least the next decade (including if added on VSX)
190
191 **Simple-V SPRs**
192
193 * **SVSTATE** - Vectorisation State sufficient for Precise-Interrupt
194 Context-switching and no adverse latency.
195 * **SVSRR0** - identical in purpose to SRR0/1: storing SVSTATE on context-switch
196 along-side MSR and PC.
197 * **SVSHAPE0-3** - these are 32-bit and may be grouped in pairs, they REMAP
198 (shape) the Vectors
199 * **SVLR** - again similar to LR for exactly the same purpose, SVSTATE
200 is swapped with SVLR by SV-Branch-Conditional for exactly the same
201 reason that NIA is swapped with LR
202
203 **Vector Management Instructions**
204
205 These fit into QTY 5of 6-bit XO 32-bit encoding (svshape and svshape2 share
206 the same space):
207
208 * **setvl** - Cray-style Scalar Vector Length instruction
209 * **svstep** - used for Vertical-First Mode and for enquiring about internal
210 state
211 * **svremap** - "tags" registers for activating REMAP
212 * **svshape** - convenience instruction for quickly setting up Matrix, DCT,
213 FFT and Parallel Reduction REMAP
214 * **svshape2** - additional convenience instruction to set up "Offset" REMAP
215 (fits within svshape's XO encoding)
216 * **svindex** - convenience instruction for setting up "Indexed" REMAP.
217
218 \newpage{}
219 # SVP64 24-bit Prefixes
220
221 The SVP64 24-bit Prefix (RM) provides several options,
222 all fitting within the 24-bit space (and no other).
223 These Modes do not interact with SVSTATE per se. SVSTATE
224 primarily controls the looping (quantity, order), RM
225 influences the *elements* (the Suffix). There is however
226 some close interaction when it comes to predication.
227 REMAP is separately
228 outlined in another section.
229
230 The primary options all of which are aimed at reducing instruction
231 count and reducing assembler complexity are:
232
233 * element-width overrides, which dynamically redefine each SFFS or SFS
234 Scalar prefixed instruction to be 8-bit, 16-bit, 32-bit or 64-bit
235 operands **without requiring new 8/16/32 instructions.**[^pseudorewrite]
236 This results in full BF16 and FP16 opcodes being added to the Power ISA
237 **without adding BF16 or FP16 opcodes** including full conversion
238 between all formats.
239 * predication. this is an absolutely essential feature for a 3D GPU VPU ISA.
240 CR Fields are available as Predicate Masks hence the reason for their
241 extension to 128. Twin-Predication is also provided: this may best
242 be envisaged as back-to-back VGATHER-VSCATTER but is not restricted
243 to LD/ST, its use saves on instruction count. Enabling one or other
244 of the predicates provides all of the other types of operations
245 found in Vector ISAs (VEXTRACT, VINSERT etc) again with no need
246 to actually provide explicit such instructions.
247 * Saturation. **all** LD/ST and Arithmetic and Logical operations may
248 be saturated (without adding explicit scalar saturated opcodes)
249 * Reduction and Prefix-Sum (Fibonnacci Series) Modes
250 * vec2/3/4 "Packing" and "Unpacking" (similar to VSX `vpack` and `vpkss`)
251 accessible in a way that is easier than REMAP, added for the same reasons
252 that drove `vpack` and `vpkss` etc. to be added: pixel, audio, and 3D
253 data manipulation. With Pack/Unpack being part of SVSTATE it can be
254 applied *in-place* saving register file space (no copy/mv needed).
255 * Load/Store speculative "fault-first" behaviour, identical to SVE and RVV
256 Fault-first: provides auto-truncation of a speculative sequential parallel
257 LD/ST batch, helping
258 solve the "SIMD Considered Harmful" stripmining problem from a Memory
259 Access perspective.
260 * Data-Dependent Fail-First: a 100% Deterministic extension of the LDST
261 ffirst concept: first `Rc=1 BO test` failure terminates looping and
262 truncates VL to that exact point. Useful for implementing algorithms
263 such as `strcpy` in around 14 high-performance Vector instructions, the
264 option exists to include or exclude the failing element.
265 * Predicate-result: a strategic mode that effectively turns all and any
266 operations into a type of `cmp`. An `Rc=1 BO test` is performed and if
267 failing that element result is **not** written to the regfile. The `Rc=1`
268 Vector of co-results **is** always written (subject to usual predication).
269 Termed "predicate-result" because the combination of producing then
270 testing a result is as if the test was in a follow-up predicated
271 copy/mv operation, it reduces regfile pressure and instruction count.
272 Also useful on saturated or other overflowing operations, the overflowing
273 elements may be excluded from outputting to the regfile then
274 post-analysed outside of critical hot-loops.
275
276 **RM Modes**
277
278 There are five primary categories of instructions in Power ISA, each of
279 which needed slightly different Modes. For example, saturation and
280 element-width overrides are meaningless to Condition Register Field
281 operations, and Reduction is meaningless to LD/ST but Saturation
282 saves register file ports in critical hot-loops. Thus the 24 bits may
283 be suitably adapted to each category.
284
285 * Normal - arithmetic and logical including IEEE754 FP
286 * LD/ST immediate - includes element-strided and unit-strided
287 * LD/ST indexed
288 * CR Field ops
289 * Branch-Conditional - saves on instruction count in 3D parallel if/else
290
291 It does have to be pointed out that there is huge pressure on the
292 Mode bits. There was therefore insufficient room, unlike the way that
293 EXT001 was designed, to provide "identifying bits" *without first partially
294 decoding the Suffix*. This should in no way be conflated with or taken
295 as an indicator that changing the meaning of the Suffix is performed
296 or desirable.
297
298 Some considerable care has been taken to ensure that Decoding may be
299 performed in a strict forward-pipelined fashion that, aside from changes in
300 SVSTATE (necessarily cached and propagated alongside MSR and PC)
301 and aside from the initial 32/64 length detection (also kept simple),
302 a Multi-Issue Engine would have no difficulty (performance maximisable).
303 With the initial partial RM Mode type-identification
304 decode performed above the Vector operations may then
305 easily be passed downstream in a fully forward-progressive piplined fashion
306 to independent parallel units for further analysis.
307
308 **Vectorised Branch-Conditional**
309
310 As mentioned in the introduction this is the one sole instruction group
311 that
312 is different pseudocode from its scalar equivalent. However even there
313 its various Mode bits and options can be set such that in the degenerate
314 case the behaviour becomes identical to Scalar Branch-Conditional.
315
316 The two additional Modes within Vectorised Branch-Conditional, both of
317 which may be combined, are `CTR-Mode` and `VLI-Test` (aka "Data Fail First").
318 CTR Mode extends the way that CTR may be decremented unconditionally
319 within Scalar Branch-Conditional, and not only makes it conditional but
320 also interacts with predication. VLI-Test provides the same option
321 as Data-Dependent Fault-First to Deterministically truncate the Vector
322 Length at the fail **or success** point.
323
324 Boolean Logic rules on sets (treating the Vector of CR Fields to be tested by
325 `BO` as a set) dictate that the Branch should take place on either 'ALL'
326 tests succeeding (or failing) or whether 'SOME' tests succeed (or fail).
327 These options provide the ability to cover the majority of Parallel
328 3D GPU Conditions, saving a not inconsiderable number of instructions
329 especially given the close interaction with CTR in hot-loops.
330
331 Also `SVLR` is introduced, which is a parallel twin of `LR`, and saving
332 and restoring of LR and SVLR may be deferred until the final decision
333 as to whether to branch. In this way `sv.bclrl` does not corrupt `LR`.
334
335 Vectorised Branch-Conditional due to its side-effects (e.g. reducing CTR
336 or truncating VL) has practical uses even if the Branch is deliberately
337 set to the next instruction (CIA+8). For example it may be used to reduce
338 CTR by the number of bits set in a GPR, if that GPR is given as the predicate
339 mask `sv.bc/pm=r3`.
340
341 # SVP64Single 24-bits
342
343 The `SVP64-Single` 24-bit encoding focusses primarily on ensuring that
344 all 128 Scalar registers are fully accessible, provides element-width
345 overrides, one-bit predication
346 and brings Saturation to all existing Scalar operations.
347 BF16 and FP16 are thus
348 provided in the Scalar Power ISA without one single explicit FP16 or BF16
349 32-bit opcode being added. The downside: such Scalar operations are
350 all 64-bit encodings.
351
352 As SVP64Single is new and still under development, space for it may
353 instead be `RESERVED`. It is however necessary in *some* form
354 as there are limitations
355 in SVP64 Register numbering, particularly for 4-operand instructions,
356 that can only be easily overcome by SVP64Single.
357
358 # Vertical-First Mode
359
360 This is a Computer Science term that needed first to be invented.
361 There exists only one other Vertical-First Vector ISA in the world:
362 Mitch Alsup's VVM Extension for the 66000, details of which may be
363 obtained publicly on `comp.arch` or directly from Mitch Alsup under
364 NDA. Several people have
365 independently derived Vertical-First: it simply did not have a
366 Computer Science term associated with it.
367
368 If we envisage register and Memory layout to be Horizontal and
369 instructions to be Vertical, and to then have some form of Loop
370 System (wherther Zero-Overhead or just branch-conditional based)
371 it is easier to then conceptualise VF vs HF Mode:
372
373 * Vertical-First progresses through *instructions* first before
374 moving on to the next *register* (or Memory-address in the case
375 of Mitch Alsup's VVM).
376 * Horizontal-First (also known as Cray-style Vectors) progresses
377 through **registers** (or, register *elements* in traditional
378 Cray-Vector ISAs) in full before moving on to the next *instruction*.
379
380 Mitch Alsup's VVM Extension is a form of hardware-level auto-vectorisation
381 based around Zero-Overhead Loops. Using a Variable-Length Encoding all
382 loop-invariant registers are "tagged" such that the Hazard Management
383 Engine may perform optimally and do less work in automatically identifying
384 parallelism opportunities.
385 With it not being appropriate to use Variable-Length Encoding in the Power
386 ISA a different much more explicit strategy was taken in Simple-V.
387
388 The biggest advantage inherent in Vertical-First is that it is very easy
389 to introduce into compilers, because all looping, as far as programs
390 is concerned, remains expressed as *Scalar assembler*.[^autovec]
391 Whilst Mitch Alsup's
392 VVM biggest strength is its hardware-level auto-vectorisation
393 but is limited in its ability to call
394 functions, Simple-V's Vertical-First provides explicit control over the
395 parallelism ("hphint")[^hphint] and also allows for full state to be stored/restored
396 (SVLR combined with LR), permitting full function calls to be made
397 from inside Vertical-First Loops, and potentially allows arbitrarily-depth
398 nested VF Loops.
399
400 Simple-V Vertical-First Looping requires an explicit instruction to
401 move `SVSTATE` regfile offsets forward: `svstep`. An early version of
402 Vectorised
403 Branch-Conditional attempted to merge the functionality of `svstep`
404 into `sv.bc`: it became CISC-like in its complexity and was quickly reverted.
405
406 # Simple-V REMAP subsystem
407
408 [REMAP](https://libre-soc.org/openpower/sv/remap)
409 is extremely advanced but brings features already present in other
410 DSPs and Supercomputing ISAs. The usual sequential progression
411 through elements is pushed through a hardware-defined
412 *fully Deterministic*
413 "remapping". Normally (without REMAP)
414 algorithms are costly or
415 convoluted to implement. They are typically implemented
416 as hard-coded fully loop-unrolled assembler which is often
417 auto-generated by specialist tools, or written
418 entirely by hand.
419 All REMAP Schedules *including Indexed*
420 are 100% Deterministic from their point of declaration,
421 making it possible to forward-plan
422 Issue, Memory access and Register Hazard Management
423 in Multi-Issue Micro-architectures.
424 If combined with Vertical-First then much more complex operations may exploit
425 REMAP Schedules, such as Complex Number FFTs.
426
427 * **DCT/FFT** REMAP brings more capability than TI's MSP-Series DSPs and
428 Qualcom Hexagon DSPs, and is not restricted to Integer or FP.
429 (Galois Field is possible, implementing NTT). Operates *in-place*
430 significantly reducing register usage.
431 * **Matrix** REMAP brings more capability than any other Matrix Extension
432 (AMD GPUs, Intel, ARM), not being restricted to Power-2 sizes. Also not
433 limited to the type of operation, it may perform Warshall Transitive
434 Closure, Integer Matrix, Bitmanipulation Matrix, Galois Field (carryless
435 mul) Matrix, and with care potentially Graph Maximum Flow as well. Also
436 suited to Convolutions, Matrix Transpose and rotate, *all* of which is
437 in-place.
438 * **General-purpose Indexed** REMAP, this option is provided to implement
439 an equivalent of VSX `vperm`, as a general-purpose catch-all means of
440 covering algorithms outside of the other REMAP Engines.
441 * **Parallel Reduction** REMAP, performs an automatic map-reduce using
442 *any suitable scalar operation*.
443
444 Note that predication is possible on REMAP but is hard to use effectively.
445 It is often best to make copies of data (`VCOMPRESS`) then apply REMAP.
446
447 \newpage{}
448 # Scalar Operations
449
450 The primary reason for mentioning the additional Scalar operations
451 is because they are so numerous, with Power ISA not having advanced
452 in the *general purpose* compute area in the past 12 years, that some
453 considerable care is needed.
454
455 Summary:
456 **Including Simple-V, to fit everything at least 75% of 3 separate
457 Major Opcodes would be required**
458
459 Candidates (for all but the X-Form instructions) include:
460
461 * EXT006 (80% free)
462 * EXT017 (75% free but not recommended)
463 * EXT001 (50% free)
464 * EXT009 (100% free)
465 * EXT005 (100% free)
466 * brownfield space in EXT019 (25% but NOT recommended)
467
468 SVP64, SVP64-Single and SVP64-Reserved would require on their own each 25%
469 of one Major Opcode for a total of 75% of one Major Opcode. The remaining
470 **Scalar** opcodes, due to there being two separate sets of operations
471 with 16-bit immediates, will require the other space totalling two 75%
472 Majors.
473
474 Note critically that:
475
476 * Unlike EXT001, SVP64's 24-bits may **not** hold also any Scalar
477 operations. There is no free available space: a 25th bit would
478 be required. The entire 24-bits is **required** for the abstracted
479 Hardware-Looping Concept **even when these 24-bits are zero**
480 * Any Scalar 64-bit instruction (regardless of how it is encoded) is unsafe to
481 then Vectorise because this creates the situation of Prefixed-Prefixed,
482 resulting in deep complexity in Hardware Decode at a critical juncture, as
483 well as introducing 96-bit instructions.
484 * **All** of these Scalar instructions are candidates for Vectorisation.
485 Thus none of them may be 64-bit-Scalar-only.
486
487 **Minor Opcodes to fit candidates above**
488
489 In order of size, for bitmanip and A/V DSP purposes:
490
491 * QTY 3of 2-bit XO: ternlogi, crternlogi, grevlogi
492 * QTY 7of 3-bit XO: xpermi, binlut, grevlog, swizzle-mv/fmv, bitmask, bmrevi
493 * QTY 8of 5/6-bit (A-Form): xpermi, bincrflut, bmask, fmvis, fishmv, bmrev,
494 Galois Field
495 * QTY 30of 10-bit (X-Form): cldiv/mul, av-min/max/diff, absdac, xperm etc.
496 (easily fit EXT019, EXT031).
497
498 Note: Some of the Galois Field operations will require QTY 1of Polynomial
499 SPR (per userspace supervisor hypervisor).
500
501 **EXT004**
502
503 For biginteger math, two instructions in the same space as "madd" are to
504 be proposed. They are both 3-in 2-out operations taking or producing a
505 64-bit "pair" (like RTp), and perform 128/64 mul and div/mod operations
506 respectively. These are **not** the same as VSX operations which are
507 128/128, and they are **not** the same as existing Scalar mul/div/mod,
508 all of which are 64/64 (or 64/32).
509
510 **EXT059 and EXT063**
511
512 Additionally for High-Performance Compute and Competitive 3D GPU, IEEE754 FP
513 Transcendentals are required, as are some DCT/FFT "Twin-Butterfly" operations.
514 For each of EXT059 and EXT063:
515
516 * QTY 33of X-Form "1-argument" (fsin, fsins, fcos, fcoss)
517 * QTY 15of X-Form "2-argument" (pow, atan2, fhypot)
518 * QTY 5of A-Form "3-in 2-out" FP Butterfly operations for DCT/FFT
519 * QTY 8of X-Form "2-in 2-out" FP Butterfly operations (again for DCT/FFT)
520 * An additional 16 instructions for IEEE754-2019
521 (fminss/fmaxss, fminmag/fmaxmag)
522 [under evaluation](https://bugs.libre-soc.org/show_bug.cgi?id=923)
523 as of 08Sep2022
524
525 # Adding new opcodes.
526
527 With Simple-V being a type of Zero-Overhead Loop Engine on top of
528 Scalar operations some clear guidelines are needed on how both
529 existing "Defined Words" (Public v3.1 Section 1.6.3 term) and future
530 Scalar operations are added within the 64-bit space. Examples of
531 legal and illegal allocations are given later.
532
533 The primary point is that once an instruction is defined in Scalar
534 32-bit form its corresponding space **must** be reserved in the
535 SVP64 area with the exact same 32-bit form, even if that instruction
536 is "Unvectoriseable" (`sc`, `sync`, `rfid` and `mtspr` for example).
537 Instructions may **not** be added in the Vector space without also
538 being added in the Scalar space, and vice-versa, *even if Unvectoriseable*.
539
540 This is extremely important because the worst possible situation
541 is if a conflicting Scalar instruction is added by another Stakeholder,
542 which then turns out to be Vectoriseable: it would then have to be
543 added to the Vector Space with a *completely different Defined Word*
544 and things go rapidly downhill in the Decode Phase from there.
545 Setting a simple inviolate rule helps avoid this scenario but does
546 need to be borne in mind when discussing potential allocation
547 schemes, as well as when new Vectoriseable Opcodes are proposed
548 for addition by future RFCs: the opcodes **must** be uniformly
549 added to Scalar **and** Vector spaces.
550
551 \newpage{}
552 # Potential Opcode allocation solution
553
554 There are unfortunately some inviolate requirements that directly place
555 pressure on the EXT000-EXT063 (32-bit) opcode space to such a degree that
556 it risks jeapordising the Power ISA. These requirements are:
557
558 * all of the scalar operations must be Vectoriseable
559 * all of the scalar operations intended for Vectorisation
560 must be in a 32-bit encoding (not prefixed-prefixed to 96-bit)
561 * bringing Scalar Power ISA up-to-date from the past 12 years
562 needs 75% of two Major opcodes all on its own
563
564 There exists a potential scheme which meets (exceeds) the above criteria,
565 providing plenty of room for both Scalar (and Vectorised) operations,
566 *and* provides SVP64-Single with room to grow. It
567 is based loosely around Public v3.1 EXT001 Encoding.[^ext001]
568
569 | 0-5 | 6 | 7 | 8-31 | Description |
570 |-----|---|---|-------|---------------------------|
571 | PO | 0 | 0 | 0000 | new-suffix `RESERVED1` |
572 | PO | 0 | 0 | !zero | new-suffix, scalar (SVP64Single), or `RESERVED3` |
573 | PO | 1 | 0 | 0000 | new scalar-only word, or `RESERVED2` |
574 | PO | 1 | 0 | !zero | old-suffix, scalar (SVP64Single), or `RESERVED4` |
575 | PO | 0 | 1 | nnnn | new-suffix, vector (SVP64) |
576 | PO | 1 | 1 | nnnn | old-suffix, vector (SVP64) |
577
578 * **PO** - Primary Opcode. Likely candidates: EXT005, EXT009
579 * **bit 6** - specifies whether the suffix is old (EXT000-EXT063)
580 or new (EXTn00-EXTn63, n greater than 1)
581 * **bit 7** - defines whether the Suffix is Scalar-Prefixed or Vector-Prefixed
582 (caveat: see bits 8-31)
583 * **old-suffix** - the EXT000 to EXT063 32-bit Major opcodes of Power ISA 3.0
584 * **new scalar-only** - a **new** Major Opcode area **exclusively**
585 for Scalar-only instructions that shall **never** be Prefixed by SVP64
586 (RESERVED2 EXT300-EXT363)
587 * **new-suffix** - a **new** Major Opcode area (RESERVED1 EXT200-EXT263)
588 that **may** be Prefixed by SVP64 and SVP64Single
589 * **0000** - all 24 bits bits 8-31 are zero (0x000000)
590 * **!zero** - bits 8-31 may be any value *other* than zero (0x000001-0xffffff)
591 * **nnnn** - bits 8-31 may be any value in the range 0x000000 to 0xffffff
592 * **SVP64Single** - a ([TBD](https://bugs.libre-soc.org/show_bug.cgi?id=905))
593 *Scalar* Encoding that is near-identical to SVP64
594 except that it is equivalent to hard-coded VL=1
595 at all times. Predication is permitted, Element-width-overrides is
596 permitted, Saturation is permitted.
597 If not allocated within the scope of this RFC
598 then these are requested to be `RESERVED` for a future Simple-V
599 proposal.
600 * **SVP64** - a (well-defined, 2 years) DRAFT Proposal for a Vectorisation
601 Augmentation of suffixes.
602
603 For the needs identified by Libre-SOC (75% of 2 POs),
604 `RESERVED1` space *needs*
605 allocation to new POs, `RESERVED2` does not.[^only2]
606
607 | | Scalar (bit7=0,8-31=0000) | Scalar (bit7=0,8-31=!zero)| Vector (bit7=1) |
608 |----------|---------------------------|---------------------------|------------------|
609 |new bit6=0| `RESERVED1`:{EXT200-263} | `RESERVED3`:SVP64-Single:{EXT200-263} | SVP64:{EXT200-263} |
610 |old bit6=1| `RESERVED2`:{EXT300-363} | `RESERVED4`:SVP64-Single:{EXT000-063} | SVP64:{EXT000-063} |
611
612 * **`RESERVED2`:{EXT300-363}** (not strictly necessary to be added) is not
613 and **cannot** ever be Vectorised or Augmented by Simple-V or any future
614 Simple-V Scheme.
615 it is a pure **Scalar-only** word-length PO Group. It may remain `RESERVED`.
616 * **`RESERVED1`:{EXT200-263}** is also a new set of 64 word-length Major
617 Opcodes.
618 These opcodes do not *need* to be Simple-V-Augmented
619 *but the option to do so exists* should an Implementor choose to do so.
620 This is unlike `EXT300-363` which may **never** be Simple-V-Augmented
621 under any circumstances.
622 * **RESERVED3:`SVP64-Single:{EXT200-263}`** - Major opcodes 200-263 with
623 Single-Augmentation, providing a one-bit predicate mask, element-width
624 overrides on source and destination, and the option to extend the Scalar
625 Register numbering (r0-32 extends to r0-127). **Placing of alternative
626 instruction encodings other than those exactly defined in EXT200-263
627 is prohibited**.
628 * **RESERVED4:`SVP64-Single:{EXT000-063}`** - Major opcodes 000-063 with
629 Single-Augmentation, just like SVP64-Single on EXT200-263, these are
630 in effect Single-Augmented-Prefixed variants of the v3.0 32-bit Power ISA.
631 Alternative instruction encodings other than the exact same 32-bit word
632 from EXT000-EXT063 are likewise prohibited.
633 * **`SVP64:{EXT000-063}`** and **`SVP64:{EXT200-263}`** - Full Vectorisation
634 of EXT000-063 and EXT200-263 respectively, these Prefixed instructions
635 are likewise prohibited from being a different encoding from their
636 32-bit scalar versions.
637
638 Limitations of this scheme is that new 32-bit Scalar operations have to have
639 a 32-bit "prefix pattern" in front of them. If commonly-used this could
640 increase binary size. Thus the Encodings EXT300-363 and EXT200-263 should
641 only be allocated for less-popular operations. However the scheme does
642 have the strong advantage of *tripling* the available number of Major
643 Opcodes in the Power ISA, caveat being that care on allocation is needed
644 because EXT200-EXT263 may be SVP64-Augmented whilst EXT300-EXT363 may **not**.
645 The issues of allocation for bitmanip etc. from Libre-SOC is therefore
646 overwhelmingly made moot. The only downside is that there is no
647 `SVP64-Reserved` which will have to be achieved with SPRs (PCR or MSR).
648
649 # Potential Opcode allocation solution (2)
650
651 One of the risks of the bit 6/7 scheme above is that there is no
652 room to share PO9 (EXT009) with other potential uses. A workaround for
653 that is as follows:
654
655 * EXT009, like EXT001 of Public v3.1, is **defined** as a 64-bit
656 encoding
657 * bit 6 if 0b1 is 100% for Simple-V augmentation (Public v3.1 1.6.3)
658 "Defined Word" (aka EXT000-063), with the exception of 0x24000000
659 as a Prefix, which is a new RESERVED encoding.
660 * when bit 6 is 0b0 and bits 32-33 are 0b11 are **defined** as also
661 allocated to Simple-V
662 * all other patterns are `RESERVED` for other purposes,
663
664 | 0-5 | 6 | 7 | 8-31 | 32:33 | Description |
665 |-----|---|---|-------|-------|---------------------------|
666 | PO9?| 0 | 0 | 0000 | xx | RESERVED (other) |
667 | PO9?| 0 | 0 | !zero | 11 | SVP64 (current and future) |
668 | PO9?| 0 | 0 | !zero | 00-10 | RESERVED (other) |
669 | PO9?| 0 | 1 | xxxx | 11 | SVP64 (current and future) |
670 | PO9?| 0 | x | xxxx | 00-10 | RESERVED (other) |
671 | PO9?| 1 | x | xxxx | xx | SVP64 (current and future) |
672
673 This ensures that any potential for future conflict over uses of the
674 EXT009 space, jeapordising Simple-V in the process, are avoided.
675
676 SVP64 then becomes:
677
678 | 0-5 | 6 | 7 | 8-31 | 32-3 | Description |
679 |-----|---|---|-------|------|---------------------------|
680 | PO | 0 | 0 | !zero | 0b11 | SVP64Single:EXT248-263, or `RESERVED3` |
681 | PO | 0 | 0 | 0000 | 0b11 | Scalar EXT248-263 |
682 | PO | 0 | 1 | nnnn | 0b11 | SVP64:EXT248-263 |
683 | PO | 1 | 0 | !zero | nn | SVP64Single:EXT000-063 or `RESERVED4` |
684 | PO | 1 | 1 | nnnn | nn | SVP64:EXT000-063 |
685
686 and reserved areas, QTY 1of 30-bit and QTY 3of 55-bit, are:
687
688 | 0-5 | 6 | 7 | 8-31 | 32-3 | Description |
689 |-----|---|---|-------|------|---------------------------|
690 | PO | 0 | 0 | 0000 | 0b11 | `RESERVED1` or EXT300-363 |
691 | PO9?| 0 | x | xxxx | 0b00 | `RESERVED2` or EXT200-216 |
692 | PO9?| 0 | x | xxxx | 0b01 | `RESERVED2` or EXT216-231 |
693 | PO9?| 0 | x | xxxx | 0b10 | `RESERVED2` or EXT232-247 |
694
695 with additional potentially QTY 3of 30-bit reserved areas
696 (part of Scalar Unvectoriseable EXT200-247):
697
698 | 0-5 | 6 | 7 | 8-31 | 32-3 | Description |
699 |-----|---|---|-------|------|---------------------------|
700 | PO9?| 1 | 0 | 0000 | 0b01 | RESERVED (other) |
701 | PO9?| 1 | 0 | 0000 | 0b10 | RESERVED (other) |
702 | PO9?| 1 | 0 | 0000 | 0b11 | RESERVED (other) |
703
704 Where:
705
706 * SVP64Single (`RESERVED3/4`) is *planned* for a future RFC
707 (but needs reserving as part of this RFC)
708 * `RESERVED1/2` is available for new general-purpose **never**-Simple-V
709 (non-Vectoriseable) 32-bit encodings
710 * EXT248-263 is for "new" instructions
711 which **must** also simultaneously request the corresponding space
712 in SVP64, even if the instruction is non-Vectoriseable.
713 * Anything Vectorised-EXT000-063 is **automatically** being
714 requested as 100% Reserved for every single "Defined Word"
715 (Public v3.1 1.6.3 definition). Vectorised-EXT001 is defined as illegal.
716 * Any **future** instruction
717 added to EXT000-063 likewise, is **automatically**
718 assigned corresponding reservations in the SVP64:EXT000-063
719 and SVP64Single:EXT000-063 area, regardless of whether the
720 instruction is Vectoriseable or not.
721
722 Bit-allocation Summary:
723
724 * EXT3nn and three other encodings provide space for non-Simple-V
725 operations to have QTY 4of EXTn00-EXTn47 Primary Opcode ranges
726 * QTY 3of 55-bit spaces also exist for future use (longer by 3 bits
727 than opcodes allocated in EXT001)
728 * Simple-V EXT2nn is restricted to range EXT248-263
729 * non-Simple-V EXT2nn is restricted to range EXT200-247
730 * Simple-V EXT0nn takes up 50% of PO9 for this and future Simple-V RFCs
731 * The clear separation between Simple-V and non-Simple-V means there is
732 no possibility of future RFCs encroaching on the others' space.
733
734 \newpage{}
735
736 **EXT000-EXT063**
737
738 These are Scalar word-encodings. Often termed "v3.0 Scalar" in this document
739 Power ISA v3.1 Section 1.6.3 Book I calls it a "defined word".
740
741 | 0-5 | 6-31 |
742 |--------|--------|
743 | PO | EXT000-063 Scalar (v3.0 or v3.1) operation |
744
745 **SVP64Single:{EXT000-063}** bit6=old bit7=scalar
746
747 This encoding, identical to SVP64Single:{EXT200-263},
748 introduces SVP64Single Augmentation of v3.0 Scalar word instructions.
749 All meanings must be identical to EXT000 to EXT063, and is is likewise
750 prohibited to add an instruction in this area without also adding
751 the exact same (non-Augmented) instruction in EXT000-063 with the
752 exact same Scalar word.
753 PO2 is in the range 0b00000 to 0b11111 to represent EXT000-063 respectively.
754 Augmenting EXT001 is prohibited.
755
756 | 0-5 | 6 | 7 | 8-31 | 32-63 |
757 |--------|---|---|-------|---------|
758 | PO (9)?| 1 | 0 | !zero | SVP64Single:{EXT000-063} |
759
760 **SVP64:{EXT000-063}** bit6=old bit7=vector
761
762 This encoding is identical to **SVP64:{EXT200-263}** except it
763 is the Vectorisation of existing v3.0/3.1 Scalar-words, EXT000-063.
764 All the same rules apply with the addition that
765 Vectorisation of EXT001 is prohibited.
766
767 | 0-5 | 6 | 7 | 8-31 | 32-63 |
768 |--------|---|---|-------|---------|
769 | PO (9)?| 1 | 1 | nnnn | SVP64:{EXT000-063} |
770
771 **{EXT248-263}** bit6=new bit7=scalar
772
773 This encoding represents the opportunity to introduce EXT248-263.
774 It is a Scalar-word encoding, and does not require implementing
775 SVP64 or SVP64-Single, but does require the Vector-space to be allocated.
776 PO2 is in the range 0b11000 to 0b111111 to represent EXT248-263 respectively.
777
778 | 0-5 | 6 | 7 | 8-31 | 32-3 | 34-37 | 38-63 |
779 |--------|---|---|-------|------|---------|---------|
780 | PO (9)?| 0 | 0 | 0000 | 0b11 |PO2[2:5] | {EXT248-263} |
781
782 **SVP64Single:{EXT248-263}** bit6=new bit7=scalar
783
784 This encoding, which is effectively "implicit VL=1"
785 and comprising (from bits 8-31)
786 *at least some* form of Augmentation, it represents the opportunity
787 to Augment EXT248-263 with the SVP64Single capabilities.
788 Must be allocated under Scalar *and* SVP64 simultaneously.
789
790 | 0-5 | 6 | 7 | 8-31 | 32-3 | 34-37 | 38-63 |
791 |--------|---|---|-------|------|---------|---------|
792 | PO (9)?| 0 | 0 | !zero | 0b11 |PO2[2:5] | SVP64Single:{EXT248-263} |
793
794 **SVP64:{EXT248-263}** bit6=new bit7=vector
795
796 This encoding, which permits VL to be dynamic (settable from GPR or CTR)
797 is the Vectorisation of EXT248-263.
798 Instructions may not be placed in this category without also being
799 implemented as pure Scalar *and* SVP64Single. Unlike SVP64Single
800 however, there is **no reserved encoding** (bits 8-24 zero).
801 VL=1 may occur dynamically
802 at runtime, even when bits 8-31 are zero.
803
804 | 0-5 | 6 | 7 | 8-31 | 32-3 | 34-37 | 38-63 |
805 |--------|---|---|-------|------|---------|---------|
806 | PO (9)?| 0 | 1 | nnnn | 0b11 |PO2[2:5] | SVP64:{EXT248-263} |
807
808 **RESERVED2 / EXT300-363** bit6=old bit7=scalar
809
810 This is entirely at the discretion of the ISA WG. Libre-SOC is *not*
811 proposing the addition of EXT300-363: it is merely a possibility for
812 future. The reason the space is not needed is because this is within
813 the realm of Scalar-extended (SVP64Single), and with the 24-bit prefix
814 area being all-zero (bits 8-31) this is defined as "having no augmentation"
815 (in the Simple-V Specification it is termed `Scalar Identity Behaviour`).
816 This in turn makes this prefix a *degenerate duplicate* so may be allocated
817 for other purposes.
818
819 | 0-5 | 6 | 7 | 8-31 | 32-63 |
820 |--------|---|---|-------|---------|
821 | PO (9)?| 1 | 0 | 0000 | EXT300-363 or `RESERVED1` |
822
823 \newpage{}
824 # Example Legal Encodings and RESERVED spaces
825
826 This section illustrates what is legal encoding, what is not, and
827 why the 4 spaces should be `RESERVED` even if not allocated as part
828 of this RFC.
829
830 **legal, scalar and vector**
831
832 | width | assembler | prefix? | suffix | description |
833 |-------|-----------|--------------|-----------|---------------|
834 | 32bit | fishmv | none | 0x12345678| scalar EXT0nn |
835 | 64bit | ss.fishmv | 0x26!zero | 0x12345678| scalar SVP64Single:EXT0nn |
836 | 64bit | sv.fishmv | 0x27nnnnnn | 0x12345678| vector SVP64:EXT0nn |
837
838 OR:
839
840 | width | assembler | prefix? | suffix | description |
841 |-------|-----------|--------------|-----------|---------------|
842 | 64bit | fishmv | 0x24000000 | 0x12345678| scalar EXT2nn |
843 | 64bit | ss.fishmv | 0x24!zero | 0x12345678| scalar SVP64Single:EXT2nn |
844 | 64bit | sv.fishmv | 0x25nnnnnn | 0x12345678| vector SVP64:EXT2nn |
845
846 Here the encodings are the same, 0x12345678 means the same thing in
847 all cases. Anything other than this risks either damage (truncation
848 of capabilities of Simple-V) or far greater complexity in the
849 Decode Phase.
850
851 This drives the compromise proposal (above) to reserve certain
852 EXT2nn POs right
853 across the board
854 (in the Scalar Suffix side, irrespective of Prefix), some allocated
855 to Simple-V, some not.
856
857 **illegal due to missing**
858
859 | width | assembler | prefix? | suffix | description |
860 |-------|-----------|--------------|-----------|---------------|
861 | 32bit | fishmv | none | 0x12345678| scalar EXT0nn |
862 | 64bit | ss.fishmv | 0x26!zero | 0x12345678| scalar SVP64Single:EXT0nn |
863 | 64bit | unallocated | 0x27nnnnnn | 0x12345678| vector SVP64:EXT0nn |
864
865 This is illegal because the instruction is possible to Vectorise,
866 therefore it should be **defined** as Vectoriseable.
867
868 **illegal due to unvectoriseable**
869
870 | width | assembler | prefix? | suffix | description |
871 |-------|-----------|--------------|-----------|---------------|
872 | 32bit | mtmsr | none | 0x12345678| scalar EXT0nn |
873 | 64bit | ss.mtmsr | 0x26!zero | 0x12345678| scalar SVP64Single:EXT0nn |
874 | 64bit | sv.mtmsr | 0x27nnnnnn | 0x12345678| vector SVP64:EXT0nn |
875
876 This is illegal because the instruction `mtmsr` is not possible to Vectorise,
877 at all. This does **not** convey an opportunity to allocate the
878 space to an alternative instruction.
879
880 **illegal unvectoriseable in EXT2nn**
881
882 | width | assembler | prefix? | suffix | description |
883 |-------|-----------|--------------|-----------|---------------|
884 | 64bit | mtmsr2 | 0x24000000 | 0x12345678| scalar EXT2nn |
885 | 64bit | ss.mtmsr2 | 0x24!zero | 0x12345678| scalar SVP64Single:EXT2nn |
886 | 64bit | sv.mtmsr2 | 0x25nnnnnn | 0x12345678| vector SVP64:EXT2nn |
887
888 For a given hypothetical `mtmsr2` which is inherently Unvectoriseable
889 whilst it may be put into the scalar EXT2nn space it may **not** be
890 allocated in the Vector space. As with Unvectoriseable EXT0nn opcodes
891 this does not convey the right to use the 0x24/0x26 space for alternative
892 opcodes. This hypothetical Unvectoriseable operation would be better off
893 being allocated as EXT001 Prefixed, EXT000-063, or hypothetically in
894 EXT300-363.
895
896 **ILLEGAL: dual allocation**
897
898 | width | assembler | prefix? | suffix | description |
899 |-------|-----------|--------------|-----------|---------------|
900 | 32bit | fredmv | none | 0x12345678| scalar EXT0nn |
901 | 64bit | ss.fredmv | 0x26!zero | 0x12345678| scalar SVP64Single:EXT0nn |
902 | 64bit | sv.fishmv | 0x27nnnnnn | 0x12345678| vector SVP64:EXT0nn |
903
904 the use of 0x12345678 for fredmv in scalar but fishmv in Vector is
905 illegal. the suffix in both 64-bit locations
906 must be allocated to a Vectoriseable EXT000-063
907 "Defined Word" (Public v3.1 Section 1.6.3 definition)
908 or not at all.
909
910 **illegal unallocated scalar EXT0nn or EXT2nn:**
911
912 | width | assembler | prefix? | suffix | description |
913 |-------|-----------|--------------|-----------|---------------|
914 | 32bit | unallocated | none | 0x12345678| scalar EXT0nn |
915 | 64bit | ss.fredmv | 0x26!zero | 0x12345678| scalar SVP64Single:EXT0nn |
916 | 64bit | sv.fishmv | 0x27nnnnnn | 0x12345678| vector SVP64:EXT0nn |
917
918 and:
919
920 | width | assembler | prefix? | suffix | description |
921 |-------|-----------|--------------|-----------|---------------|
922 | 64bit | unallocated | 0x24000000 | 0x12345678| scalar EXT2nn |
923 | 64bit | ss.fishmv | 0x24!zero | 0x12345678| scalar SVP64Single:EXT2nn |
924 | 64bit | sv.fishmv | 0x25nnnnnn | 0x12345678| vector SVP64:EXT2nn |
925
926 Both of these Simple-V operations are illegally-allocated. The fact that
927 there does not exist a scalar "Defined Word" (even for EXT200-263) - the
928 unallocated block - means that the instruction may **not** be allocated in
929 the Simple-V space.
930
931 \newpage{}
932 # Use cases
933
934 In the following examples the programs are fully executable under the
935 Libre-SOC Simple-V-augmented Power ISA Simulator. Reproducible
936 (scripted) Installation instructions:
937 <https://libre-soc.org/HDL_workflow/devscripts/>
938
939 ## LD/ST-Multi
940
941 Context-switching saving and restoring of registers on the stack often
942 requires explicit loop-unrolling to achieve effectively. In SVP64 it
943 is possible to use a Predicate Mask to "compact" or "expand" a swathe
944 of desired registers, dynamically. Known as "VCOMPRESS" and "VEXPAND",
945 runtime-configurable LD/ST-Multi is achievable with 2 instructions.
946
947 ```
948 # load 64 registers off the stack, in-order, skipping unneeded ones
949 # by using CR0-CR63's "EQ" bits to select only those needed.
950 setvli 64
951 sv.ld/sm=EQ *rt,0(ra)
952 ```
953
954 ## Twin-Predication, re-entrant
955
956 This example demonstrates two key concepts: firstly Twin-Predication
957 (separate source predicate mask from destination predicate mask) and
958 that sufficient state is stored within the Vector Context SPR, SVSTATE,
959 for full re-entrancy on a Context Switch or function call *even if
960 in the middle of executing a loop*. Also demonstrates that it is
961 permissible for a programmer to write **directly** to the SVSTATE
962 SPR, and still expect Deterministic Behaviour. It's not exactly recommended
963 (performance may be impacted by direct SVSTATE access), but it is not
964 prohibited either.
965
966 ```
967 292 # checks that we are able to resume in the middle of a VL loop,
968 293 # after an interrupt, or after the user has updated src/dst step
969 294 # let's assume the user has prepared src/dst step before running this
970 295 # vector instruction
971 296 # test_intpred_reentrant
972 297 # reg num 0 1 2 3 4 5 6 7 8 9 10 11 12
973 298 # srcstep=1 v
974 299 # src r3=0b0101 Y N Y N
975 300 # : |
976 301 # + - - + |
977 302 # : +-------+
978 303 # : |
979 304 # dest ~r3=0b1010 N Y N Y
980 305 # dststep=2 ^
981 306
982 307 sv.extsb/sm=r3/dm=~r3 *5, *9
983 ```
984
985 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_predication.py;hb=HEAD>
986
987 ## 3D GPU style "Branch Conditional"
988
989 (*Note: Specification is ready, Simulator still under development of
990 full specification capabilities*)
991 This example demonstrates a 2-long Vector Branch-Conditional only
992 succeeding if *all* elements in the Vector are successful. This
993 avoids the need for additional instructions that would need to
994 perform a Parallel Reduction of a Vector of Condition Register
995 tests down to a single value, on which a Scalar Branch-Conditional
996 could then be performed. Full Rationale at
997 <https://libre-soc.org/openpower/sv/branches/>
998
999 ```
1000 80 # test_sv_branch_cond_all
1001 81 for i in [7, 8, 9]:
1002 83 addi 1, 0, i+1 # set r1 to i
1003 84 addi 2, 0, i # set r2 to i
1004 85 cmpi cr0, 1, 1, 8 # compare r1 with 10 and store to cr0
1005 86 cmpi cr1, 1, 2, 8 # compare r2 with 10 and store to cr1
1006 87 sv.bc/all 12, *1, 0xc # bgt 0xc - branch if BOTH
1007 88 # r1 AND r2 greater 8 to the nop below
1008 89 addi 3, 0, 0x1234, # if tests fail this shouldn't execute
1009 90 or 0, 0, 0 # branch target
1010 ```
1011
1012 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_bc.py;hb=HEAD>
1013
1014 \newpage{}
1015 ## DCT
1016
1017 DCT has dozens of uses in Audio-Visual processing and CODECs.
1018 A full 8-wide in-place triple-loop Inverse DCT may be achieved
1019 in 8 instructions. Expanding this to 16-wide is a matter of setting
1020 `svshape 16` **and the same instructions used**.
1021 Lee Composition may be deployed to construct non-power-two DCTs.
1022 The cosine table may be computed (once) with 18 Vector instructions
1023 (one of them `fcos`)
1024
1025 ```
1026 1014 # test_sv_remap_fpmadds_ldbrev_idct_8_mode_4
1027 1015 # LOAD bit-reversed with half-swap
1028 1016 svshape 8, 1, 1, 14, 0
1029 1017 svremap 1, 0, 0, 0, 0, 0, 0
1030 1018 sv.lfs/els *0, 4(1)
1031 1019 # Outer butterfly, iterative sum
1032 1020 svremap 31, 0, 1, 2, 1, 0, 1
1033 1021 svshape 8, 1, 1, 11, 0
1034 1022 sv.fadds *0, *0, *0
1035 1023 # Inner butterfly, twin +/- MUL-ADD-SUB
1036 1024 svshape 8, 1, 1, 10, 0
1037 1025 sv.ffmadds *0, *0, *0, *8
1038 ```
1039
1040 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_dct.py;hb=HEAD>
1041
1042 ## Matrix Multiply
1043
1044 Matrix Multiply of any size (non-power-2) up to a total of 127 operations
1045 is achievable with only three instructions. Normally in any other SIMD
1046 ISA at least one source requires Transposition and often massive rolling
1047 repetition of data is required. These 3 instructions may be used as the
1048 "inner triple-loop kernel" of the usual 6-loop Massive Matrix Multiply.
1049
1050 ```
1051 28 # test_sv_remap1 5x4 by 4x3 matrix multiply
1052 29 svshape 5, 4, 3, 0, 0
1053 30 svremap 31, 1, 2, 3, 0, 0, 0
1054 31 sv.fmadds *0, *8, *16, *0
1055 ```
1056
1057 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_matrix.py;hb=HEAD>
1058
1059 ## Parallel Reduction
1060
1061 Parallel (Horizontal) Reduction is often deeply problematic in SIMD and
1062 Vector ISAs. Parallel Reduction is Fully Deterministic in Simple-V and
1063 thus may even usefully be deployed on non-associative and non-commutative
1064 operations.
1065
1066 ```
1067 75 # test_sv_remap2
1068 76 svshape 7, 0, 0, 7, 0
1069 77 svremap 31, 1, 0, 0, 0, 0, 0 # different order
1070 78 sv.subf *0, *8, *16
1071 79
1072 80 REMAP sv.subf RT,RA,RB - inverted application of RA/RB
1073 81 left/right due to subf
1074 ```
1075
1076 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_parallel_reduce.py;hb=HEAD>
1077
1078 [[!tag opf_rfc]]
1079
1080 [^msr]: an MSR bit or bits, conceptually equivalent to `MSR.SF` and added for the same reasons, would suffice perfectly.
1081 [^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
1082 [^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.
1083 [^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
1084 [^only2]: reminder that this proposal only needs 75% of two POs for Scalar instructions. The rest of EXT200-263 is for general use.
1085 [^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
1086 [^futurevsx]: A future version or other Stakeholder *may* wish to drop Simple-V onto VSX: this would be a separate RFC
1087 [^vsx256]: imagine a hypothetical future VSX-256 using the exact same instructions as VSX. the binary incompatibility introducrd would catastrophically **and retroactively** damage existing IBM POWER8,9,10 hardware's reputation and that of Power ISA overall.
1088 [^autovec]: Compiler auto-vectorisation for best exploitation of SIMD and Vector ISAs on Scalar programming languages (c, c++) is an Indusstry-wide known-hard decades-long problem. Cross-reference the number of hand-optimised assembler algorithms.
1089 [^hphint]: intended for use when the compiler has determined the extent of Memory or register aliases in loops: `a[i] += a[i+4]` would necessitate a Vertical-First hphint of 4