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