dummy commit
[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. To achieve this goal both Simple-V and accompanying
36 Scalar** Power ISA instructions are needed. These include IEEE754
37 [Transcendentals](https://libre-soc.org/openpower/transcendentals/)
38 [AV](https://libre-soc.org/openpower/sv/av_opcodes/)
39 cryptographic
40 [Biginteger](https://libre-soc.org/openpower/sv/biginteger/) and
41 [bitmanipulation](https://libre-soc.org/openpower/sv/bitmanip)
42 operations present in ARM
43 Intel AMD and many other ISAs.
44 Three additional FP-related sets are needed
45 (missing from SFFS) -
46 [int_fp_mv](https://libre-soc.org/openpower/sv/int_fp_mv/)
47 [fclass](https://libre-soc.org/openpower/sv/fclass/) and
48 [fcvt](https://libre-soc.org/openpower/sv/fcvt/)
49 and one set named
50 [crweird](https://libre-soc.org/openpower/sv/cr_int_predication/)
51 increase the capability of CR Fields.
52
53 *Thus as the primary motivation is to create a **Hybrid 3D CPU-GPU-VPU ISA**
54 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 a given set of 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 "Silicon-Partner" Scalability is identical to attempting to run 64-bit
124 Power ISA binaries without setting - or having `MSR.SF` - on "Scaled"
125 32-bit hardware: **the same opcodes** were shared between 32 and 64 bit.
126 `RESERVED` space is thus crucial
127 to have, in order to provide the **OPF ISA WG** - not implementors
128 ("Silicon Partners") - with the option to properly review and decide
129 any (if any) future expanded register file bitwidths and sizes[^msr],
130 **under explicitly-distinguishable encodings** so as to guarantee
131 long-term stability and binary interoperability.
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. Byte-level write-enable regfiles (like SRAMs) are
154 strongly recommended, to avoid a Read-Modify-Write cycle.
155
156 The only major concern is in the upper SV Extension Levels: the Hazard
157 Management for increased number of Scalar Registers to 128 (in current
158 versions) but given that IBM POWER9/10 has VSX register numbering 64,
159 and modern GPUs have 128, 256 and even 512 registers this was deemed
160 acceptable. Strategies do exist in hardware for Hazard Management of
161 such large numbers of registers, even for Multi-Issue microarchitectures.
162
163 # Simple-V Architectural Resources
164
165 * No new Interrupt types are required.
166 No modifications to existing Power ISA opcodes are required.
167 No new Register Files are required (all because Simple-V is a category of
168 Zero-Overhead Looping on Scalar instructions)
169 * GPR FPR and CR Field Register extend to 128. A future
170 version may extend to 256 or beyond[^extend] or also extend VSX[^futurevsx]
171 * 24-bits are needed within the main SVP64 Prefix (equivalent to a 2-bit XO)
172 * Another 24-bit (a second 2-bit XO) is needed for a planned future encoding,
173 currently named "SVP64-Single"[^likeext001]
174 * A third 24-bits (third 2-bit XO) is strongly recommended to be `RESERVED`
175 such that future unforeseen capability is needed (although this may be
176 alternatively achieved with a mandatory PCR or MSR bit)
177 * To hold all Vector Context, five SPRs are needed for userspace.
178 If Supervisor and Hypervisor mode are to
179 also support Simple-V they will correspondingly need five SPRs each.
180 (Some 32/32-to-64 aliases are advantageous but not critical).
181 * Five 6-bit XO (A-Form) "Management" instructions are needed. These are
182 Scalar 32-bit instructions and *may* be 64-bit-extended in future
183 (safely within the SVP64 space: no need for an EXT001 encoding).
184
185 **Summary of Simple-V Opcode space**
186
187 * 75% of one Major Opcode (equivalent to the rest of EXT017)
188 * Five 6-bit XO 32-bit operations.
189
190 No further opcode space *for Simple-V* is envisaged to be required for
191 at least the next decade (including if added on VSX)
192
193 **Simple-V SPRs**
194
195 * **SVSTATE** - Vectorisation State sufficient for Precise-Interrupt
196 Context-switching and no adverse latency, it may be considered to
197 be a "Sub-PC" and as such absolutely must be treated with the same
198 respect and priority as MSR and PC.
199 * **SVSRR0** - identical in purpose to SRR0/1: storing SVSTATE on context-switch
200 along-side MSR and PC.
201 * **SVSHAPE0-3** - these are 32-bit and may be grouped in pairs, they REMAP
202 (shape) the Vectors[^svshape]
203 * **SVLR** - again similar to LR for exactly the same purpose, SVSTATE
204 is swapped with SVLR by SV-Branch-Conditional for exactly the same
205 reason that NIA is swapped with LR
206
207 **Vector Management Instructions**
208
209 These fit into QTY 5of 6-bit XO 32-bit encoding (svshape and svshape2 share
210 the same space):
211
212 * **setvl** - Cray-style Scalar Vector Length instruction
213 * **svstep** - used for Vertical-First Mode and for enquiring about internal
214 state
215 * **svremap** - "tags" registers for activating REMAP
216 * **svshape** - convenience instruction for quickly setting up Matrix, DCT,
217 FFT and Parallel Reduction REMAP
218 * **svshape2** - additional convenience instruction to set up "Offset" REMAP
219 (fits within svshape's XO encoding)
220 * **svindex** - convenience instruction for setting up "Indexed" REMAP.
221
222 \newpage{}
223 # SVP64 24-bit Prefixes
224
225 The SVP64 24-bit Prefix (RM) options aim to reduce instruction count
226 and assembler complexity.
227 These Modes do not interact with SVSTATE per se. SVSTATE
228 primarily controls the looping (quantity, order), RM
229 influences the *elements* (the Suffix). There is however
230 some close interaction when it comes to predication.
231 REMAP is outlined separately.
232
233 * **element-width overrides**, which dynamically redefine each SFFS or SFS
234 Scalar prefixed instruction to be 8-bit, 16-bit, 32-bit or 64-bit
235 operands **without requiring new 8/16/32 instructions.**[^pseudorewrite]
236 This results in full BF16 and FP16 opcodes being added to the Power ISA
237 **without adding BF16 or FP16 opcodes** including full conversion
238 between all formats.
239 * **predication**.
240 this is an absolutely essential feature for a 3D GPU VPU ISA.
241 CR Fields are available as Predicate Masks hence the reason for their
242 extension to 128. Twin-Predication is also provided: this may best
243 be envisaged as back-to-back VGATHER-VSCATTER but is not restricted
244 to LD/ST, its use saves on instruction count. Enabling one or other
245 of the predicates provides all of the other types of operations
246 found in Vector ISAs (VEXTRACT, VINSERT etc) again with no need
247 to actually provide explicit such instructions.
248 * **Saturation**. applies to **all** LD/ST and Arithmetic and Logical
249 operations (without adding explicit saturation ops)
250 * **Reduction and Prefix-Sum** (Fibonnacci Series) Modes, including a
251 "Reverse Gear" (running loops backwards).
252 * **vec2/3/4 "Packing" and "Unpacking"** (similar to VSX `vpack` and `vpkss`)
253 accessible in a way that is easier than REMAP, added for the same reasons
254 that drove `vpack` and `vpkss` etc. to be added: pixel, audio, and 3D
255 data manipulation. With Pack/Unpack being part of SVSTATE it can be
256 applied *in-place* saving register file space (no copy/mv needed).
257 * **Load/Store "fault-first"** speculative behaviour,
258 identical to SVE and RVV
259 Fault-first: provides auto-truncation of a speculative sequential parallel
260 LD/ST batch, helping
261 solve the "SIMD Considered Harmful" stripmining problem from a Memory
262 Access perspective.
263 * **Data-Dependent Fail-First**: a 100% Deterministic extension of the LDST
264 ffirst concept: first `Rc=1 BO test` failure terminates looping and
265 truncates VL to that exact point. Useful for implementing algorithms
266 such as `strcpy` in around 14 high-performance Vector instructions, the
267 option exists to include or exclude the failing element.
268 * **Predicate-result**: a strategic mode that effectively turns all and any
269 operations into a type of `cmp`. An `Rc=1 BO test` is performed and if
270 failing that element result is **not** written to the regfile. The `Rc=1`
271 Vector of co-results **is** always written (subject to usual predication).
272 Termed "predicate-result" because the combination of producing then
273 testing a result is as if the test was in a follow-up predicated
274 copy/mv operation, it reduces regfile pressure and instruction count.
275 Also useful on saturated or other overflowing operations, the overflowing
276 elements may be excluded from outputting to the regfile then
277 post-analysed outside of critical hot-loops.
278
279 **RM Modes**
280
281 There are five primary categories of instructions in Power ISA, each of
282 which needed slightly different Modes. For example, saturation and
283 element-width overrides are meaningless to Condition Register Field
284 operations, and Reduction is meaningless to LD/ST but Saturation
285 saves register file ports in critical hot-loops. Thus the 24 bits may
286 be suitably adapted to each category.
287
288 * Normal - arithmetic and logical including IEEE754 FP
289 * LD/ST immediate - includes element-strided and unit-strided
290 * LD/ST indexed
291 * CR Field ops
292 * Branch-Conditional - saves on instruction count in 3D parallel if/else
293
294 It does have to be pointed out that there is huge pressure on the
295 Mode bits. There was therefore insufficient room, unlike the way that
296 EXT001 was designed, to provide "identifying bits" *without first partially
297 decoding the Suffix*.
298
299 Some considerable care has been taken to ensure that Decoding may be
300 performed in a strict forward-pipelined fashion that, aside from changes in
301 SVSTATE (necessarily cached and propagated alongside MSR and PC)
302 and aside from the initial 32/64 length detection (also kept simple),
303 a Multi-Issue Engine would have no difficulty (performance maximisable).
304 With the initial partial RM Mode type-identification
305 decode performed above the Vector operations may then
306 easily be passed downstream in a fully forward-progressive piplined fashion
307 to independent parallel units for further analysis.
308
309 **Vectorised Branch-Conditional**
310
311 As mentioned in the introduction this is the one sole instruction group
312 that
313 is different pseudocode from its scalar equivalent. However even there
314 its various Mode bits and options can be set such that in the degenerate
315 case the behaviour becomes identical to Scalar Branch-Conditional.
316
317 The two additional Modes within Vectorised Branch-Conditional, both of
318 which may be combined, are `CTR-Mode` and `VLI-Test` (aka "Data Fail First").
319 CTR Mode extends the way that CTR may be decremented unconditionally
320 within Scalar Branch-Conditional, and not only makes it conditional but
321 also interacts with predication. VLI-Test provides the same option
322 as Data-Dependent Fault-First to Deterministically truncate the Vector
323 Length at the fail **or success** point.
324
325 Boolean Logic rules on sets (treating the Vector of CR Fields to be tested by
326 `BO` as a set) dictate that the Branch should take place on either 'ALL'
327 tests succeeding (or failing) or whether 'SOME' tests succeed (or fail).
328 These options provide the ability to cover the majority of Parallel
329 3D GPU Conditions, saving a not inconsiderable number of instructions
330 especially given the close interaction with CTR in hot-loops.[^parity]
331
332 [^parity]: adding a parity (XOR) option was too much. instead a parallel-reduction on `crxor` may be used in combination with a Scalar Branch.
333
334 Also `SVLR` is introduced, which is a parallel twin of `LR`, and saving
335 and restoring of LR and SVLR may be deferred until the final decision
336 as to whether to branch. In this way `sv.bclrl` does not corrupt `LR`.
337
338 Vectorised Branch-Conditional due to its side-effects (e.g. reducing CTR
339 or truncating VL) has practical uses even if the Branch is deliberately
340 set to the next instruction (CIA+8). For example it may be used to reduce
341 CTR by the number of bits set in a GPR, if that GPR is given as the predicate
342 mask `sv.bc/pm=r3`.
343
344 # LD/ST RM Modes
345
346 Traditional Vector ISAs have vastly more (and more complex) addressing
347 modes than Scalar ISAs: unit strided, element strided, Indexed, Structure
348 Packing. All of these had to be jammed in on top of existing Scalar
349 instructions **without modifying or adding new Scalar instructions**.
350 A small conceptual "cheat" was therefore needed. The Immediate (D)
351 is in some Modes multiplied by the element index, which gives us
352 element-strided. For unit-strided the width of the operation (`ld`,
353 8 byte) is multiplied by the element index and *substituted* for "D"
354 when the immediate, D, is zero. Modifications to support this "cheat"
355 on top of pre-existing Scalar HDL (and Simulators) have both turned
356 out to be minimal.[^mul] Also added was the option to perform signed
357 or unsigned Effective Address calculation, which comes into play only
358 on LD/ST Indexed, when elwidth overrides are used. Another quirk:
359 `RA` is never allowed to have its width altered: it remains 64-bit,
360 as it is the Base Address.
361
362 One confusing thing is the unfortunate naming of LD/ST Indexed and
363 REMAP Indexed: some care is taken in the spec to discern the two.
364 LD/ST Indexed is Scalar `EA=RA+RB` (where **either** RA or RB
365 may be marked as Vectorised), where obviously the order in which
366 that Vector of RA (or RB) is read in the usual linear sequential
367 fashion. REMAP Indexed affects the
368 **order** in which the Vector of RA (or RB) is accessed,
369 according to a schedule determined by *another* vector of offsets
370 in the register file. Effectively this combines VSX `vperm`
371 back-to-back with LD/ST operations *in the calculation of each
372 Effective Address* in one instruction.
373
374 For DCT and FFT, normally it is very expensive to perform the
375 "bit-inversion" needed for address calculation and/or reordering
376 of elements. DCT in particular needs both bit-inversion *and
377 Gray-Coding* offsets (a complexity that often "justifies" full
378 assembler loop-unrolling). DCT/FFT REMAP **automatically** performs
379 the required offset adjustment to get data loaded and stored in
380 the required order. Matrix REMAP can likewise perform up to 3
381 Dimensions of reordering (on both Immediate and Indexed), and
382 when combined with vec2/3/4 the reordering can even go as far as
383 four dimensions (four nested fixed size loops).
384
385 Twin Predication is worth a special mention. Many Vector ISAs have
386 special LD/ST `VCOMPRESS` and `VREDUCE` instructions, which sequentially
387 skip elements based on predicate mask bits. They also add special
388 `VINSERT` and `VEXTRACT` Register-based instructions to compensate
389 for lack of single-element LD/ST (where in Simple-V you just use
390 Scalar LD/ST). Also Broadcasting (`VSPLAT`) is either added to LDST
391 or as Register-based.
392
393 *All of the above modes are covered by Twin-Predication*
394
395 In particular, a special predicate mode `1<<r3` uses the register `r3`
396 *binary* value, converted to single-bit unary mask,
397 effectively as a single (Scalar) Index *runtime*-dynamic offset into
398 a Vector.[^r3] Combined with the
399 (mis-named) "mapreduce" mode when used as a source predicate
400 a `VSPLAT` (broadcast) is performed. When used as a destination
401 predicate `1<<r3`
402 provides `VINSERT` behaviour.
403
404 [^r3]: Effectively: `GPR(RA+r3)`
405
406 Also worth an explicit mention is that Twin Predication when using
407 different source from destination predicate masks effectively combines
408 back-to-back `VCOMPRESS` and `VEXPAND` (in a single instruction), and,
409 further, that the benefits of Twin Predication are not limited to LD/ST,
410 they may be applied to Arithmetic, Logical and CR Field operations as well.
411
412 Overall the LD/ST Modes available are astoundingly powerful, especially
413 when combining arithmetic (lharx) with saturation, element-width overrides,
414 Twin Predication,
415 vec2/3/4 Structure Packing *and* REMAP, the combinations far exceed anything
416 seen in any other Vector ISA in history, yet are really nothing more
417 than concepts abstracted out in pure RISC form.[^ldstcisc]
418
419 # CR Field RM Modes.
420
421 CR Field operations (`crand` etc.) are somewhat underappreciated in the
422 Power ISA. The CR Fields however are perfect for providing up to four
423 separate Vectors of Predicate Masks: `EQ LT GT SO` and thus some special
424 attention was given to first making transfer between GPR and CR Fields
425 much more powerful with the
426 [crweird](https://libre-soc.org/openpower/sv/cr_int_predication/)
427 operations, and secondly by adding powerful binary and ternary CR Field
428 operations into the bitmanip extension.[^crops]
429
430 On these instructions RM Modes may still be applied (mapreduce and Data-Dependent Fail-first). The usefulness of
431 being able to auto-truncate subsequent Vector Processing at the point
432 at which a CR Field test fails, based on any arbitary logical operation involving `three` CR Field Vectors (`crternlogi`) should be clear, as
433 should the benefits of being able to do mapreduce and REMAP Parallel
434 Reduction on `crternlogi`: dramatic reduction in instruction count
435 for Branch-based control flow when faced with complex analysis of
436 multiple Vectors, including XOR-reduction (parity).
437
438 Overall the addition of the CR Operations and the CR RM Modes is about
439 getting instruction count down and increasing the power and flexibility of CR Fields as pressed into service for the purpose of Predicate Masks.
440
441 [^crops]: the alternative to powerful transfer instructions between GPR and CR Fields was to add the full duplicated suite of BMI and TBM operations present in GPR (popcnt, cntlz, set-before-first) as CR Field Operations. all of which was deemed inappropriate.
442
443 # SVP64Single 24-bits
444
445 The `SVP64-Single` 24-bit encoding focusses primarily on ensuring that
446 all 128 Scalar registers are fully accessible, provides element-width
447 overrides, one-bit predication
448 and brings Saturation to all existing Scalar operations.
449 BF16 and FP16 are thus
450 provided in the Scalar Power ISA without one single explicit FP16 or BF16
451 32-bit opcode being added. The downside: such Scalar operations are
452 all 64-bit encodings.
453
454 As SVP64Single is new and still under development, space for it may
455 instead be `RESERVED`. It is however necessary in *some* form
456 as there are limitations
457 in SVP64 Register numbering, particularly for 4-operand instructions,
458 that can only be easily overcome by SVP64Single.
459
460 # Vertical-First Mode
461
462 This is a Computer Science term that needed first to be invented.
463 There exists only one other Vertical-First Vector ISA in the world:
464 Mitch Alsup's VVM Extension for the 66000, details of which may be
465 obtained publicly on `comp.arch` or directly from Mitch Alsup under
466 NDA. Several people have
467 independently derived Vertical-First: it simply did not have a
468 Computer Science term associated with it.
469
470 If we envisage register and Memory layout to be Horizontal and
471 instructions to be Vertical, and to then have some form of Loop
472 System (wherther Zero-Overhead or just branch-conditional based)
473 it is easier to then conceptualise VF vs HF Mode:
474
475 * Vertical-First progresses through *instructions* first before
476 moving on to the next *register* (or Memory-address in the case
477 of Mitch Alsup's VVM).
478 * Horizontal-First (also known as Cray-style Vectors) progresses
479 through **registers** (or, register *elements* in traditional
480 Cray-Vector ISAs) in full before moving on to the next *instruction*.
481
482 Mitch Alsup's VVM Extension is a form of hardware-level auto-vectorisation
483 based around Zero-Overhead Loops. Using a Variable-Length Encoding all
484 loop-invariant registers are "tagged" such that the Hazard Management
485 Engine may perform optimally and do less work in automatically identifying
486 parallelism opportunities.
487 With it not being appropriate to use Variable-Length Encoding in the Power
488 ISA a different much more explicit strategy was taken in Simple-V.
489
490 The biggest advantage inherent in Vertical-First is that it is very easy
491 to introduce into compilers, because all looping, as far as programs
492 is concerned, remains expressed as *Scalar assembler*.[^autovec]
493 Whilst Mitch Alsup's
494 VVM biggest strength is its hardware-level auto-vectorisation
495 but is limited in its ability to call
496 functions, Simple-V's Vertical-First provides explicit control over the
497 parallelism ("hphint")[^hphint] and also allows for full state to be stored/restored
498 (SVLR combined with LR), permitting full function calls to be made
499 from inside Vertical-First Loops, and potentially allows arbitrarily-depth
500 nested VF Loops.
501
502 Simple-V Vertical-First Looping requires an explicit instruction to
503 move `SVSTATE` regfile offsets forward: `svstep`. An early version of
504 Vectorised
505 Branch-Conditional attempted to merge the functionality of `svstep`
506 into `sv.bc`: it became CISC-like in its complexity and was quickly reverted.
507
508 # Simple-V REMAP subsystem
509
510 [REMAP](https://libre-soc.org/openpower/sv/remap)
511 is extremely advanced but brings features already present in other
512 DSPs and Supercomputing ISAs. The usual sequential progression
513 through elements is pushed through a hardware-defined
514 *fully Deterministic*
515 "remapping". Normally (without REMAP)
516 algorithms are costly or
517 convoluted to implement. They are typically implemented
518 as hard-coded fully loop-unrolled assembler which is often
519 auto-generated by specialist tools, or written
520 entirely by hand.
521 All REMAP Schedules *including Indexed*
522 are 100% Deterministic from their point of declaration,
523 making it possible to forward-plan
524 Issue, Memory access and Register Hazard Management
525 in Multi-Issue Micro-architectures.
526
527 If combined with Vertical-First then much more complex operations may exploit
528 REMAP Schedules, such as Complex Number FFTs, by using Scalar intermediary
529 temporary registers to compute results that have a Vector source
530 or destination or both.
531 Contrast this with a Standard Horizontal-First Vector ISA where the only
532 way to perform Vectorised Complex Arithmetic would be to add Complex Vector
533 Arithmetic operations, because due to the Horizontal (element-level)
534 progression there is no way to utilise intermediary temporary (scalar)
535 variables.[^complex]
536
537 [^complex]: a case could be made for constructing Complex number arithmetic using multiple sequential Horizontal-First (Cray-style Vector) instructions. This may not be convenient in the least when REMAP is involved (such as Parallel Reduction of Complex Multiply).
538
539 * **DCT/FFT** REMAP brings more capability than TI's MSP-Series DSPs and
540 Qualcom Hexagon DSPs, and is not restricted to Integer or FP.
541 (Galois Field is possible, implementing NTT). Operates *in-place*
542 significantly reducing register usage.
543 * **Matrix** REMAP brings more capability than any other Matrix Extension
544 (AMD GPUs, Intel, ARM), not being restricted to Power-2 sizes. Also not
545 limited to the type of operation, it may perform Warshall Transitive
546 Closure, Integer Matrix, Bitmanipulation Matrix, Galois Field (carryless
547 mul) Matrix, and with care potentially Graph Maximum Flow as well. Also
548 suited to Convolutions, Matrix Transpose and rotate, *all* of which is
549 in-place.
550 * **General-purpose Indexed** REMAP, this option is provided to implement
551 an equivalent of VSX `vperm`, as a general-purpose catch-all means of
552 covering algorithms outside of the other REMAP Engines.
553 * **Parallel Reduction** REMAP, performs an automatic map-reduce using
554 *any suitable scalar operation*.
555
556 All REMAP Schedules are Precise-Interruptible. No latency penalty is caused by
557 the fact that the Schedule is Parallel-Reduction, for example. The operations
558 are Issued (Deterministically) as **Scalar** operations and thus any latency
559 associated with **Scalar** operation Issue exactly as in a **Scalar**
560 Micro-architecture will result. Contrast this with a Standard Vector ISA
561 where frequently there is either considerable interrupt latency due to
562 requiring a Parallel Reduction to complete in full, or partial results
563 to be discarded and re-started should a high-priority Interrupt occur
564 in the middle.
565
566 Note that predication is possible on REMAP but is hard to use effectively.
567 It is often best to make copies of data (`VCOMPRESS`) then apply REMAP.
568
569 \newpage{}
570 # Scalar Operations
571
572 The primary reason for mentioning the additional Scalar operations
573 is because they are so numerous, with Power ISA not having advanced
574 in the *general purpose* compute area in the past 12 years, that some
575 considerable care is needed.
576
577 Summary:
578 **Including Simple-V, to fit everything at least 75% of 3 separate
579 Major Opcodes would be required**
580
581 Candidates (for all but the X-Form instructions) include:
582
583 * EXT006 (80% free)
584 * EXT017 (75% free but not recommended)
585 * EXT001 (50% free)
586 * EXT009 (100% free)
587 * EXT005 (100% free)
588 * brownfield space in EXT019 (25% but NOT recommended)
589
590 SVP64, SVP64-Single and SVP64-Reserved would require on their own each 25%
591 of one Major Opcode for a total of 75% of one Major Opcode. The remaining
592 **Scalar** opcodes, due to there being two separate sets of operations
593 with 16-bit immediates, will require the other space totalling two 75%
594 Majors.
595
596 Note critically that:
597
598 * Unlike EXT001, SVP64's 24-bits may **not** hold also any Scalar
599 operations. There is no free available space: a 25th bit would
600 be required. The entire 24-bits is **required** for the abstracted
601 Hardware-Looping Concept **even when these 24-bits are zero**
602 * Any Scalar 64-bit instruction (regardless of how it is encoded) is unsafe to
603 then Vectorise because this creates the situation of Prefixed-Prefixed,
604 resulting in deep complexity in Hardware Decode at a critical juncture, as
605 well as introducing 96-bit instructions.
606 * **All** of these Scalar instructions are candidates for Vectorisation.
607 Thus none of them may be 64-bit-Scalar-only.
608
609 **Minor Opcodes to fit candidates above**
610
611 In order of size, for bitmanip and A/V DSP purposes:
612
613 * QTY 3of 2-bit XO: ternlogi, crternlogi, grevlogi
614 * QTY 7of 3-bit XO: xpermi, binlut, grevlog, swizzle-mv/fmv, bitmask, bmrevi
615 * QTY 8of 5/6-bit (A-Form): xpermi, bincrflut, bmask, fmvis, fishmv, bmrev,
616 Galois Field
617 * QTY 30of 10-bit (X-Form): cldiv/mul, av-min/max/diff, absdac, xperm etc.
618 (easily fit EXT019, EXT031).
619
620 Note: Some of the Galois Field operations will require QTY 1of Polynomial
621 SPR (per userspace supervisor hypervisor).
622
623 **EXT004**
624
625 For biginteger math, two instructions in the same space as "madd" are to
626 be proposed. They are both 3-in 2-out operations taking or producing a
627 64-bit "pair" (like RTp), and perform 128/64 mul and div/mod operations
628 respectively. These are **not** the same as VSX operations which are
629 128/128, and they are **not** the same as existing Scalar mul/div/mod,
630 all of which are 64/64 (or 64/32).
631
632 **EXT059 and EXT063**
633
634 Additionally for High-Performance Compute and Competitive 3D GPU, IEEE754 FP
635 Transcendentals are required, as are some DCT/FFT "Twin-Butterfly" operations.
636 For each of EXT059 and EXT063:
637
638 * QTY 33of X-Form "1-argument" (fsin, fsins, fcos, fcoss)
639 * QTY 15of X-Form "2-argument" (pow, atan2, fhypot)
640 * QTY 5of A-Form "3-in 2-out" FP Butterfly operations for DCT/FFT
641 * QTY 8of X-Form "2-in 2-out" FP Butterfly operations (again for DCT/FFT)
642 * An additional 16 instructions for IEEE754-2019
643 (fminss/fmaxss, fminmag/fmaxmag)
644 [under evaluation](https://bugs.libre-soc.org/show_bug.cgi?id=923)
645 as of 08Sep2022
646
647 # Adding new opcodes.
648
649 With Simple-V being a type of Zero-Overhead Loop Engine on top of
650 Scalar operations some clear guidelines are needed on how both
651 existing "Defined Words" (Public v3.1 Section 1.6.3 term) and future
652 Scalar operations are added within the 64-bit space. Examples of
653 legal and illegal allocations are given later.
654
655 The primary point is that once an instruction is defined in Scalar
656 32-bit form its corresponding space **must** be reserved in the
657 SVP64 area with the exact same 32-bit form, even if that instruction
658 is "Unvectoriseable" (`sc`, `sync`, `rfid` and `mtspr` for example).
659 Instructions may **not** be added in the Vector space without also
660 being added in the Scalar space, and vice-versa, *even if Unvectoriseable*.
661
662 This is extremely important because the worst possible situation
663 is if a conflicting Scalar instruction is added by another Stakeholder,
664 which then turns out to be Vectoriseable: it would then have to be
665 added to the Vector Space with a *completely different Defined Word*
666 and things go rapidly downhill in the Decode Phase from there.
667 Setting a simple inviolate rule helps avoid this scenario but does
668 need to be borne in mind when discussing potential allocation
669 schemes, as well as when new Vectoriseable Opcodes are proposed
670 for addition by future RFCs: the opcodes **must** be uniformly
671 added to Scalar **and** Vector spaces, or added in one and reserved
672 in the other, or
673 not added at all in either.[^whoops]
674
675 \newpage{}
676 # Potential Opcode allocation solution (superseded)
677
678 *Note this scheme is superseded below but kept for completeness as it
679 defines terms and context*.
680 There are unfortunately some inviolate requirements that directly place
681 pressure on the EXT000-EXT063 (32-bit) opcode space to such a degree that
682 it risks jeapordising the Power ISA. These requirements are:
683
684 * all of the scalar operations must be Vectoriseable
685 * all of the scalar operations intended for Vectorisation
686 must be in a 32-bit encoding (not prefixed-prefixed to 96-bit)
687 * bringing Scalar Power ISA up-to-date from the past 12 years
688 needs 75% of two Major opcodes all on its own
689
690 There exists a potential scheme which meets (exceeds) the above criteria,
691 providing plenty of room for both Scalar (and Vectorised) operations,
692 *and* provides SVP64-Single with room to grow. It
693 is based loosely around Public v3.1 EXT001 Encoding.[^ext001]
694
695 | 0-5 | 6 | 7 | 8-31 | Description |
696 |-----|---|---|-------|---------------------------|
697 | PO | 0 | 0 | 0000 | new-suffix `RESERVED1` |
698 | PO | 0 | 0 | !zero | new-suffix, scalar (SVP64Single), or `RESERVED3` |
699 | PO | 1 | 0 | 0000 | new scalar-only word, or `RESERVED2` |
700 | PO | 1 | 0 | !zero | old-suffix, scalar (SVP64Single), or `RESERVED4` |
701 | PO | 0 | 1 | nnnn | new-suffix, vector (SVP64) |
702 | PO | 1 | 1 | nnnn | old-suffix, vector (SVP64) |
703
704 * **PO** - Primary Opcode. Likely candidates: EXT005, EXT009
705 * **bit 6** - specifies whether the suffix is old (EXT000-EXT063)
706 or new (EXTn00-EXTn63, n greater than 1)
707 * **bit 7** - defines whether the Suffix is Scalar-Prefixed or Vector-Prefixed
708 (caveat: see bits 8-31)
709 * **old-suffix** - the EXT000 to EXT063 32-bit Major opcodes of Power ISA 3.0
710 * **new scalar-only** - a **new** Major Opcode area **exclusively**
711 for Scalar-only instructions that shall **never** be Prefixed by SVP64
712 (RESERVED2 EXT300-EXT363)
713 * **new-suffix** - a **new** Major Opcode area (RESERVED1 EXT200-EXT263)
714 that **may** be Prefixed by SVP64 and SVP64Single
715 * **0000** - all 24 bits bits 8-31 are zero (0x000000)
716 * **!zero** - bits 8-31 may be any value *other* than zero (0x000001-0xffffff)
717 * **nnnn** - bits 8-31 may be any value in the range 0x000000 to 0xffffff
718 * **SVP64Single** - a ([TBD](https://bugs.libre-soc.org/show_bug.cgi?id=905))
719 *Scalar* Encoding that is near-identical to SVP64
720 except that it is equivalent to hard-coded VL=1
721 at all times. Predication is permitted, Element-width-overrides is
722 permitted, Saturation is permitted.
723 If not allocated within the scope of this RFC
724 then these are requested to be `RESERVED` for a future Simple-V
725 proposal.
726 * **SVP64** - a (well-defined, 2 years) DRAFT Proposal for a Vectorisation
727 Augmentation of suffixes.
728
729 For the needs identified by Libre-SOC (75% of 2 POs),
730 `RESERVED1` space *needs*
731 allocation to new POs, `RESERVED2` does not.[^only2]
732
733 | | Scalar (bit7=0,8-31=0000) | Scalar (bit7=0,8-31=!zero)| Vector (bit7=1) |
734 |----------|---------------------------|---------------------------|------------------|
735 |new bit6=0| `RESERVED1`:{EXT200-263} | `RESERVED3`:SVP64-Single:{EXT200-263} | SVP64:{EXT200-263} |
736 |old bit6=1| `RESERVED2`:{EXT300-363} | `RESERVED4`:SVP64-Single:{EXT000-063} | SVP64:{EXT000-063} |
737
738 * **`RESERVED2`:{EXT300-363}** (not strictly necessary to be added) is not
739 and **cannot** ever be Vectorised or Augmented by Simple-V or any future
740 Simple-V Scheme.
741 it is a pure **Scalar-only** word-length PO Group. It may remain `RESERVED`.
742 * **`RESERVED1`:{EXT200-263}** is also a new set of 64 word-length Major
743 Opcodes.
744 These opcodes would be Simple-V-Augmentable
745 unlike `EXT300-363` which may **never** be Simple-V-Augmented
746 under any circumstances.
747 * **RESERVED3:`SVP64-Single:{EXT200-263}`** - Major opcodes 200-263 with
748 Single-Augmentation, providing a one-bit predicate mask, element-width
749 overrides on source and destination, and the option to extend the Scalar
750 Register numbering (r0-32 extends to r0-127). **Placing of alternative
751 instruction encodings other than those exactly defined in EXT200-263
752 is prohibited**.
753 * **RESERVED4:`SVP64-Single:{EXT000-063}`** - Major opcodes 000-063 with
754 Single-Augmentation, just like SVP64-Single on EXT200-263, these are
755 in effect Single-Augmented-Prefixed variants of the v3.0 32-bit Power ISA.
756 Alternative instruction encodings other than the exact same 32-bit word
757 from EXT000-EXT063 are likewise prohibited.
758 * **`SVP64:{EXT000-063}`** and **`SVP64:{EXT200-263}`** - Full Vectorisation
759 of EXT000-063 and EXT200-263 respectively, these Prefixed instructions
760 are likewise prohibited from being a different encoding from their
761 32-bit scalar versions.
762
763 Limitations of this scheme is that new 32-bit Scalar operations have to have
764 a 32-bit "prefix pattern" in front of them. If commonly-used this could
765 increase binary size. Thus the Encodings EXT300-363 and EXT200-263 should
766 only be allocated for less-popular operations. However the scheme does
767 have the strong advantage of *tripling* the available number of Major
768 Opcodes in the Power ISA, caveat being that care on allocation is needed
769 because EXT200-EXT263 may be SVP64-Augmented whilst EXT300-EXT363 may **not**.
770 The issues of allocation for bitmanip etc. from Libre-SOC is therefore
771 overwhelmingly made moot. The only downside is that there is no
772 `SVP64-Reserved` which will have to be achieved with SPRs (PCR or MSR).
773
774 *Most importantly what this scheme does not do is provide large areas
775 for other (non-Vectoriseable) RFCs.*
776
777 # Potential Opcode allocation solution (2)
778
779 One of the risks of the bit 6/7 scheme above is that there is no
780 room to share PO9 (EXT009) with other potential uses. A workaround for
781 that is as follows:
782
783 * EXT009, like EXT001 of Public v3.1, is **defined** as a 64-bit
784 encoding. This makes Multi-Issue Length-identification trivial.
785 * bit 6 if 0b1 is 100% for Simple-V augmentation of (Public v3.1 1.6.3)
786 "Defined Words" (aka EXT000-063), with the exception of 0x26000000
787 as a Prefix, which is a new RESERVED encoding.
788 * when bit 6 is 0b0 and bits 32-33 are 0b11 are **defined** as also
789 allocated to Simple-V
790 * all other patterns are `RESERVED` for other non-Vectoriseable
791 purposes (just over 37.5%).
792
793 | 0-5 | 6 | 7 | 8-31 | 32:33 | Description |
794 |-----|---|---|-------|-------|----------------------------|
795 | PO9?| 0 | 0 | !zero | 00-10 | RESERVED (other) |
796 | PO9?| 0 | 1 | xxxx | 00-10 | RESERVED (other) |
797 | PO9?| x | 0 | 0000 | xx | RESERVED (other) |
798 | PO9?| 0 | 0 | !zero | 11 | SVP64 (current and future) |
799 | PO9?| 0 | 1 | xxxx | 11 | SVP64 (current and future) |
800 | PO9?| 1 | 0 | !zero | xx | SVP64 (current and future) |
801 | PO9?| 1 | 1 | xxxx | xx | SVP64 (current and future) |
802
803 This ensures that any potential for future conflict over uses of the
804 EXT009 space, jeapordising Simple-V in the process, are avoided,
805 yet leaves huge areas (just over 37.5% of the 64-bit space) for other
806 (non-Vectoriseable) uses.
807
808 These areas thus need to be Allocated (SVP64 and Scalar EXT248-263):
809
810 | 0-5 | 6 | 7 | 8-31 | 32-3 | Description |
811 |-----|---|---|-------|------|---------------------------|
812 | PO | 0 | 0 | !zero | 0b11 | SVP64Single:EXT248-263, or `RESERVED3` |
813 | PO | 0 | 0 | 0000 | 0b11 | Scalar EXT248-263 |
814 | PO | 0 | 1 | nnnn | 0b11 | SVP64:EXT248-263 |
815 | PO | 1 | 0 | !zero | nn | SVP64Single:EXT000-063 or `RESERVED4` |
816 | PO | 1 | 1 | nnnn | nn | SVP64:EXT000-063 |
817
818 and reserved areas, QTY 1of 32-bit, and QTY 3of 55-bit, are:
819
820 | 0-5 | 6 | 7 | 8-31 | 32-3 | Description |
821 |-----|---|---|-------|------|---------------------------|
822 | PO9?| 1 | 0 | 0000 | xx | `RESERVED1` or EXT300-363 (32-bit) |
823 | PO9?| 0 | x | xxxx | 0b00 | `RESERVED2` or EXT200-216 (55-bit) |
824 | PO9?| 0 | x | xxxx | 0b01 | `RESERVED2` or EXT216-231 (55-bit) |
825 | PO9?| 0 | x | xxxx | 0b10 | `RESERVED2` or EXT232-247 (55-bit) |
826
827 * SVP64Single (`RESERVED3/4`) is *planned* for a future RFC
828 (but needs reserving as part of this RFC)
829 * `RESERVED1/2` is available for new general-purpose
830 (non-Vectoriseable) 32-bit encodings (other RFCs)
831 * EXT248-263 is for "new" instructions
832 which **must** be granted corresponding space
833 in SVP64.
834 * Anything Vectorised-EXT000-063 is **automatically** being
835 requested as 100% Reserved for every single "Defined Word"
836 (Public v3.1 1.6.3 definition). Vectorised-EXT001 or EXT009
837 is defined as illegal.
838 * Any **future** instruction
839 added to EXT000-063 likewise, must **automatically** be
840 assigned corresponding reservations in the SVP64:EXT000-063
841 and SVP64Single:EXT000-063 area, regardless of whether the
842 instruction is Vectoriseable or not.
843
844 Bit-allocation Summary:
845
846 * EXT3nn and other areas provide space for up to
847 QTY 4of non-Vectoriseable EXTn00-EXTn47 ranges.
848 * QTY 3of 55-bit spaces also exist for future use (longer by 3 bits
849 than opcodes allocated in EXT001)
850 * Simple-V EXT2nn is restricted to range EXT248-263
851 * non-Simple-V (non-Vectoriseable) EXT2nn (if ever requested in any future RFC) is restricted to range EXT200-247
852 * Simple-V EXT0nn takes up 50% of PO9 for this and future Simple-V RFCs
853
854 **This however potentially puts SVP64 under pressure (in 5-10 years).**
855 Ideas being discussed already include adding LD/ST-with-Shift and variant
856 Shift-Immediate operations that require large quantity of Primary Opcodes.
857 To ensure that there is room in future,
858 it may be better to allocate 25% to `RESERVED`:
859
860 | 0-5 | 6 | 7 | 8-31 | 32 | Description |
861 |-----|---|---|-------|-----|---------------------------|
862 | PO9?| 1 | 0 | 0000 | x | EXT300-363 or `RESERVED1` (32-bit) |
863 | PO9?| 0 | x | xxxx | 0b0 | EXT200-232 or `RESERVED2` (56-bit) |
864 | PO9?| 0 | x | xxxx | 0b1 | EXT232-263 and SVP64(/V/S) |
865
866 The clear separation between Simple-V and non-Simple-V stops
867 conflict in future RFCs, both of which get plenty of space.
868 EXT000-063 pressure is reduced in both Vectoriseable and
869 non-Vectoriseable, and the 100+ Vectoriseable Scalar operations
870 identified by Libre-SOC may safely be proposed and each evaluated
871 on their merits.
872
873 \newpage{}
874
875 **EXT000-EXT063**
876
877 These are Scalar word-encodings. Often termed "v3.0 Scalar" in this document
878 Power ISA v3.1 Section 1.6.3 Book I calls it a "defined word".
879
880 | 0-5 | 6-31 |
881 |--------|--------|
882 | PO | EXT000-063 "Defined word" |
883
884 **SVP64Single:{EXT000-063}** bit6=old bit7=scalar
885
886 This encoding, identical to SVP64Single:{EXT248-263},
887 introduces SVP64Single Augmentation of Scalar "defined words".
888 All meanings must be identical to EXT000-063, and is is likewise
889 prohibited to add an instruction in this area without also adding
890 the exact same (non-Augmented) instruction in EXT000-063 with the
891 exact same Scalar word.
892 Bits 32-37 0b00000 to 0b11111 represent EXT000-063 respectively.
893 Augmenting EXT001 or EXT009 is prohibited.
894
895 | 0-5 | 6 | 7 | 8-31 | 32-63 |
896 |--------|---|---|-------|---------|
897 | PO (9)?| 1 | 0 | !zero | SVP64Single:{EXT000-063} |
898
899 **SVP64:{EXT000-063}** bit6=old bit7=vector
900
901 This encoding is identical to **SVP64:{EXT248-263}** except it
902 is the Vectorisation of existing v3.0/3.1 Scalar-words, EXT000-063.
903 All the same rules apply with the addition that
904 Vectorisation of EXT001 or EXT009 is prohibited.
905
906 | 0-5 | 6 | 7 | 8-31 | 32-63 |
907 |--------|---|---|-------|---------|
908 | PO (9)?| 1 | 1 | nnnn | SVP64:{EXT000-063} |
909
910 **{EXT248-263}** bit6=new bit7=scalar
911
912 This encoding represents the opportunity to introduce EXT248-263.
913 It is a Scalar-word encoding, and does not require implementing
914 SVP64 or SVP64-Single, but does require the Vector-space to be allocated.
915 PO2 is in the range 0b11000 to 0b111111 to represent EXT248-263 respectively.
916
917 | 0-5 | 6 | 7 | 8-31 | 32-3 | 34-37 | 38-63 |
918 |--------|---|---|-------|------|---------|---------|
919 | PO (9)?| 0 | 0 | 0000 | 0b11 |PO2[2:5] | {EXT248-263} |
920
921 **SVP64Single:{EXT248-263}** bit6=new bit7=scalar
922
923 This encoding, which is effectively "implicit VL=1"
924 and comprising (from bits 8-31 being non-zero)
925 *at least some* form of Augmentation, it represents the opportunity
926 to Augment EXT248-263 with the SVP64Single capabilities.
927 Must be allocated under Scalar *and* SVP64 simultaneously.
928
929 | 0-5 | 6 | 7 | 8-31 | 32-3 | 34-37 | 38-63 |
930 |--------|---|---|-------|------|---------|---------|
931 | PO (9)?| 0 | 0 | !zero | 0b11 |PO2[2:5] | SVP64Single:{EXT248-263} |
932
933 **SVP64:{EXT248-263}** bit6=new bit7=vector
934
935 This encoding, which permits VL to be dynamic (settable from GPR or CTR)
936 is the Vectorisation of EXT248-263.
937 Instructions may not be placed in this category without also being
938 implemented as pure Scalar *and* SVP64Single. Unlike SVP64Single
939 however, there is **no reserved encoding** (bits 8-24 zero).
940 VL=1 may occur dynamically
941 at runtime, even when bits 8-31 are zero.
942
943 | 0-5 | 6 | 7 | 8-31 | 32-3 | 34-37 | 38-63 |
944 |--------|---|---|-------|------|---------|---------|
945 | PO (9)?| 0 | 1 | nnnn | 0b11 |PO2[2:5] | SVP64:{EXT248-263} |
946
947 **RESERVED2 / EXT300-363** bit6=old bit7=scalar
948
949 This is entirely at the discretion of the ISA WG. Libre-SOC is *not*
950 proposing the addition of EXT300-363: it is merely a possibility for
951 future. The reason the space is not needed is because this is within
952 the realm of Scalar-extended (SVP64Single), and with the 24-bit prefix
953 area being all-zero (bits 8-31) this is defined as "having no augmentation"
954 (in the Simple-V Specification it is termed `Scalar Identity Behaviour`).
955 This in turn makes this prefix a *degenerate duplicate* so may be allocated
956 for other purposes.
957
958 | 0-5 | 6 | 7 | 8-31 | 32-63 |
959 |--------|---|---|-------|---------|
960 | PO (9)?| 1 | 0 | 0000 | EXT300-363 or `RESERVED1` |
961
962 \newpage{}
963 # Example Legal Encodings and RESERVED spaces
964
965 This section illustrates what is legal encoding, what is not, and
966 why the 4 spaces should be `RESERVED` even if not allocated as part
967 of this RFC.
968
969 **legal, scalar and vector**
970
971 | width | assembler | prefix? | suffix | description |
972 |-------|-----------|--------------|-----------|---------------|
973 | 32bit | fishmv | none | 0x12345678| scalar EXT0nn |
974 | 64bit | ss.fishmv | 0x26!zero | 0x12345678| scalar SVP64Single:EXT0nn |
975 | 64bit | sv.fishmv | 0x27nnnnnn | 0x12345678| vector SVP64:EXT0nn |
976
977 OR:
978
979 | width | assembler | prefix? | suffix | description |
980 |-------|-----------|--------------|-----------|---------------|
981 | 64bit | fishmv | 0x24000000 | 0x12345678| scalar EXT2nn |
982 | 64bit | ss.fishmv | 0x24!zero | 0x12345678| scalar SVP64Single:EXT2nn |
983 | 64bit | sv.fishmv | 0x25nnnnnn | 0x12345678| vector SVP64:EXT2nn |
984
985 Here the encodings are the same, 0x12345678 means the same thing in
986 all cases. Anything other than this risks either damage (truncation
987 of capabilities of Simple-V) or far greater complexity in the
988 Decode Phase.
989
990 This drives the compromise proposal (above) to reserve certain
991 EXT2nn POs right
992 across the board
993 (in the Scalar Suffix side, irrespective of Prefix), some allocated
994 to Simple-V, some not.
995
996 **illegal due to missing**
997
998 | width | assembler | prefix? | suffix | description |
999 |-------|-----------|--------------|-----------|---------------|
1000 | 32bit | fishmv | none | 0x12345678| scalar EXT0nn |
1001 | 64bit | ss.fishmv | 0x26!zero | 0x12345678| scalar SVP64Single:EXT0nn |
1002 | 64bit | unallocated | 0x27nnnnnn | 0x12345678| vector SVP64:EXT0nn |
1003
1004 This is illegal because the instruction is possible to Vectorise,
1005 therefore it should be **defined** as Vectoriseable.
1006
1007 **illegal due to unvectoriseable**
1008
1009 | width | assembler | prefix? | suffix | description |
1010 |-------|-----------|--------------|-----------|---------------|
1011 | 32bit | mtmsr | none | 0x12345678| scalar EXT0nn |
1012 | 64bit | ss.mtmsr | 0x26!zero | 0x12345678| scalar SVP64Single:EXT0nn |
1013 | 64bit | sv.mtmsr | 0x27nnnnnn | 0x12345678| vector SVP64:EXT0nn |
1014
1015 This is illegal because the instruction `mtmsr` is not possible to Vectorise,
1016 at all. This does **not** convey an opportunity to allocate the
1017 space to an alternative instruction.
1018
1019 **illegal unvectoriseable in EXT2nn**
1020
1021 | width | assembler | prefix? | suffix | description |
1022 |-------|-----------|--------------|-----------|---------------|
1023 | 64bit | mtmsr2 | 0x24000000 | 0x12345678| scalar EXT2nn |
1024 | 64bit | ss.mtmsr2 | 0x24!zero | 0x12345678| scalar SVP64Single:EXT2nn |
1025 | 64bit | sv.mtmsr2 | 0x25nnnnnn | 0x12345678| vector SVP64:EXT2nn |
1026
1027 For a given hypothetical `mtmsr2` which is inherently Unvectoriseable
1028 whilst it may be put into the scalar EXT2nn space it may **not** be
1029 allocated in the Vector space. As with Unvectoriseable EXT0nn opcodes
1030 this does not convey the right to use the 0x24/0x26 space for alternative
1031 opcodes. This hypothetical Unvectoriseable operation would be better off
1032 being allocated as EXT001 Prefixed, EXT000-063, or hypothetically in
1033 EXT300-363.
1034
1035 **ILLEGAL: dual allocation**
1036
1037 | width | assembler | prefix? | suffix | description |
1038 |-------|-----------|--------------|-----------|---------------|
1039 | 32bit | fredmv | none | 0x12345678| scalar EXT0nn |
1040 | 64bit | ss.fredmv | 0x26!zero | 0x12345678| scalar SVP64Single:EXT0nn |
1041 | 64bit | sv.fishmv | 0x27nnnnnn | 0x12345678| vector SVP64:EXT0nn |
1042
1043 the use of 0x12345678 for fredmv in scalar but fishmv in Vector is
1044 illegal. the suffix in both 64-bit locations
1045 must be allocated to a Vectoriseable EXT000-063
1046 "Defined Word" (Public v3.1 Section 1.6.3 definition)
1047 or not at all.
1048
1049 \newpage{}
1050
1051 **illegal unallocated scalar EXT0nn or EXT2nn:**
1052
1053 | width | assembler | prefix? | suffix | description |
1054 |-------|-----------|--------------|-----------|---------------|
1055 | 32bit | unallocated | none | 0x12345678| scalar EXT0nn |
1056 | 64bit | ss.fredmv | 0x26!zero | 0x12345678| scalar SVP64Single:EXT0nn |
1057 | 64bit | sv.fishmv | 0x27nnnnnn | 0x12345678| vector SVP64:EXT0nn |
1058
1059 and:
1060
1061 | width | assembler | prefix? | suffix | description |
1062 |-------|-----------|--------------|-----------|---------------|
1063 | 64bit | unallocated | 0x24000000 | 0x12345678| scalar EXT2nn |
1064 | 64bit | ss.fishmv | 0x24!zero | 0x12345678| scalar SVP64Single:EXT2nn |
1065 | 64bit | sv.fishmv | 0x25nnnnnn | 0x12345678| vector SVP64:EXT2nn |
1066
1067 Both of these Simple-V operations are illegally-allocated. The fact that
1068 there does not exist a scalar "Defined Word" (even for EXT200-263) - the
1069 unallocated block - means that the instruction may **not** be allocated in
1070 the Simple-V space.
1071
1072 **illegal attempt to put Scalar EXT004 into Vector EXT2nn**
1073
1074 | width | assembler | prefix? | suffix | description |
1075 |-------|-----------|--------------|-----------|---------------|
1076 | 32bit | unallocated | none | 0x10345678| scalar EXT0nn |
1077 | 64bit | ss.fishmv | 0x24!zero | 0x10345678| scalar SVP64Single:EXT2nn |
1078 | 64bit | sv.fishmv | 0x25nnnnnn | 0x10345678| vector SVP64:EXT2nn |
1079
1080 This is an illegal attempt to place an EXT004 "Defined Word"
1081 (Public v3.1 Section 1.6.3) into the EXT2nn Vector space.
1082 This is not just illegal it is not even possible to achieve.
1083 If attempted, by dropping EXT004 into bits 32-37, the top two
1084 MSBs are actually *zero*, and the Vector EXT2nn space is only
1085 legal for Primary Opcodes in the range 248-263, where the top
1086 two MSBs are 0b11. Thus this faulty attempt actually falls
1087 unintentionally
1088 into `RESERVED` "Non-Vectoriseable" Encoding space.
1089
1090 **illegal attempt to put Scalar EXT001 into Vector space**
1091
1092 | width | assembler | prefix? | suffix | description |
1093 |-------|-----------|--------------|-----------|---------------|
1094 | 64bit | EXT001 | 0x04nnnnnn | any | scalar EXT001 |
1095 | 96bit | sv.EXT001 | 0x24!zero | EXT001 | scalar SVP64Single:EXT001 |
1096 | 96bit | sv.EXT001 | 0x25nnnnnn | EXT001 | vector SVP64:EXT001 |
1097
1098 This becomes in effect an effort to define 96-bit instructions,
1099 which are illegal due to cost at the Decode Phase (Variable-Length
1100 Encoding). Likewise attempting to embed EXT009 (chained) is also
1101 illegal. The implications are clear unfortunately that all 64-bit
1102 EXT001 Scalar instructions are Unvectoriseable.
1103
1104 \newpage{}
1105 # Use cases
1106
1107 In the following examples the programs are fully executable under the
1108 Libre-SOC Simple-V-augmented Power ISA Simulator. Reproducible
1109 (scripted) Installation instructions:
1110 <https://libre-soc.org/HDL_workflow/devscripts/>
1111
1112 ## LD/ST-Multi
1113
1114 Context-switching saving and restoring of registers on the stack often
1115 requires explicit loop-unrolling to achieve effectively. In SVP64 it
1116 is possible to use a Predicate Mask to "compact" or "expand" a swathe
1117 of desired registers, dynamically. Known as "VCOMPRESS" and "VEXPAND",
1118 runtime-configurable LD/ST-Multi is achievable with 2 instructions.
1119
1120 ```
1121 # load 64 registers off the stack, in-order, skipping unneeded ones
1122 # by using CR0-CR63's "EQ" bits to select only those needed.
1123 setvli 64
1124 sv.ld/sm=EQ *rt,0(ra)
1125 ```
1126
1127 ## Twin-Predication, re-entrant
1128
1129 This example demonstrates two key concepts: firstly Twin-Predication
1130 (separate source predicate mask from destination predicate mask) and
1131 that sufficient state is stored within the Vector Context SPR, SVSTATE,
1132 for full re-entrancy on a Context Switch or function call *even if
1133 in the middle of executing a loop*. Also demonstrates that it is
1134 permissible for a programmer to write **directly** to the SVSTATE
1135 SPR, and still expect Deterministic Behaviour. It's not exactly recommended
1136 (performance may be impacted by direct SVSTATE access), but it is not
1137 prohibited either.
1138
1139 ```
1140 292 # checks that we are able to resume in the middle of a VL loop,
1141 293 # after an interrupt, or after the user has updated src/dst step
1142 294 # let's assume the user has prepared src/dst step before running this
1143 295 # vector instruction
1144 296 # test_intpred_reentrant
1145 297 # reg num 0 1 2 3 4 5 6 7 8 9 10 11 12
1146 298 # srcstep=1 v
1147 299 # src r3=0b0101 Y N Y N
1148 300 # : |
1149 301 # + - - + |
1150 302 # : +-------+
1151 303 # : |
1152 304 # dest ~r3=0b1010 N Y N Y
1153 305 # dststep=2 ^
1154 306
1155 307 sv.extsb/sm=r3/dm=~r3 *5, *9
1156 ```
1157
1158 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_predication.py;hb=HEAD>
1159
1160 ## Matrix Multiply
1161
1162 Matrix Multiply of any size (non-power-2) up to a total of 127 operations
1163 is achievable with only three instructions. Normally in any other SIMD
1164 ISA at least one source requires Transposition and often massive rolling
1165 repetition of data is required. These 3 instructions may be used as the
1166 "inner triple-loop kernel" of the usual 6-loop Massive Matrix Multiply.
1167
1168 ```
1169 28 # test_sv_remap1 5x4 by 4x3 matrix multiply
1170 29 svshape 5, 4, 3, 0, 0
1171 30 svremap 31, 1, 2, 3, 0, 0, 0
1172 31 sv.fmadds *0, *8, *16, *0
1173 ```
1174
1175 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_matrix.py;hb=HEAD>
1176
1177 ## Parallel Reduction
1178
1179 Parallel (Horizontal) Reduction is often deeply problematic in SIMD and
1180 Vector ISAs. Parallel Reduction is Fully Deterministic in Simple-V and
1181 thus may even usefully be deployed on non-associative and non-commutative
1182 operations.
1183
1184 ```
1185 75 # test_sv_remap2
1186 76 svshape 7, 0, 0, 7, 0
1187 77 svremap 31, 1, 0, 0, 0, 0, 0 # different order
1188 78 sv.subf *0, *8, *16
1189 ```
1190
1191 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_parallel_reduce.py;hb=HEAD>
1192
1193 \newpage{}
1194 ## DCT
1195
1196 DCT has dozens of uses in Audio-Visual processing and CODECs.
1197 A full 8-wide in-place triple-loop Inverse DCT may be achieved
1198 in 8 instructions. Expanding this to 16-wide is a matter of setting
1199 `svshape 16` **and the same instructions used**.
1200 Lee Composition may be deployed to construct non-power-two DCTs.
1201 The cosine table may be computed (once) with 18 Vector instructions
1202 (one of them `fcos`)
1203
1204 ```
1205 1014 # test_sv_remap_fpmadds_ldbrev_idct_8_mode_4
1206 1015 # LOAD bit-reversed with half-swap
1207 1016 svshape 8, 1, 1, 14, 0
1208 1017 svremap 1, 0, 0, 0, 0, 0, 0
1209 1018 sv.lfs/els *0, 4(1)
1210 1019 # Outer butterfly, iterative sum
1211 1020 svremap 31, 0, 1, 2, 1, 0, 1
1212 1021 svshape 8, 1, 1, 11, 0
1213 1022 sv.fadds *0, *0, *0
1214 1023 # Inner butterfly, twin +/- MUL-ADD-SUB
1215 1024 svshape 8, 1, 1, 10, 0
1216 1025 sv.ffmadds *0, *0, *0, *8
1217 ```
1218
1219 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_dct.py;hb=HEAD>
1220
1221 ## 3D GPU style "Branch Conditional"
1222
1223 (*Note: Specification is ready, Simulator still under development of
1224 full specification capabilities*)
1225 This example demonstrates a 2-long Vector Branch-Conditional only
1226 succeeding if *all* elements in the Vector are successful. This
1227 avoids the need for additional instructions that would need to
1228 perform a Parallel Reduction of a Vector of Condition Register
1229 tests down to a single value, on which a Scalar Branch-Conditional
1230 could then be performed. Full Rationale at
1231 <https://libre-soc.org/openpower/sv/branches/>
1232
1233 ```
1234 80 # test_sv_branch_cond_all
1235 81 for i in [7, 8, 9]:
1236 83 addi 1, 0, i+1 # set r1 to i
1237 84 addi 2, 0, i # set r2 to i
1238 85 cmpi cr0, 1, 1, 8 # compare r1 with 8 and store to cr0
1239 86 cmpi cr1, 1, 2, 8 # compare r2 with 8 and store to cr1
1240 87 sv.bc/all 12, *1, 0xc # bgt 0xc - branch if BOTH
1241 88 # r1 AND r2 greater 8 to the nop below
1242 89 addi 3, 0, 0x1234, # if tests fail this shouldn't execute
1243 90 or 0, 0, 0 # branch target
1244 ```
1245
1246 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_bc.py;hb=HEAD>
1247
1248 ## Big-Integer Math
1249
1250 Remarkably, `sv.adde` is inherently a big-integer Vector Add, using `CA`
1251 chaining between **Scalar** operations.
1252 Using Vector LD/ST and recalling that the first and last `CA` may
1253 be chained in and out of an entire **Vector**, unlimited-length arithmetic is
1254 possible.
1255
1256 ```
1257 26 # test_sv_bigint_add
1258 32
1259 33 r3/r2: 0x0000_0000_0000_0001 0xffff_ffff_ffff_ffff +
1260 34 r5/r4: 0x8000_0000_0000_0000 0x0000_0000_0000_0001 =
1261 35 r1/r0: 0x8000_0000_0000_0002 0x0000_0000_0000_0000
1262 36
1263 37 sv.adde *0, *2, *4
1264 ```
1265
1266 A 128/64-bit shift may be used as a Vector shift by a Scalar amount, by merging
1267 two 64-bit consecutive registers in succession.
1268
1269 ```
1270 62 # test_sv_bigint_scalar_shiftright(self):
1271 64
1272 65 r3 r2 r1 r4
1273 66 0x0000_0000_0000_0002 0x8000_8000_8000_8001 0xffff_ffff_ffff_ffff >> 4
1274 67 0x0000_0000_0000_0002 0x2800_0800_0800_0800 0x1fff_ffff_ffff_ffff
1275 68
1276 69 sv.dsrd *0,*1,4,1
1277 ```
1278
1279 Additional 128/64 Mul and Div/Mod instructions may similarly be exploited
1280 to perform roll-over in arbitrary-length arithmetic: effectively they use
1281 one of the two 64-bit output registers as a form of "64-bit Carry In-Out".
1282
1283 All of these big-integer instructions are Scalar instructions standing on
1284 their own merit and may be utilised even in a Scalar environment to improve
1285 performance. When used with Simple-V they may also be used to improve
1286 performance and also greatly simplify unlimited-length biginteger algorithms.
1287
1288 <https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/test_caller_svp64_bigint.py;hb=HEAD>
1289
1290 [[!tag opf_rfc]]
1291
1292 [^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**.
1293 [^msr]: an MSR bit or bits, conceptually equivalent to `MSR.SF` and added for the same reasons, would suffice perfectly.
1294 [^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
1295 [^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.
1296 [^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
1297 [^only2]: reminder that this proposal only needs 75% of two POs for Scalar instructions. The rest of EXT200-263 is for general use.
1298 [^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
1299 [^futurevsx]: A future version or other Stakeholder *may* wish to drop Simple-V onto VSX: this would be a separate RFC
1300 [^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.
1301 [^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.
1302 [^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
1303 [^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.
1304 [^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 over two months to add then remove.
1305 [^mul]: Setting this "multiplier" to 1 clearly leaves pre-existing Scalar behaviour completely intact as a degenerate case.
1306 [^ldstcisc]: At least the CISC "auto-increment" modes are not present, from the CDC 6600 and Motorola 68000! although these would be fun to introduce they do unfortunately make for 3-in 3-out register profiles, all 64-bit, which explains why the 6600 and 68000 had separate special dedicated address regfiles.