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