(no commit message)
[libreriscv.git] / openpower / sv / rfc / ls010.mdwn
1 # RFC ls010 SVP64 Zero-Overhead Loop Prefix Subsystem
2
3 Credits and acknowledgements:
4
5 * Luke Leighton
6 * Jacob Lifshay
7 * Hendrik Boom
8 * Richard Wilbur
9 * Alexandre Oliva
10 * Cesar Strauss
11 * NLnet Foundation, for funding
12 * OpenPOWER Foundation
13 * Paul Mackerras
14 * Toshaan Bharvani
15 * IBM for the Power ISA itself
16
17 Links:
18
19 * <https://bugs.libre-soc.org/show_bug.cgi?id=1045>
20
21 # Introduction
22
23 Simple-V is a type of Vectorisation best described as a "Prefix Loop
24 Subsystem" similar to the 5 decades-old Zilog Z80 `LDIR` instruction and
25 to the 8086 `REP` Prefix instruction. More advanced features are similar
26 to the Z80 `CPIR` instruction. If viewed one-dimensionally as an actual
27 Vector ISA it introduces over 1.5 million 64-bit Vector instructions.
28 SVP64, the instruction format used by Simple-V, is therefore best viewed
29 as an orthogonal RISC-paradigm "Prefixing" subsystem instead.
30
31 Except where explicitly stated all bit numbers remain as in the rest of
32 the Power ISA: in MSB0 form (the bits are numbered from 0 at the MSB on
33 the left and counting up as you move rightwards to the LSB end). All bit
34 ranges are inclusive (so `4:6` means bits 4, 5, and 6, in MSB0 order).
35 **All register numbering and element numbering however is LSB0 ordering**
36 which is a different convention from that used elsewhere in the Power ISA.
37
38 The SVP64 prefix always comes before the suffix in PC order and must be
39 considered an independent "Defined word" that augments the behaviour of
40 the following instruction, but does **not** change the actual Decoding
41 of that following instruction. **All prefixed instructions retain their
42 non-prefixed encoding and definition**.
43
44 Two apparent exceptions to the above hard rule exist: SV Branch-Conditional
45 operations and LD/ST-update "Post-Increment" Mode. Post-Increment
46 was considered sufficiently high priority (significantly reducing hot-loop
47 instruction count) that one bit in the Prefix is reserved for it.
48 Vectorised Branch-Conditional operations "embed" the original Scalar
49 Branch-Conditional behaviour into a much more advanced variant that
50 is highly suited to High-Performance Computation (HPC), Supercomputing,
51 and parallel GPU Workloads.
52
53 *Architectural Resource Allocation note: it is prohibited to accept RFCs
54 which fundamentally violate this hard requirement. Under no circumstances
55 must the Suffix space have an alternate instruction encoding allocated
56 within SVP64 that is entirely different from the non-prefixed Defined
57 Word. Hardware Implementors critically rely on this inviolate guarantee
58 to implement High-Performance Multi-Issue micro-architectures that can
59 sustain 100% throughput*
60
61 Subset implementations in hardware are permitted, as long as certain
62 rules are followed, allowing for full soft-emulation including future
63 revisions. Compliancy Subsets exist to ensure minimum levels of binary
64 interoperability expectations within certain environments.
65
66 ## SVP64 encoding features
67
68 A number of features need to be compacted into a very small space of
69 only 24 bits:
70
71 * Independent per-register Scalar/Vector tagging and range extension on
72 every register
73 * Element width overrides on both source and destination
74 * Predication on both source and destination
75 * Two different sources of predication: INT and CR Fields
76 * SV Modes including saturation (for Audio, Video and DSP), mapreduce,
77 fail-first and predicate-result mode.
78
79 Different classes of operations require different formats. The earlier
80 sections cover the common formats and the four separate modes follow:
81 CR operations (crops), Arithmetic/Logical (termed "normal"), Load/Store
82 and Branch-Conditional.
83
84 ## Definition of Reserved in this spec.
85
86 For the new fields added in SVP64, instructions that have any of their
87 fields set to a reserved value must cause an illegal instruction trap,
88 to allow emulation of future instruction sets, or for subsets of SVP64 to
89 be implemented in hardware and the rest emulated. This includes SVP64
90 SPRs: reading or writing values which are not supported in hardware
91 must also raise illegal instruction traps in order to allow emulation.
92 Unless otherwise stated, reserved values are always all zeros.
93
94 This is unlike OpenPower ISA v3.1, which in many instances does not
95 require a trap if reserved fields are nonzero. Where the standard Power
96 ISA definition is intended the red keyword `RESERVED` is used.
97
98 ## Definition of "UnVectoriseable"
99
100 Any operation that inherently makes no sense if repeated is termed
101 "UnVectoriseable" or "UnVectorised". Examples include `sc` or `sync`
102 which have no registers. `mtmsr` is also classed as UnVectoriseable
103 because there is only one `MSR`.
104
105 ## Register files, elements, and Element-width Overrides
106
107 In the Upper Compliancy Levels of SVP64 the size of the GPR and FPR
108 Register files are expanded from 32 to 128 entries, and the number of
109 CR Fields expanded from CR0-CR7 to CR0-CR127. (Note: A future version
110 of SVP64 is anticipated to extend the VSR register file).
111
112 Memory access remains exactly the same: the effects of `MSR.LE` remain
113 exactly the same, affecting as they already do and remain **only**
114 on the Load and Store memory-register operation byte-order, and having
115 nothing to do with the ordering of the contents of register files or
116 register-register operations.
117
118 To be absolutely clear:
119
120 ```
121 There are no conceptual arithmetic ordering or other changes over the
122 Scalar Power ISA definitions to registers or register files or to
123 arithmetic or Logical Operations beyond element-width subdivision
124 ```
125
126 Element offset
127 numbering is naturally **LSB0-sequentially-incrementing from zero, not
128 MSB0-incrementing** including when element-width overrides are used,
129 at which point the elements progress through each register
130 sequentially from the LSB end
131 (confusingly numbered the highest in MSB0 ordering) and progress
132 incrementally to the MSB end (confusingly numbered the lowest in
133 MSB0 ordering).
134
135 When exclusively using MSB0-numbering, SVP64
136 becomes unnecessarily complex to both express and subsequently understand:
137 the required conditional subtractions from 63,
138 31, 15 and 7 needed to express the fact that elements are LSB0-sequential
139 unfortunately become a hostile minefield, obscuring both
140 intent and meaning. Therefore for the
141 purposes of this section the more natural **LSB0 numbering is assumed**
142 and it is left to the reader to translate to MSB0 numbering.
143
144 The Canonical specification for how element-sequential numbering and
145 element-width overrides is defined is expressed in the following c
146 structure, assuming a Little-Endian system, and naturally using LSB0
147 numbering everywhere because the ANSI c specification is inherently LSB0.
148 Note the deliberate similarity to how VSX register elements are defined:
149
150 ```
151 #pragma pack
152 typedef union {
153 uint8_t bytes[]; // elwidth 8
154 uint16_t hwords[]; // elwidth 16
155 uint32_t words[]; // elwidth 32
156 uint64_t dwords[]; // elwidth 64
157 uint8_t actual_bytes[8];
158 } el_reg_t;
159
160 elreg_t int_regfile[128];
161
162 void get_register_element(el_reg_t* el, int gpr, int element, int width) {
163 switch (width) {
164 case 64: el->dwords[0] = int_regfile[gpr].dwords[element];
165 case 32: el->words[0] = int_regfile[gpr].words[element];
166 case 16: el->hwords[0] = int_regfile[gpr].hwords[element];
167 case 8 : el->bytes[0] = int_regfile[gpr].bytes[element];
168 }
169 }
170 void set_register_element(el_reg_t* el, int gpr, int element, int width) {
171 switch (width) {
172 case 64: int_regfile[gpr].dwords[element] = el->dwords[0];
173 case 32: int_regfile[gpr].words[element] = el->words[0];
174 case 16: int_regfile[gpr].hwords[element] = el->hwords[0];
175 case 8 : int_regfile[gpr].bytes[element] = el->bytes[0];
176 }
177 }
178 ```
179
180 Example Vector-looped add operation implementation when elwidths are 64-bit:
181
182 ```
183 # vector-add RT, RA,RB using the "uint64_t" union member, "dwords"
184 for i in range(VL):
185 int_regfile[RT].dword[i] = int_regfile[RA].dword[i] + int_regfile[RB].dword[i]
186 ```
187
188 However if elwidth overrides are set to 16 for both source and destination:
189
190 ```
191 # vector-add RT, RA, RB using the "uint64_t" union member "halfs"
192 for i in range(VL):
193 int_regfile[RT].halfs[i] = int_regfile[RA].halfs[i] + int_regfile[RB].halfs[i]
194 ```
195
196 Hardware Architectural note: to avoid a Read-Modify-Write at the register
197 file it is strongly recommended to implement byte-level write-enable lines
198 exactly as has been implemented in DRAM ICs for many decades. Additionally
199 the predicate mask bit is advised to be associated with the element
200 operation and alongside the result ultimately passed to the register file.
201 When element-width is set to 64-bit the relevant predicate mask bit
202 may be repeated eight times and pull all eight write-port byte-level
203 lines HIGH. Clearly when element-width is set to 8-bit the relevant
204 predicate mask bit corresponds directly with one single byte-level
205 write-enable line. It is up to the Hardware Architect to then amortise
206 (merge) elements together into both PredicatedSIMD Pipelines as well
207 as simultaneous non-overlapping Register File writes, to achieve High
208 Performance designs.
209
210 **Comparative equivalent using VSR registers**
211
212 For a comparative data point the VSR Registers may be expressed in the
213 same fashion. The c code below is directly an expression of Figure 97 in
214 Power ISA Public v3.1 Book I Section 6.3 page 258, *after compensating for
215 MSB0 numbering in both bits and elements, adapting in full to LSB0 numbering,
216 and obeying LE ordering*.
217
218 **Crucial to understanding why the subtraction from 1,3,7,15 is present
219 is because VSX Registers number elements also in MSB0 order**. SVP64
220 very specifically numbers elements in **LSB0** order with the first
221 element being at the **LSB** end of the register, where VSX places
222 the numerically-lowest element at the **MSB** end of the register.
223
224 ```
225 #pragma pack
226 typedef union {
227 uint8_t bytes[16]; // elwidth 8, QTY 16 FIXED total
228 uint16_t hwords[8]; // elwidth 16, QTY 8 FIXED total
229 uint32_t words[4]; // elwidth 32, QTY 8 FIXED total
230 uint64_t dwords[2]; // elwidth 64, QTY 2 FIXED total
231 uint8_t actual_bytes[16]; // totals 128-bit
232 } el_reg_t;
233
234 elreg_t VSR_regfile[64];
235
236 static void check_num_elements(int elt, int width) {
237 switch (width) {
238 case 64: assert elt < 2;
239 case 32: assert elt < 4;
240 case 16: assert elt < 8;
241 case 8 : assert elt < 16;
242 }
243 }
244 void get_VSR_element(el_reg_t* el, int gpr, int elt, int width) {
245 check_num_elements(elt, width);
246 switch (width) {
247 case 64: el->dwords[0] = VSR_regfile[gpr].dwords[1-elt];
248 case 32: el->words[0] = VSR_regfile[gpr].words[3-elt];
249 case 16: el->hwords[0] = VSR_regfile[gpr].hwords[7-elt];
250 case 8 : el->bytes[0] = VSR_regfile[gpr].bytes[15-elt];
251 }
252 }
253 void set_VSR_element(el_reg_t* el, int gpr, int elt, int width) {
254 check_num_elements(elt, width);
255 switch (width) {
256 case 64: VSR_regfile[gpr].dwords[1-elt] = el->dwords[0];
257 case 32: VSR_regfile[gpr].words[3-elt] = el->words[0];
258 case 16: VSR_regfile[gpr].hwords[7-elt] = el->hwords[0];
259 case 8 : VSR_regfile[gpr].bytes[15-elt] = el->bytes[0];
260 }
261 }
262 ```
263
264 For VSR Registers one key difference is that the overlay of different element
265 widths is clearly a *bounded static quantity*, whereas for Simple-V the
266 elements are
267 unrestrained and permitted to flow into *successive underlying Scalar registers*.
268 This difference is absolutely critical to a full understanding of the entire
269 Simple-V paradigm and why element-ordering, bit-numbering *and register numbering*
270 are all so strictly defined.
271
272 Implementations are not permitted to violate the Canonical definition. Software
273 will be critically relying on the wrapped (overflow) behaviour inherently
274 implied by the unbounded variable-length c arrays.
275
276 Illustrating the exact same loop with the exact same effect as achieved by Simple-V
277 we are first forced to create wrapper functions, to cater for the fact
278 that VSR register elements are static bounded:
279
280 ```
281 int calc_VSR_reg_offs(int elt, int width) {
282 switch (width) {
283 case 64: return floor(elt / 2);
284 case 32: return floor(elt / 4);
285 case 16: return floor(elt / 8);
286 case 8 : return floor(elt / 16);
287 }
288 }
289 int calc_VSR_elt_offs(int elt, int width) {
290 switch (width) {
291 case 64: return (elt % 2);
292 case 32: return (elt % 4);
293 case 16: return (elt % 8);
294 case 8 : return (elt % 16);
295 }
296 }
297 void _set_VSR_element(el_reg_t* el, int gpr, int elt, int width) {
298 int new_elt = calc_VSR_elt_offs(elt, width);
299 int new_reg = calc_VSR_reg_offs(elt, width);
300 set_VSR_element(el, gpr+new_reg, new_elt, width);
301 }
302 ```
303
304 And finally use these functions:
305
306 ```
307 # VSX-add RT, RA, RB using the "uint64_t" union member "halfs"
308 for i in range(VL):
309 el_reg_t result, ra, rb;
310 _get_VSR_element(&ra, RA, i, 16);
311 _get_VSR_element(&rb, RB, i, 16);
312 result.halfs[0] = ra.halfs[0] + rb.halfs[0]; // use array 0 elements
313 _set_VSR_element(&result, RT, i, 16);
314
315 ```
316
317 ## Scalar Identity Behaviour
318
319 SVP64 is designed so that when the prefix is all zeros, and VL=1, no
320 effect or influence occurs (no augmentation) such that all standard Power
321 ISA v3.0/v3.1 instructions covered by the prefix are "unaltered". This
322 is termed `scalar identity behaviour` (based on the mathematical
323 definition for "identity", as in, "identity matrix" or better "identity
324 transformation").
325
326 Note that this is completely different from when VL=0. VL=0 turns all
327 operations under its influence into `nops` (regardless of the prefix)
328 whereas when VL=1 and the SV prefix is all zeros, the operation simply
329 acts as if SV had not been applied at all to the instruction (an
330 "identity transformation").
331
332 The fact that `VL` is dynamic and can be set to any value at runtime based
333 on program conditions and behaviour means very specifically that
334 `scalar identity behaviour` is **not** a redundant encoding. If the
335 only means by which VL could be set was by way of static-compiled
336 immediates then this assertion would be false. VL should not
337 be confused with MAXVL when understanding this key aspect of SimpleV.
338
339 ## Register Naming and size
340
341 As indicated above SV Registers are simply the GPR, FPR and CR
342 register files extended linearly to larger sizes; SV Vectorisation
343 iterates sequentially through these registers (LSB0 sequential ordering
344 from 0 to VL-1).
345
346 Where the integer regfile in standard scalar Power ISA v3.0B/v3.1B is
347 r0 to r31, SV extends this as r0 to r127. Likewise FP registers are
348 extended to 128 (fp0 to fp127), and CR Fields are extended to 128 entries,
349 CR0 thru CR127.
350
351 The names of the registers therefore reflects a simple linear extension
352 of the Power ISA v3.0B / v3.1B register naming, and in hardware this
353 would be reflected by a linear increase in the size of the underlying
354 SRAM used for the regfiles.
355
356 Note: when an EXTRA field (defined below) is zero, SV is deliberately
357 designed so that the register fields are identical to as if SV was not in
358 effect i.e. under these circumstances (EXTRA=0) the register field names
359 RA, RB etc. are interpreted and treated as v3.0B / v3.1B scalar registers.
360 This is part of `scalar identity behaviour` described above.
361
362 **Condition Register(s)**
363
364 The Scalar Power ISA Condition Register is a 64 bit register where the top
365 32 MSBs (numbered 0:31 in MSB0 numbering) are not used. This convention is
366 *preserved*
367 in SVP64 and an additional 15 Condition Registers provided in
368 order to store the new CR Fields, CR8-CR15, CR16-CR23 etc. sequentially.
369 The top 32 MSBs in each new SVP64 Condition Register are *also* not used:
370 only the bottom 32 bits (numbered 32:63 in MSB0 numbering).
371
372 *Programmer's note: using `sv.mfcr` without element-width overrides
373 to take into account the fact that the top 32 MSBs are zero and thus
374 effectively doubling the number of GPR registers required to hold all 128
375 CR Fields would seem the only option because normally elwidth overrides
376 would halve the capacity of the instruction. However in this case it
377 is possible to use destination element-width overrides (for `sv.mfcr`.
378 source overrides would be used on the GPR of `sv.mtocrf`), whereupon
379 truncation of the 64-bit Condition Register(s) occurs, throwing away
380 the zeros and storing the remaining (valid, desired) 32-bit values
381 sequentially into (LSB0-convention) lower-numbered and upper-numbered
382 halves of GPRs respectively. The programmer is expected to be aware
383 however that the full width of the entire 64-bit Condition Register
384 is considered to be "an element". This is **not** like any other
385 Condition-Register instructions because all other CR instructions,
386 on closer investigation, will be observed to all be CR-bit or CR-Field
387 related. Thus a `VL` of 16 must be used*
388
389 ## Future expansion.
390
391 With the way that EXTRA fields are defined and applied to register fields,
392 future versions of SV may involve 256 or greater registers. Backwards
393 binary compatibility may be achieved with a PCR bit (Program Compatibility
394 Register) or an MSR bit analogous to SF.
395 Further discussion is out of scope for this version of SVP64.
396
397 Additionally, a future variant of SVP64 will be applied to the Scalar
398 (Quad-precision and 128-bit) VSX instructions. Element-width overrides
399 are an opportunity to expand a future version of the Power ISA
400 to 256-bit, 512-bit and
401 1024-bit operations, as well as doubling or quadrupling the number
402 of VSX registers to 128 or 256. Again further discussion is out of
403 scope for this version of SVP64.
404
405 --------
406
407 \newpage{}
408
409 # New 64-bit Instruction Encoding spaces
410
411 The following seven new areas are defined within Primary Opcode 9 (EXT009)
412 as a new 64-bit encoding space, alongside Primary Opcode 1
413 (EXT1xx).
414
415 | 0-5 | 6 | 7 | 8-31 | 32| Description |
416 |-----|---|---|-------|---|------------------------------------|
417 | PO | 0 | x | xxxx | 0 | `RESERVED2` (57-bit) |
418 | PO | 0 | 0 | !zero | 1 | SVP64Single:EXT232-263, or `RESERVED3` |
419 | PO | 0 | 0 | 0000 | 1 | Scalar EXT232-263 |
420 | PO | 0 | 1 | nnnn | 1 | SVP64:EXT232-263 |
421 | PO | 1 | 0 | 0000 | x | `RESERVED1` (32-bit) |
422 | PO | 1 | 0 | !zero | n | SVP64Single:EXT000-063 or `RESERVED4` |
423 | PO | 1 | 1 | nnnn | n | SVP64:EXT000-063 |
424
425 Note that for the future SVP64Single Encoding (currently RESERVED3 and 4)
426 it is prohibited to have bits 8-31 be zero, unlike for SVP64 Vector space,
427 for which bits 8-31 can be zero (termed `scalar identity behaviour`). This
428 prohibition allows SVP64Single to share its Encoding space with Scalar
429 Ext232-263 and Scalar EXT300-363.
430
431 Also that RESERVED1 and 2 are candidates for future Major opcode
432 areas EXT200-231 and EXT300-363 respectively, however as RESERVED areas
433 they may equally be allocated entirely differently.
434
435 *Architectural Resource Allocation Note: **under no circumstances** must
436 different Defined Words be allocated within any `EXT{z}` prefixed
437 or unprefixed space for a given value of `z`. Even if UnVectoriseable
438 an instruction Defined Word space must have the exact same Instruction
439 and exact same Instruction Encoding in all spaces (including
440 being RESERVED if UnVectoriseable) or not be allocated at all.
441 This is required as an inviolate hard rule governing Primary Opcode 9
442 that may not be revoked under any circumstances. A useful way to think
443 of this is that the Prefix Encoding is, like the 8086 REP instruction,
444 an independent 32-bit Defined Word. The only semi-exceptions are
445 the Post-Increment Mode of LD/ST-Update and Vectorised Branch-Conditional.*
446
447 Encoding spaces and their potential are illustrated:
448
449 | Encoding | Available bits | Scalar | Vectoriseable | SVP64Single |
450 |----------|----------------|--------|---------------|--------------|
451 |EXT000-063| 32 | yes | yes |yes |
452 |EXT100-163| 64 | yes | no |no |
453 |R3SERVED2 | 57 | N/A |not applicable |not applicable|
454 |EXT232-263| 32 | yes | yes |yes |
455 |RESERVED1 | 32 | N/A | no |no |
456
457 Notes:
458
459 * Prefixed-Prefixed (96-bit) instructions are prohibited. EXT1xx is
460 thus inherently UnVectoriseable as the EXT1xx prefix is 32-bit
461 on top of an SVP64 prefix which is 32-bit on top of a Defined Word
462 and the complexity at the Decoder becomes too great for High
463 Performance Multi-Issue systems.
464 * RESERVED2 presently remains unallocated as of yet and therefore its
465 potential is not yet defined (Not Applicable).
466 * RESERVED1 is also unallocated at present, but it is known in advance
467 that the area is UnVectoriseable and also cannot be Prefixed with
468 SVP64Single.
469 * Considerable care is needed both on Architectural Resource Allocation
470 as well as instruction design itself. Once an instruction is allocated
471 in an UnVectoriseable area it can never be Vectorised without providing
472 an entirely new Encoding.
473
474 # Remapped Encoding (`RM[0:23]`)
475
476 In the SVP64 Vector Prefix spaces, the 24 bits 8-31 are termed `RM`. Bits
477 32-37 are the Primary Opcode of the Suffix "Defined Word". 38-63 are the
478 remainder of the Defined Word. Note that the new EXT232-263 SVP64 area
479 it is obviously mandatory that bit 32 is required to be set to 1.
480
481 | 0-5 | 6 | 7 | 8-31 | 32-37 | 38-64 |Description |
482 |-----|---|---|----------|--------|----------|-----------------------|
483 | PO | 0 | 1 | RM[0:23] | 1nnnnn | xxxxxxxx | SVP64:EXT232-263 |
484 | PO | 1 | 1 | RM[0:23] | nnnnnn | xxxxxxxx | SVP64:EXT000-063 |
485
486 It is important to note that unlike EXT1xx 64-bit prefixed instructions
487 there is insufficient space in `RM` to provide identification of
488 any SVP64 Fields without first partially decoding the 32-bit suffix.
489 Similar to the "Forms" (X-Form, D-Form) the `RM` format is individually
490 associated with every instruction. However this still does not adversely
491 affect Multi-Issue Decoding because the identification of the *length*
492 of anything in the 64-bit space has been kept brutally simple (EXT009),
493 and further decoding of any number of 64-bit Encodings in parallel at
494 that point is fully independent.
495
496 Extreme caution and care must be taken when extending SVP64
497 in future, to not create unnecessary relationships between prefix and
498 suffix that could complicate decoding, adding latency.
499
500 ## Common RM fields
501
502 The following fields are common to all Remapped Encodings:
503
504 | Field Name | Field bits | Description |
505 |------------|------------|----------------------------------------|
506 | MASKMODE | `0` | Execution (predication) Mask Kind |
507 | MASK | `1:3` | Execution Mask |
508 | SUBVL | `8:9` | Sub-vector length |
509
510 The following fields are optional or encoded differently depending
511 on context after decoding of the Scalar suffix:
512
513 | Field Name | Field bits | Description |
514 |------------|------------|----------------------------------------|
515 | ELWIDTH | `4:5` | Element Width |
516 | ELWIDTH_SRC | `6:7` | Element Width for Source |
517 | EXTRA | `10:18` | Register Extra encoding |
518 | MODE | `19:23` | changes Vector behaviour |
519
520 * MODE changes the behaviour of the SV operation (result saturation,
521 mapreduce)
522 * SUBVL groups elements together into vec2, vec3, vec4 for use in 3D
523 and Audio/Video DSP work
524 * ELWIDTH and ELWIDTH_SRC overrides the instruction's destination and
525 source operand width
526 * MASK (and MASK_SRC) and MASKMODE provide predication (two types of
527 sources: scalar INT and Vector CR).
528 * Bits 10 to 18 (EXTRA) are further decoded depending on the RM category
529 for the instruction, which is determined only by decoding the Scalar 32
530 bit suffix.
531
532 Similar to Power ISA `X-Form` etc. EXTRA bits are given designations,
533 such as `RM-1P-3S1D` which indicates for this example that the operation
534 is to be single-predicated and that there are 3 source operand EXTRA
535 tags and one destination operand tag.
536
537 Note that if ELWIDTH != ELWIDTH_SRC this may result in reduced performance
538 or increased latency in some implementations due to lane-crossing.
539
540 ## Mode
541
542 Mode is an augmentation of SV behaviour. Different types of instructions
543 have different needs, similar to Power ISA v3.1 64 bit prefix 8LS and MTRR
544 formats apply to different instruction types. Modes include Reduction,
545 Iteration, arithmetic saturation, and Fail-First. More specific details
546 in each section and in the SVP64 appendix
547
548 * For condition register operations see [[sv/cr_ops]]
549 * For LD/ST Modes, see [[sv/ldst]].
550 * For Branch modes, see [[sv/branches]]
551 * For arithmetic and logical, see [[sv/normal]]
552
553 ## ELWIDTH Encoding
554
555 Default behaviour is set to 0b00 so that zeros follow the convention
556 of `scalar identity behaviour`. In this case it means that elwidth
557 overrides are not applicable. Thus if a 32 bit instruction operates
558 on 32 bit, `elwidth=0b00` specifies that this behaviour is unmodified.
559 Likewise when a processor is switched from 64 bit to 32 bit mode,
560 `elwidth=0b00` states that, again, the behaviour is not to be modified.
561
562 Only when elwidth is nonzero is the element width overridden to the
563 explicitly required value.
564
565 ### Elwidth for Integers:
566
567 | Value | Mnemonic | Description |
568 |-------|----------------|------------------------------------|
569 | 00 | DEFAULT | default behaviour for operation |
570 | 01 | `ELWIDTH=w` | Word: 32-bit integer |
571 | 10 | `ELWIDTH=h` | Halfword: 16-bit integer |
572 | 11 | `ELWIDTH=b` | Byte: 8-bit integer |
573
574 This encoding is chosen such that the byte width may be computed as
575 `8<<(3-ew)`
576
577 ### Elwidth for FP Registers:
578
579 | Value | Mnemonic | Description |
580 |-------|----------------|------------------------------------|
581 | 00 | DEFAULT | default behaviour for FP operation |
582 | 01 | `ELWIDTH=f32` | 32-bit IEEE 754 Single floating-point |
583 | 10 | `ELWIDTH=f16` | 16-bit IEEE 754 Half floating-point |
584 | 11 | `ELWIDTH=bf16` | Reserved for `bf16` |
585
586 Note:
587 [`bf16`](https://en.wikipedia.org/wiki/Bfloat16_floating-point_format)
588 is reserved for a future implementation of SV
589
590 Note that any IEEE754 FP operation in Power ISA ending in "s" (`fadds`)
591 shall perform its operation at **half** the ELWIDTH then padded back out
592 to ELWIDTH. `sv.fadds/ew=f32` shall perform an IEEE754 FP16 operation
593 that is then "padded" to fill out to an IEEE754 FP32. When ELWIDTH=DEFAULT
594 clearly the behaviour of `sv.fadds` is performed at 32-bit accuracy
595 then padded back out to fit in IEEE754 FP64, exactly as for Scalar
596 v3.0B "single" FP. Any FP operation ending in "s" where ELWIDTH=f16 or
597 ELWIDTH=bf16 is reserved and must raise an illegal instruction (IEEE754
598 FP8 or BF8 are not defined).
599
600 ### Elwidth for CRs (no meaning)
601
602 Element-width overrides for CR Fields has no meaning. The bits
603 are therefore used for other purposes, or when Rc=1, the Elwidth
604 applies to the result being tested (a GPR or FPR), but not to the
605 Vector of CR Fields.
606
607 ## SUBVL Encoding
608
609 The default for SUBVL is 1 and its encoding is 0b00 to indicate that
610 SUBVL is effectively disabled (a SUBVL for-loop of only one element). this
611 lines up in combination with all other "default is all zeros" behaviour.
612
613 | Value | Mnemonic | Subvec | Description |
614 |-------|-----------|---------|------------------------|
615 | 00 | `SUBVL=1` | single | Sub-vector length of 1 |
616 | 01 | `SUBVL=2` | vec2 | Sub-vector length of 2 |
617 | 10 | `SUBVL=3` | vec3 | Sub-vector length of 3 |
618 | 11 | `SUBVL=4` | vec4 | Sub-vector length of 4 |
619
620 The SUBVL encoding value may be thought of as an inclusive range of a
621 sub-vector. SUBVL=2 represents a vec2, its encoding is 0b01, therefore
622 this may be considered to be elements 0b00 to 0b01 inclusive.
623
624 ## MASK/MASK_SRC & MASKMODE Encoding
625
626 One bit (`MASKMODE`) indicates the mode: CR or Int predication. The two
627 types may not be mixed.
628
629 Special note: to disable predication this field must be set to zero in
630 combination with Integer Predication also being set to 0b000. this has the
631 effect of enabling "all 1s" in the predicate mask, which is equivalent to
632 "not having any predication at all".
633
634 `MASKMODE` may be set to one of 2 values:
635
636 | Value | Description |
637 |-----------|------------------------------------------------------|
638 | 0 | MASK/MASK_SRC are encoded using Integer Predication |
639 | 1 | MASK/MASK_SRC are encoded using CR-based Predication |
640
641 Integer Twin predication has a second set of 3 bits that uses the same
642 encoding thus allowing either the same register (r3, r10 or r31) to be
643 used for both src and dest, or different regs (one for src, one for dest).
644
645 Likewise CR based twin predication has a second set of 3 bits, allowing
646 a different test to be applied.
647
648 Note that it is assumed that Predicate Masks (whether INT or CR) are
649 read *before* the operations proceed. In practice (for CR Fields)
650 this creates an unnecessary block on parallelism. Therefore, it is up
651 to the programmer to ensure that the CR fields used as Predicate Masks
652 are not being written to by any parallel Vector Loop. Doing so results
653 in **UNDEFINED** behaviour, according to the definition outlined in the
654 Power ISA v3.0B Specification.
655
656 Hardware Implementations are therefore free and clear to delay reading
657 of individual CR fields until the actual predicated element operation
658 needs to take place, safe in the knowledge that no programmer will have
659 issued a Vector Instruction where previous elements could have overwritten
660 (destroyed) not-yet-executed CR-Predicated element operations.
661
662 ### Integer Predication (MASKMODE=0)
663
664 When the predicate mode bit is zero the 3 bits are interpreted as below.
665 Twin predication has an identical 3 bit field similarly encoded.
666
667 `MASK` and `MASK_SRC` may be set to one of 8 values, to provide the
668 following meaning:
669
670 | Value | Mnemonic | Element `i` enabled if: |
671 |-------|----------|------------------------------|
672 | 000 | ALWAYS | predicate effectively all 1s |
673 | 001 | 1 << R3 | `i == R3` |
674 | 010 | R3 | `R3 & (1 << i)` is non-zero |
675 | 011 | ~R3 | `R3 & (1 << i)` is zero |
676 | 100 | R10 | `R10 & (1 << i)` is non-zero |
677 | 101 | ~R10 | `R10 & (1 << i)` is zero |
678 | 110 | R30 | `R30 & (1 << i)` is non-zero |
679 | 111 | ~R30 | `R30 & (1 << i)` is zero |
680
681 r10 and r30 are at the high end of temporary and unused registers,
682 so as not to interfere with register allocation from ABIs.
683
684 ### CR-based Predication (MASKMODE=1)
685
686 When the predicate mode bit is one the 3 bits are interpreted as below.
687 Twin predication has an identical 3 bit field similarly encoded.
688
689 `MASK` and `MASK_SRC` may be set to one of 8 values, to provide the
690 following meaning:
691
692 | Value | Mnemonic | Element `i` is enabled if |
693 |-------|----------|--------------------------|
694 | 000 | lt | `CR[offs+i].LT` is set |
695 | 001 | nl/ge | `CR[offs+i].LT` is clear |
696 | 010 | gt | `CR[offs+i].GT` is set |
697 | 011 | ng/le | `CR[offs+i].GT` is clear |
698 | 100 | eq | `CR[offs+i].EQ` is set |
699 | 101 | ne | `CR[offs+i].EQ` is clear |
700 | 110 | so/un | `CR[offs+i].FU` is set |
701 | 111 | ns/nu | `CR[offs+i].FU` is clear |
702
703 `offs` is defined as CR32 (4x8) so as to mesh cleanly with Vectorised
704 Rc=1 operations (see below). Rc=1 operations start from CR8 (TBD).
705
706 The CR Predicates chosen must start on a boundary that Vectorised CR
707 operations can access cleanly, in full. With EXTRA2 restricting starting
708 points to multiples of 8 (CR0, CR8, CR16...) both Vectorised Rc=1 and
709 CR Predicate Masks have to be adapted to fit on these boundaries as well.
710
711 ## Extra Remapped Encoding <a name="extra_remap"> </a>
712
713 Shows all instruction-specific fields in the Remapped Encoding
714 `RM[10:18]` for all instruction variants. Note that due to the very
715 tight space, the encoding mode is *not* included in the prefix itself.
716 The mode is "applied", similar to Power ISA "Forms" (X-Form, D-Form)
717 on a per-instruction basis, and, like "Forms" are given a designation
718 (below) of the form `RM-nP-nSnD`. The full list of which instructions
719 use which remaps is here [[opcode_regs_deduped]].
720
721 **Please note the following**:
722
723 ```
724 Machine-readable CSV files have been autogenerated which will make the
725 task of creating SV-aware ISA decoders, documentation, assembler tools
726 compiler tools Simulators documentation all aspects of SVP64 easier
727 and less prone to mistakes. Please avoid manual re-creation of
728 information from the written specification wording in this chapter,
729 and use the CSV files or use the Canonical tool which creates the CSV
730 files, named sv_analysis.py. The information contained within
731 sv_analysis.py is considered to be part of this Specification, even
732 encoded as it is in python3.
733 ```
734
735 The mappings are part of the SVP64 Specification in exactly the same
736 way as X-Form, D-Form. New Scalar instructions added to the Power ISA
737 will need a corresponding SVP64 Mapping, which can be derived by-rote
738 from examining the Register "Profile" of the instruction.
739
740 There are two categories: Single and Twin Predication. Due to space
741 considerations further subdivision of Single Predication is based on
742 whether the number of src operands is 2 or 3. With only 9 bits available
743 some compromises have to be made.
744
745 * `RM-1P-3S1D` Single Predication dest/src1/2/3, applies to 4-operand
746 instructions (fmadd, isel, madd).
747 * `RM-1P-2S1D` Single Predication dest/src1/2 applies to 3-operand
748 instructions (src1 src2 dest)
749 * `RM-2P-1S1D` Twin Predication (src=1, dest=1)
750 * `RM-2P-2S1D` Twin Predication (src=2, dest=1) primarily for LDST (Indexed)
751 * `RM-2P-1S2D` Twin Predication (src=1, dest=2) primarily for LDST Update
752
753 ### RM-1P-3S1D
754
755 | Field Name | Field bits | Description |
756 |------------|------------|----------------------------------------|
757 | Rdest\_EXTRA2 | `10:11` | extends Rdest (R\*\_EXTRA2 Encoding) |
758 | Rsrc1\_EXTRA2 | `12:13` | extends Rsrc1 (R\*\_EXTRA2 Encoding) |
759 | Rsrc2\_EXTRA2 | `14:15` | extends Rsrc2 (R\*\_EXTRA2 Encoding) |
760 | Rsrc3\_EXTRA2 | `16:17` | extends Rsrc3 (R\*\_EXTRA2 Encoding) |
761 | EXTRA2_MODE | `18` | used by `divmod2du` and `maddedu` for RS |
762
763 These are for 3 operand in and either 1 or 2 out instructions.
764 3-in 1-out includes `madd RT,RA,RB,RC`. (DRAFT) instructions
765 such as `maddedu` have an implicit second destination, RS, the
766 selection of which is determined by bit 18.
767
768 ### RM-1P-2S1D
769
770 | Field Name | Field bits | Description |
771 |------------|------------|-------------------------------------------|
772 | Rdest\_EXTRA3 | `10:12` | extends Rdest |
773 | Rsrc1\_EXTRA3 | `13:15` | extends Rsrc1 |
774 | Rsrc2\_EXTRA3 | `16:18` | extends Rsrc3 |
775
776 These are for 2 operand 1 dest instructions, such as `add RT, RA,
777 RB`. However also included are unusual instructions with an implicit
778 dest that is identical to its src reg, such as `rlwinmi`.
779
780 Normally, with instructions such as `rlwinmi`, the scalar v3.0B ISA would
781 not have sufficient bit fields to allow an alternative destination.
782 With SV however this becomes possible. Therefore, the fact that the
783 dest is implicitly also a src should not mislead: due to the *prefix*
784 they are different SV regs.
785
786 * `rlwimi RA, RS, ...`
787 * Rsrc1_EXTRA3 applies to RS as the first src
788 * Rsrc2_EXTRA3 applies to RA as the secomd src
789 * Rdest_EXTRA3 applies to RA to create an **independent** dest.
790
791 With the addition of the EXTRA bits, the three registers
792 each may be *independently* made vector or scalar, and be independently
793 augmented to 7 bits in length.
794
795 ### RM-2P-1S1D/2S
796
797 | Field Name | Field bits | Description |
798 |------------|------------|----------------------------|
799 | Rdest_EXTRA3 | `10:12` | extends Rdest |
800 | Rsrc1_EXTRA3 | `13:15` | extends Rsrc1 |
801 | MASK_SRC | `16:18` | Execution Mask for Source |
802
803 `RM-2P-2S` is for `stw` etc. and is Rsrc1 Rsrc2.
804
805 ### RM-1P-2S1D
806
807 single-predicate, three registers (2 read, 1 write)
808
809 | Field Name | Field bits | Description |
810 |------------|------------|----------------------------|
811 | Rdest_EXTRA3 | `10:12` | extends Rdest |
812 | Rsrc1_EXTRA3 | `13:15` | extends Rsrc1 |
813 | Rsrc2_EXTRA3 | `16:18` | extends Rsrc2 |
814
815 ### RM-2P-2S1D/1S2D/3S
816
817 The primary purpose for this encoding is for Twin Predication on LOAD
818 and STORE operations. see [[sv/ldst]] for detailed anslysis.
819
820 **RM-2P-2S1D:**
821
822 | Field Name | Field bits | Description |
823 |------------|------------|----------------------------|
824 | Rdest_EXTRA2 | `10:11` | extends Rdest (R\*\_EXTRA2 Encoding) |
825 | Rsrc1_EXTRA2 | `12:13` | extends Rsrc1 (R\*\_EXTRA2 Encoding) |
826 | Rsrc2_EXTRA2 | `14:15` | extends Rsrc2 (R\*\_EXTRA2 Encoding) |
827 | MASK_SRC | `16:18` | Execution Mask for Source |
828
829 **RM-2P-1S2D:**
830
831 For RM-2P-1S2D the EXTRA2 dest and src names are switched (Rsrc_EXTRA2
832 is in bits 10:11, Rdest1_EXTRA2 in 12:13)
833
834 | Field Name | Field bits | Description |
835 |------------|------------|----------------------------|
836 | Rsrc2_EXTRA2 | `10:11` | extends Rsrc2 (R\*\_EXTRA2 Encoding) |
837 | Rsrc1_EXTRA2 | `12:13` | extends Rsrc1 (R\*\_EXTRA2 Encoding) |
838 | Rdest_EXTRA2 | `14:15` | extends Rdest (R\*\_EXTRA2 Encoding) |
839 | MASK_SRC | `16:18` | Execution Mask for Source |
840
841 **RM-2P-3S:**
842
843 Also that for RM-2P-3S (to cover `stdx` etc.) the names are switched to 3 src:
844 Rsrc1_EXTRA2, Rsrc2_EXTRA2, Rsrc3_EXTRA2.
845
846 | Field Name | Field bits | Description |
847 |------------|------------|----------------------------|
848 | Rsrc1_EXTRA2 | `10:11` | extends Rsrc1 (R\*\_EXTRA2 Encoding) |
849 | Rsrc2_EXTRA2 | `12:13` | extends Rsrc2 (R\*\_EXTRA2 Encoding) |
850 | Rsrc3_EXTRA2 | `14:15` | extends Rsrc3 (R\*\_EXTRA2 Encoding) |
851 | MASK_SRC | `16:18` | Execution Mask for Source |
852
853 Note also that LD with update indexed, which takes 2 src and
854 creates 2 dest registers (e.g. `lhaux RT,RA,RB`), does not have room
855 for 4 registers and also Twin Predication. Therefore these are treated as
856 RM-2P-2S1D and the src spec for RA is also used for the same RA as a dest.
857
858 Note that if ELWIDTH != ELWIDTH_SRC this may result in reduced performance
859 or increased latency in some implementations due to lane-crossing.
860
861 ## R\*\_EXTRA2/3
862
863 EXTRA is the means by which two things are achieved:
864
865 1. Registers are marked as either Vector *or Scalar*
866 2. Register field numbers (limited typically to 5 bit)
867 are extended in range, both for Scalar and Vector.
868
869 The register files are therefore extended:
870
871 * INT (GPR) is extended from r0-31 to r0-127
872 * FP (FPR) is extended from fp0-32 to fp0-fp127
873 * CR Fields are extended from CR0-7 to CR0-127
874
875 However due to pressure in `RM.EXTRA` not all these registers
876 are accessible by all instructions, particularly those with
877 a large number of operands (`madd`, `isel`).
878
879 In the following tables register numbers are constructed from the
880 standard v3.0B / v3.1B 32 bit register field (RA, FRA) and the EXTRA2 or
881 EXTRA3 field from the SV Prefix, determined by the specific RM-xx-yyyy
882 designation for a given instruction. The prefixing is arranged so that
883 interoperability between prefixing and nonprefixing of scalar registers
884 is direct and convenient (when the EXTRA field is all zeros).
885
886 A pseudocode algorithm explains the relationship, for INT/FP (see
887 SVP64 appendix for CRs)
888
889 ```
890 if extra3_mode:
891 spec = EXTRA3
892 else:
893 spec = EXTRA2 << 1 # same as EXTRA3, shifted
894 if spec[0]: # vector
895 return (RA << 2) | spec[1:2]
896 else: # scalar
897 return (spec[1:2] << 5) | RA
898 ```
899
900 Future versions may extend to 256 by shifting Vector numbering up.
901 Scalar will not be altered.
902
903 Note that in some cases the range of starting points for Vectors
904 is limited.
905
906 ### INT/FP EXTRA3
907
908 If EXTRA3 is zero, maps to "scalar identity" (scalar Power ISA field
909 naming).
910
911 Fields are as follows:
912
913 * Value: R_EXTRA3
914 * Mode: register is tagged as scalar or vector
915 * Range/Inc: the range of registers accessible from this EXTRA
916 encoding, and the "increment" (accessibility). "/4" means
917 that this EXTRA encoding may only give access (starting point)
918 every 4th register.
919 * MSB..LSB: the bit field showing how the register opcode field
920 combines with EXTRA to give (extend) the register number (GPR)
921
922 | Value | Mode | Range/Inc | 6..0 |
923 |-----------|-------|---------------|---------------------|
924 | 000 | Scalar | `r0-r31`/1 | `0b00 RA` |
925 | 001 | Scalar | `r32-r63`/1 | `0b01 RA` |
926 | 010 | Scalar | `r64-r95`/1 | `0b10 RA` |
927 | 011 | Scalar | `r96-r127`/1 | `0b11 RA` |
928 | 100 | Vector | `r0-r124`/4 | `RA 0b00` |
929 | 101 | Vector | `r1-r125`/4 | `RA 0b01` |
930 | 110 | Vector | `r2-r126`/4 | `RA 0b10` |
931 | 111 | Vector | `r3-r127`/4 | `RA 0b11` |
932
933 ### INT/FP EXTRA2
934
935 If EXTRA2 is zero will map to
936 "scalar identity behaviour" i.e Scalar Power ISA register naming:
937
938 | Value | Mode | Range/inc | 6..0 |
939 |----------|-------|---------------|-----------|
940 | 00 | Scalar | `r0-r31`/1 | `0b00 RA` |
941 | 01 | Scalar | `r32-r63`/1 | `0b01 RA` |
942 | 10 | Vector | `r0-r124`/4 | `RA 0b00` |
943 | 11 | Vector | `r2-r126`/4 | `RA 0b10` |
944
945 **Note that unlike in EXTRA3, in EXTRA2**:
946
947 * the GPR Vectors may only start from
948 `r0, r2, r4, r6, r8` and likewise FPR Vectors.
949 * the GPR Scalars may only go from `r0, r1, r2.. r63` and likewise FPR Scalars.
950
951 as there is insufficient bits to cover the full range.
952
953 ### CR Field EXTRA3
954
955 CR Field encoding is essentially the same but made more complex due to CRs
956 being bit-based, because the application of SVP64 element-numbering applies
957 to the CR *Field* numbering not the CR register *bit* numbering.
958 Note that Vectors may only start from `CR0, CR4, CR8, CR12, CR16, CR20`...
959 and Scalars may only go from `CR0, CR1, ... CR31`
960
961 Encoding shown MSB down to LSB
962
963 For a 5-bit operand (BA, BB, BT):
964
965 | Value | Mode | Range/Inc | 8..5 | 4..2 | 1..0 |
966 |-------|------|---------------|-----------| --------|---------|
967 | 000 | Scalar | `CR0-CR7`/1 | 0b0000 | BA[0:2] | BA[3:4] |
968 | 001 | Scalar | `CR8-CR15`/1 | 0b0001 | BA[0:2] | BA[3:4] |
969 | 010 | Scalar | `CR16-CR23`/1 | 0b0010 | BA[0:2] | BA[3:4] |
970 | 011 | Scalar | `CR24-CR31`/1 | 0b0011 | BA[0:2] | BA[3:4] |
971 | 100 | Vector | `CR0-CR112`/16 | BA[0:2] 0 | 0b000 | BA[3:4] |
972 | 101 | Vector | `CR4-CR116`/16 | BA[0:2] 0 | 0b100 | BA[3:4] |
973 | 110 | Vector | `CR8-CR120`/16 | BA[0:2] 1 | 0b000 | BA[3:4] |
974 | 111 | Vector | `CR12-CR124`/16 | BA[0:2] 1 | 0b100 | BA[3:4] |
975
976 For a 3-bit operand (e.g. BFA):
977
978 | Value | Mode | Range/Inc | 6..3 | 2..0 |
979 |-------|------|---------------|-----------| --------|
980 | 000 | Scalar | `CR0-CR7`/1 | 0b0000 | BFA |
981 | 001 | Scalar | `CR8-CR15`/1 | 0b0001 | BFA |
982 | 010 | Scalar | `CR16-CR23`/1 | 0b0010 | BFA |
983 | 011 | Scalar | `CR24-CR31`/1 | 0b0011 | BFA |
984 | 100 | Vector | `CR0-CR112`/16 | BFA 0 | 0b000 |
985 | 101 | Vector | `CR4-CR116`/16 | BFA 0 | 0b100 |
986 | 110 | Vector | `CR8-CR120`/16 | BFA 1 | 0b000 |
987 | 111 | Vector | `CR12-CR124`/16 | BFA 1 | 0b100 |
988
989 ### CR EXTRA2
990
991 CR encoding is essentially the same but made more complex due to CRs
992 being bit-based, because the application of SVP64 element-numbering applies
993 to the CR *Field* numbering not the CR register *bit* numbering.
994 See separate section for explanation and pseudocode.
995 Note that Vectors may only start from CR0, CR8, CR16, CR24, CR32...
996
997 Encoding shown MSB down to LSB
998
999 For a 5-bit operand (BA, BB, BC):
1000
1001 | Value | Mode | Range/Inc | 8..5 | 4..2 | 1..0 |
1002 |-------|--------|----------------|---------|---------|---------|
1003 | 00 | Scalar | `CR0-CR7`/1 | 0b0000 | BA[0:2] | BA[3:4] |
1004 | 01 | Scalar | `CR8-CR15`/1 | 0b0001 | BA[0:2] | BA[3:4] |
1005 | 10 | Vector | `CR0-CR112`/16 | BA[0:2] 0 | 0b000 | BA[3:4] |
1006 | 11 | Vector | `CR8-CR120`/16 | BA[0:2] 1 | 0b000 | BA[3:4] |
1007
1008 For a 3-bit operand (e.g. BFA):
1009
1010 | Value | Mode | Range/Inc | 6..3 | 2..0 |
1011 |-------|------|---------------|-----------| --------|
1012 | 00 | Scalar | `CR0-CR7`/1 | 0b0000 | BFA |
1013 | 01 | Scalar | `CR8-CR15`/1 | 0b0001 | BFA |
1014 | 10 | Vector | `CR0-CR112`/16 | BFA 0 | 0b000 |
1015 | 11 | Vector | `CR8-CR120`/16 | BFA 1 | 0b000 |
1016
1017 --------
1018
1019 \newpage{}
1020
1021
1022 # Normal SVP64 Modes, for Arithmetic and Logical Operations
1023
1024 Normal SVP64 Mode covers Arithmetic and Logical operations
1025 to provide suitable additional behaviour. The Mode
1026 field is bits 19-23 of the [[svp64]] RM Field.
1027
1028 ## Mode
1029
1030 Mode is an augmentation of SV behaviour, providing additional
1031 functionality. Some of these alterations are element-based (saturation),
1032 others involve post-analysis (predicate result) and others are
1033 Vector-based (mapreduce, fail-on-first).
1034
1035 [[sv/ldst]], [[sv/cr_ops]] and [[sv/branches]] are covered separately:
1036 the following Modes apply to Arithmetic and Logical SVP64 operations:
1037
1038 * **simple** mode is straight vectorisation. no augmentations: the
1039 vector comprises an array of independently created results.
1040 * **ffirst** or data-dependent fail-on-first: see separate section.
1041 the vector may be truncated depending on certain criteria.
1042 *VL is altered as a result*.
1043 * **sat mode** or saturation: clamps each element result to a min/max
1044 rather than overflows / wraps. allows signed and unsigned clamping
1045 for both INT and FP.
1046 * **reduce mode**. if used correctly, a mapreduce (or a prefix sum)
1047 is performed. see [[svp64/appendix]].
1048 note that there are comprehensive caveats when using this mode.
1049 * **pred-result** will test the result (CR testing selects a bit of CR
1050 and inverts it, just like branch conditional testing) and if the
1051 test fails it is as if the *destination* predicate bit was zero even
1052 before starting the operation. When Rc=1 the CR element however is
1053 still stored in the CR regfile, even if the test failed. See appendix
1054 for details.
1055
1056 Note that ffirst and reduce modes are not anticipated to be
1057 high-performance in some implementations. ffirst due to interactions
1058 with VL, and reduce due to it requiring additional operations to produce
1059 a result. simple, saturate and pred-result are however inter-element
1060 independent and may easily be parallelised to give high performance,
1061 regardless of the value of VL.
1062
1063 The Mode table for Arithmetic and Logical operations is laid out as
1064 follows:
1065
1066 | 0-1 | 2 | 3 4 | description |
1067 | --- | --- |---------|-------------------------- |
1068 | 00 | 0 | dz sz | simple mode |
1069 | 00 | 1 | 0 RG | scalar reduce mode (mapreduce) |
1070 | 00 | 1 | 1 / | reserved |
1071 | 01 | inv | CR-bit | Rc=1: ffirst CR sel |
1072 | 01 | inv | VLi RC1 | Rc=0: ffirst z/nonz |
1073 | 10 | N | dz sz | sat mode: N=0/1 u/s |
1074 | 11 | inv | CR-bit | Rc=1: pred-result CR sel |
1075 | 11 | inv | zz RC1 | Rc=0: pred-result z/nonz |
1076
1077 Fields:
1078
1079 * **sz / dz** if predication is enabled will put zeros into the dest
1080 (or as src in the case of twin pred) when the predicate bit is zero.
1081 otherwise the element is ignored or skipped, depending on context.
1082 * **zz**: both sz and dz are set equal to this flag
1083 * **inv CR bit** just as in branches (BO) these bits allow testing of
1084 a CR bit and whether it is set (inv=0) or unset (inv=1)
1085 * **RG** inverts the Vector Loop order (VL-1 downto 0) rather
1086 than the normal 0..VL-1
1087 * **N** sets signed/unsigned saturation.
1088 * **RC1** as if Rc=1, enables access to `VLi`.
1089 * **VLi** VL inclusive: in fail-first mode, the truncation of
1090 VL *includes* the current element at the failure point rather
1091 than excludes it from the count.
1092
1093 For LD/ST Modes, see [[sv/ldst]]. For Condition Registers see
1094 [[sv/cr_ops]]. For Branch modes, see [[sv/branches]].
1095
1096 ## Rounding, clamp and saturate
1097
1098 To help ensure for example that audio quality is not compromised by
1099 overflow, "saturation" is provided, as well as a way to detect when
1100 saturation occurred if desired (Rc=1). When Rc=1 there will be a *vector*
1101 of CRs, one CR per element in the result (Note: this is different from
1102 VSX which has a single CR per block).
1103
1104 When N=0 the result is saturated to within the maximum range of an
1105 unsigned value. For integer ops this will be 0 to 2^elwidth-1. Similar
1106 logic applies to FP operations, with the result being saturated to
1107 maximum rather than returning INF, and the minimum to +0.0
1108
1109 When N=1 the same occurs except that the result is saturated to the min
1110 or max of a signed result, and for FP to the min and max value rather
1111 than returning +/- INF.
1112
1113 When Rc=1, the CR "overflow" bit is set on the CR associated with
1114 the element, to indicate whether saturation occurred. Note that
1115 due to the hugely detrimental effect it has on parallel processing,
1116 XER.SO is **ignored** completely and is **not** brought into play here.
1117 The CR overflow bit is therefore simply set to zero if saturation did
1118 not occur, and to one if it did. This behaviour (ignoring XER.SO) is
1119 actually optional in the SFFS Compliancy Subset: for SVP64 it is made
1120 mandatory *but only on Vectorised instructions*.
1121
1122 Note also that saturate on operations that set OE=1 must raise an Illegal
1123 Instruction due to the conflicting use of the CR.so bit for storing
1124 if saturation occurred. Vectorised Integer Operations that produce a
1125 Carry-Out (CA, CA32): these two bits will be `UNDEFINED` if saturation
1126 is also requested.
1127
1128 Note that the operation takes place at the maximum bitwidth (max of
1129 src and dest elwidth) and that truncation occurs to the range of the
1130 dest elwidth.
1131
1132 *Programmer's Note: Post-analysis of the Vector of CRs to find out if any
1133 given element hit saturation may be done using a mapreduced CR op (cror),
1134 or by using the new crrweird instruction with Rc=1, which will transfer
1135 the required CR bits to a scalar integer and update CR0, which will allow
1136 testing the scalar integer for nonzero. see [[sv/cr_int_predication]].
1137 Alternatively, a Data-Dependent Fail-First may be used to truncate the
1138 Vector Length to non-saturated elements, greatly increasing the productivity
1139 of parallelised inner hot-loops.*
1140
1141 ## Reduce mode
1142
1143 Reduction in SVP64 is similar in essence to other Vector Processing ISAs,
1144 but leverages the underlying scalar Base v3.0B operations. Thus it is
1145 more a convention that the programmer may utilise to give the appearance
1146 and effect of a Horizontal Vector Reduction. Due to the unusual decoupling
1147 it is also possible to perform prefix-sum (Fibonacci Series) in certain
1148 circumstances. Details are in the SVP64 appendix
1149
1150 Reduce Mode should not be confused with Parallel Reduction [[sv/remap]].
1151 As explained in the [[sv/appendix]] Reduce Mode switches off the check
1152 which would normally stop looping if the result register is scalar.
1153 Thus, the result scalar register, if also used as a source scalar,
1154 may be used to perform sequential accumulation. This *deliberately*
1155 sets up a chain of Register Hazard Dependencies, whereas Parallel Reduce
1156 [[sv/remap]] deliberately issues a Tree-Schedule of operations that may
1157 be parallelised.
1158
1159 ## Data-dependent Fail-on-first
1160
1161 Data-dependent fail-on-first is very different from LD/ST Fail-First
1162 (also known as Fault-First) and is actually CR-field-driven.
1163 Vector elements are required to appear
1164 to be executed in sequential Program Order. When REMAP is not active,
1165 element 0 would be the first.
1166
1167 Data-driven (CR-driven) fail-on-first activates when Rc=1 or other
1168 CR-creating operation produces a result (including cmp). Similar to
1169 branch, an analysis of the CR is performed and if the test fails, the
1170 vector operation terminates and discards all element operations **at and
1171 above the current one**, and VL is truncated to either the *previous*
1172 element or the current one, depending on whether VLi (VL "inclusive")
1173 is clear or set, respectively.
1174
1175 Thus the new VL comprises a contiguous vector of results, all of which
1176 pass the testing criteria (equal to zero, less than zero etc as defined
1177 by the CR-bit test).
1178
1179 *Note: when VLi is clear, the behaviour at first seems counter-intuitive.
1180 A result is calculated but if the test fails it is prohibited from being
1181 actually written. This becomes intuitive again when it is remembered
1182 that the length that VL is set to is the number of *written* elements, and
1183 only when VLI is set will the current element be included in that count.*
1184
1185 The CR-based data-driven fail-on-first is "new" and not found in ARM SVE
1186 or RVV. At the same time it is "old" because it is almost identical to
1187 a generalised form of Z80's `CPIR` instruction. It is extremely useful
1188 for reducing instruction count, however requires speculative execution
1189 involving modifications of VL to get high performance implementations.
1190 An additional mode (RC1=1) effectively turns what would otherwise be an
1191 arithmetic operation into a type of `cmp`. The CR is stored (and the
1192 CR.eq bit tested against the `inv` field). If the CR.eq bit is equal to
1193 `inv` then the Vector is truncated and the loop ends.
1194
1195 VLi is only available as an option when `Rc=0` (or for instructions
1196 which do not have Rc). When set, the current element is always also
1197 included in the count (the new length that VL will be set to). This may
1198 be useful in combination with "inv" to truncate the Vector to *exclude*
1199 elements that fail a test, or, in the case of implementations of strncpy,
1200 to include the terminating zero.
1201
1202 In CR-based data-driven fail-on-first there is only the option to select
1203 and test one bit of each CR (just as with branch BO). For more complex
1204 tests this may be insufficient. If that is the case, a vectorised crop
1205 such as crand, cror or [[sv/cr_int_predication]] crweirder may be used,
1206 and ffirst applied to the crop instead of to the arithmetic vector. Note
1207 that crops are covered by the [[sv/cr_ops]] Mode format.
1208
1209 Use of Fail-on-first with Vertical-First Mode is not prohibited but is
1210 not really recommended. The effect of truncating VL
1211 may have unintended and unexpected consequences on subsequent instructions.
1212 VLi set will be fine: it is when VLi is clear that problems may be faced.
1213
1214 *Programmer's note: `VLi` is only accessible in normal operations which in
1215 turn limits the CR field bit-testing to only `EQ/NE`. [[sv/cr_ops]] are
1216 not so limited. Thus it is possible to use for example `sv.cror/ff=gt/vli
1217 *0,*0,*0`, which is not a `nop` because it allows Fail-First Mode to
1218 perform a test and truncate VL.*
1219
1220 *Hardware implementor's note: effective Sequential Program Order must
1221 be preserved. Speculative Execution is perfectly permitted as long as
1222 the speculative elements are held back from writing to register files
1223 (kept in Resevation Stations), until such time as the relevant CR Field
1224 bit(s) has been analysed. All Speculative elements sequentially beyond
1225 the test-failure point **MUST** be cancelled. This is no different from
1226 standard Out-of-Order Execution and the modification effort to efficiently
1227 support Data-Dependent Fail-First within a pre-existing Multi-Issue
1228 Out-of-Order Engine is anticipated to be minimal. In-Order systems on
1229 the other hand are expected, unavoidably, to be low-performance*.
1230
1231 Two extremely important aspects of ffirst are:
1232
1233 * LDST ffirst may never set VL equal to zero. This because on the first
1234 element an exception must be raised "as normal".
1235 * CR-based data-dependent ffirst on the other hand **can** set VL equal
1236 to zero. This is the only means in the entirety of SV that VL may be set
1237 to zero (with the exception of via the SV.STATE SPR). When VL is set
1238 zero due to the first element failing the CR bit-test, all subsequent
1239 vectorised operations are effectively `nops` which is
1240 *precisely the desired and intended behaviour*.
1241
1242 The second crucial aspect, compared to LDST Ffirst:
1243
1244 * LD/ST Failfirst may (beyond the initial first element
1245 conditions) truncate VL for any architecturally suitable reason. Beyond
1246 the first element LD/ST Failfirst is arbitrarily speculative and 100%
1247 non-deterministic.
1248 * CR-based data-dependent first on the other hand MUST NOT truncate VL
1249 arbitrarily to a length decided by the hardware: VL MUST only be
1250 truncated based explicitly on whether a test fails. This because it is
1251 a precise Deterministic test on which algorithms can and will will rely.
1252
1253 **Floating-point Exceptions**
1254
1255 When Floating-point exceptions are enabled VL must be truncated at
1256 the point where the Exception appears not to have occurred. If `VLi`
1257 is set then VL must include the faulting element, and thus the faulting
1258 element will always raise its exception. If however `VLi` is clear then
1259 VL **excludes** the faulting element and thus the exception will **never**
1260 be raised.
1261
1262 Although very strongly discouraged the Exception Mode that permits
1263 Floating Point Exception notification to arrive too late to unwind
1264 is permitted (under protest, due it violating the otherwise 100%
1265 Deterministic nature of Data-dependent Fail-first) and is `UNDEFINED`
1266 behaviour.
1267
1268 **Use of lax FP Exception Notification Mode could result in parallel
1269 computations proceeding with invalid results that have to be explicitly
1270 detected, whereas with the strict FP Execption Mode enabled, FFirst
1271 truncates VL, allows subsequent parallel computation to avoid the
1272 exceptions entirely**
1273
1274 ## Data-dependent fail-first on CR operations (crand etc)
1275
1276 Operations that actually produce or alter CR Field as a result have
1277 their own SVP64 Mode, described in [[sv/cr_ops]].
1278
1279 ## pred-result mode
1280
1281 This mode merges common CR testing with predication, saving on instruction
1282 count. Below is the pseudocode excluding predicate zeroing and elwidth
1283 overrides. Note that the pseudocode for SVP64 CR-ops is slightly different.
1284
1285 ```
1286 for i in range(VL):
1287 # predication test, skip all masked out elements.
1288 if predicate_masked_out(i):
1289 continue
1290 result = op(iregs[RA+i], iregs[RB+i])
1291 CRnew = analyse(result) # calculates eq/lt/gt
1292 # Rc=1 always stores the CR field
1293 if Rc=1 or RC1:
1294 CR.field[offs+i] = CRnew
1295 # now test CR, similar to branch
1296 if RC1 or CR.field[BO[0:1]] != BO[2]:
1297 continue # test failed: cancel store
1298 # result optionally stored but CR always is
1299 iregs[RT+i] = result
1300 ```
1301
1302 The reason for allowing the CR element to be stored is so that
1303 post-analysis of the CR Vector may be carried out. For example:
1304 Saturation may have occurred (and been prevented from updating, by the
1305 test) but it is desirable to know *which* elements fail saturation.
1306
1307 Note that RC1 Mode basically turns all operations into `cmp`. The
1308 calculation is performed but it is only the CR that is written. The
1309 element result is *always* discarded, never written (just like `cmp`).
1310
1311 Note that predication is still respected: predicate zeroing is slightly
1312 different: elements that fail the CR test *or* are masked out are zero'd.
1313
1314 --------
1315
1316 \newpage{}
1317
1318 # SV Load and Store
1319
1320 **Rationale**
1321
1322 All Vector ISAs dating back fifty years have extensive and comprehensive
1323 Load and Store operations that go far beyond the capabilities of Scalar
1324 RISC and most CISC processors, yet at their heart on an individual element
1325 basis may be found to be no different from RISC Scalar equivalents.
1326
1327 The resource savings from Vector LD/ST are significant and stem
1328 from the fact that one single instruction can trigger a dozen (or in
1329 some microarchitectures such as Cray or NEC SX Aurora) hundreds of
1330 element-level Memory accesses.
1331
1332 Additionally, and simply: if the Arithmetic side of an ISA supports
1333 Vector Operations, then in order to keep the ALUs 100% occupied the
1334 Memory infrastructure (and the ISA itself) correspondingly needs Vector
1335 Memory Operations as well.
1336
1337 Vectorised Load and Store also presents an extra dimension (literally)
1338 which creates scenarios unique to Vector applications, that a Scalar (and
1339 even a SIMD) ISA simply never encounters. SVP64 endeavours to add the
1340 modes typically found in *all* Scalable Vector ISAs, without changing the
1341 behaviour of the underlying Base (Scalar) v3.0B operations in any way.
1342 (The sole apparent exception is Post-Increment Mode on LD/ST-update
1343 instructions)
1344
1345 ## Modes overview
1346
1347 Vectorisation of Load and Store requires creation, from scalar operations,
1348 a number of different modes:
1349
1350 * **fixed aka "unit" stride** - contiguous sequence with no gaps
1351 * **element strided** - sequential but regularly offset, with gaps
1352 * **vector indexed** - vector of base addresses and vector of offsets
1353 * **Speculative fail-first** - where it makes sense to do so
1354 * **Structure Packing** - covered in SV by [[sv/remap]] and Pack/Unpack Mode.
1355
1356 *Despite being constructed from Scalar LD/ST none of these Modes exist
1357 or make sense in any Scalar ISA. They **only** exist in Vector ISAs*
1358
1359 Also included in SVP64 LD/ST is both signed and unsigned Saturation,
1360 as well as Element-width overrides and Twin-Predication.
1361
1362 Note also that Indexed [[sv/remap]] mode may be applied to both v3.0
1363 LD/ST Immediate instructions *and* v3.0 LD/ST Indexed instructions.
1364 LD/ST-Indexed should not be conflated with Indexed REMAP mode:
1365 clarification is provided below.
1366
1367 **Determining the LD/ST Modes**
1368
1369 A minor complication (caused by the retro-fitting of modern Vector
1370 features to a Scalar ISA) is that certain features do not exactly make
1371 sense or are considered a security risk. Fail-first on Vector Indexed
1372 would allow attackers to probe large numbers of pages from userspace,
1373 where strided fail-first (by creating contiguous sequential LDs) does not.
1374
1375 In addition, reduce mode makes no sense. Realistically we need an
1376 alternative table definition for [[sv/svp64]] `RM.MODE`. The following
1377 modes make sense:
1378
1379 * saturation
1380 * predicate-result (mostly for cache-inhibited LD/ST)
1381 * simple (no augmentation)
1382 * fail-first (where Vector Indexed is banned)
1383 * Signed Effective Address computation (Vector Indexed only)
1384
1385 More than that however it is necessary to fit the usual Vector ISA
1386 capabilities onto both Power ISA LD/ST with immediate and to LD/ST
1387 Indexed. They present subtly different Mode tables, which, due to lack
1388 of space, have the following quirks:
1389
1390 * LD/ST Immediate has no individual control over src/dest zeroing,
1391 whereas LD/ST Indexed does.
1392 * LD/ST Indexed has limited zeroing on pred-result, LD/ST Immediate has
1393 *no* option to select zeroing on pred-result.
1394
1395 ## Format and fields
1396
1397 Fields used in tables below:
1398
1399 * **sz / dz** if predication is enabled will put zeros into the dest
1400 (or as src in the case of twin pred) when the predicate bit is zero.
1401 otherwise the element is ignored or skipped, depending on context.
1402 * **zz**: both sz and dz are set equal to this flag.
1403 * **inv CR bit** just as in branches (BO) these bits allow testing of
1404 a CR bit and whether it is set (inv=0) or unset (inv=1)
1405 * **N** sets signed/unsigned saturation.
1406 * **RC1** as if Rc=1, stores CRs *but not the result*
1407 * **SEA** - Signed Effective Address, if enabled performs sign-extension on
1408 registers that have been reduced due to elwidth overrides
1409 * **PI** - post-increment mode (applies to LD/ST with update only).
1410 the Effective Address utilised is always just RA, i.e. the computation of
1411 EA is stored in RA **after** it is actually used.
1412 * **LF** - Load/Store Fail or Fault First: for any reason Load or Store Vectors
1413 may be truncated to (at least) one element, and VL altered to indicate such.
1414
1415 **LD/ST immediate**
1416
1417 The table for [[sv/svp64]] for `immed(RA)` which is `RM.MODE`
1418 (bits 19:23 of `RM`) is:
1419
1420 | 0-1 | 2 | 3 4 | description |
1421 | --- | --- |---------|--------------------------- |
1422 | 00 | 0 | zz els | simple mode |
1423 | 00 | 1 | PI LF | post-increment and Fault-First |
1424 | 01 | inv | CR-bit | Rc=1: ffirst CR sel |
1425 | 01 | inv | els RC1 | Rc=0: ffirst z/nonz |
1426 | 10 | N | zz els | sat mode: N=0/1 u/s |
1427 | 11 | inv | CR-bit | Rc=1: pred-result CR sel |
1428 | 11 | inv | els RC1 | Rc=0: pred-result z/nonz |
1429
1430 The `els` bit is only relevant when `RA.isvec` is clear: this indicates
1431 whether stride is unit or element:
1432
1433 ```
1434 if RA.isvec:
1435 svctx.ldstmode = indexed
1436 elif els == 0:
1437 svctx.ldstmode = unitstride
1438 elif immediate != 0:
1439 svctx.ldstmode = elementstride
1440 ```
1441
1442 An immediate of zero is a safety-valve to allow `LD-VSPLAT`: in effect
1443 the multiplication of the immediate-offset by zero results in reading from
1444 the exact same memory location, *even with a Vector register*. (Normally
1445 this type of behaviour is reserved for the mapreduce modes)
1446
1447 For `LD-VSPLAT`, on non-cache-inhibited Loads, the read can occur just
1448 the once and be copied, rather than hitting the Data Cache multiple
1449 times with the same memory read at the same location. The benefit of
1450 Cache-inhibited LD-splats is that it allows for memory-mapped peripherals
1451 to have multiple data values read in quick succession and stored in
1452 sequentially numbered registers (but, see Note below).
1453
1454 For non-cache-inhibited ST from a vector source onto a scalar destination:
1455 with the Vector loop effectively creating multiple memory writes to
1456 the same location, we can deduce that the last of these will be the
1457 "successful" one. Thus, implementations are free and clear to optimise
1458 out the overwriting STs, leaving just the last one as the "winner".
1459 Bear in mind that predicate masks will skip some elements (in source
1460 non-zeroing mode). Cache-inhibited ST operations on the other hand
1461 **MUST** write out a Vector source multiple successive times to the exact
1462 same Scalar destination. Just like Cache-inhibited LDs, multiple values
1463 may be written out in quick succession to a memory-mapped peripheral
1464 from sequentially-numbered registers.
1465
1466 Note that any memory location may be Cache-inhibited
1467 (Power ISA v3.1, Book III, 1.6.1, p1033)
1468
1469 *Programmer's Note: an immediate also with a Scalar source as a "VSPLAT"
1470 mode is simply not possible: there are not enough Mode bits. One single
1471 Scalar Load operation may be used instead, followed by any arithmetic
1472 operation (including a simple mv) in "Splat" mode.*
1473
1474 **LD/ST Indexed**
1475
1476 The modes for `RA+RB` indexed version are slightly different
1477 but are the same `RM.MODE` bits (19:23 of `RM`):
1478
1479 | 0-1 | 2 | 3 4 | description |
1480 | --- | --- |---------|-------------------------- |
1481 | 00 | SEA | dz sz | simple mode |
1482 | 01 | SEA | dz sz | Strided (scalar only source) |
1483 | 10 | N | dz sz | sat mode: N=0/1 u/s |
1484 | 11 | inv | CR-bit | Rc=1: pred-result CR sel |
1485 | 11 | inv | zz RC1 | Rc=0: pred-result z/nonz |
1486
1487 Vector Indexed Strided Mode is qualified as follows:
1488
1489 if mode = 0b01 and !RA.isvec and !RB.isvec:
1490 svctx.ldstmode = elementstride
1491
1492 A summary of the effect of Vectorisation of src or dest:
1493
1494 ```
1495 imm(RA) RT.v RA.v no stride allowed
1496 imm(RA) RT.s RA.v no stride allowed
1497 imm(RA) RT.v RA.s stride-select allowed
1498 imm(RA) RT.s RA.s not vectorised
1499 RA,RB RT.v {RA|RB}.v Standard Indexed
1500 RA,RB RT.s {RA|RB}.v Indexed but single LD (no VSPLAT)
1501 RA,RB RT.v {RA&RB}.s VSPLAT possible. stride selectable
1502 RA,RB RT.s {RA&RB}.s not vectorised (scalar identity)
1503 ```
1504
1505 Signed Effective Address computation is only relevant for Vector Indexed
1506 Mode, when elwidth overrides are applied. The source override applies to
1507 RB, and before adding to RA in order to calculate the Effective Address,
1508 if SEA is set RB is sign-extended from elwidth bits to the full 64 bits.
1509 For other Modes (ffirst, saturate), all EA computation with elwidth
1510 overrides is unsigned.
1511
1512 Note that cache-inhibited LD/ST when VSPLAT is activated will perform
1513 **multiple** LD/ST operations, sequentially. Even with scalar src
1514 a Cache-inhibited LD will read the same memory location *multiple
1515 times*, storing the result in successive Vector destination registers.
1516 This because the cache-inhibit instructions are typically used to read
1517 and write memory-mapped peripherals. If a genuine cache-inhibited
1518 LD-VSPLAT is required then a single *scalar* cache-inhibited LD should
1519 be performed, followed by a VSPLAT-augmented mv, copying the one *scalar*
1520 value into multiple register destinations.
1521
1522 Note also that cache-inhibited VSPLAT with Predicate-result is possible.
1523 This allows for example to issue a massive batch of memory-mapped
1524 peripheral reads, stopping at the first NULL-terminated character and
1525 truncating VL to that point. No branch is needed to issue that large
1526 burst of LDs, which may be valuable in Embedded scenarios.
1527
1528 ## Vectorisation of Scalar Power ISA v3.0B
1529
1530 Scalar Power ISA Load/Store operations may be seen from their
1531 pseudocode to be of the form:
1532
1533 ```
1534 lbux RT, RA, RB
1535 EA <- (RA) + (RB)
1536 RT <- MEM(EA)
1537 ```
1538
1539 and for immediate variants:
1540
1541 ```
1542 lb RT,D(RA)
1543 EA <- RA + EXTS(D)
1544 RT <- MEM(EA)
1545 ```
1546
1547 Thus in the first example, the source registers may each be independently
1548 marked as scalar or vector, and likewise the destination; in the second
1549 example only the one source and one dest may be marked as scalar or
1550 vector.
1551
1552 Thus we can see that Vector Indexed may be covered, and, as demonstrated
1553 with the pseudocode below, the immediate can be used to give unit
1554 stride or element stride. With there being no way to tell which from
1555 the Power v3.0B Scalar opcode alone, the choice is provided instead by
1556 the SV Context.
1557
1558 ```
1559 # LD not VLD! format - ldop RT, immed(RA)
1560 # op_width: lb=1, lh=2, lw=4, ld=8
1561 op_load(RT, RA, op_width, immed, svctx, RAupdate):
1562  ps = get_pred_val(FALSE, RA); # predication on src
1563  pd = get_pred_val(FALSE, RT); # ... AND on dest
1564  for (i=0, j=0, u=0; i < VL && j < VL;):
1565 # skip nonpredicates elements
1566 if (RA.isvec) while (!(ps & 1<<i)) i++;
1567 if (RAupdate.isvec) while (!(ps & 1<<u)) u++;
1568 if (RT.isvec) while (!(pd & 1<<j)) j++;
1569 if postinc:
1570 offs = 0; # added afterwards
1571 if RA.isvec: srcbase = ireg[RA+i]
1572 else srcbase = ireg[RA]
1573 elif svctx.ldstmode == elementstride:
1574 # element stride mode
1575 srcbase = ireg[RA]
1576 offs = i * immed # j*immed for a ST
1577 elif svctx.ldstmode == unitstride:
1578 # unit stride mode
1579 srcbase = ireg[RA]
1580 offs = immed + (i * op_width) # j*op_width for ST
1581 elif RA.isvec:
1582 # quirky Vector indexed mode but with an immediate
1583 srcbase = ireg[RA+i]
1584 offs = immed;
1585 else
1586 # standard scalar mode (but predicated)
1587 # no stride multiplier means VSPLAT mode
1588 srcbase = ireg[RA]
1589 offs = immed
1590
1591 # compute EA
1592 EA = srcbase + offs
1593 # load from memory
1594 ireg[RT+j] <= MEM[EA];
1595 # check post-increment of EA
1596 if postinc: EA = srcbase + immed;
1597 # update RA?
1598 if RAupdate: ireg[RAupdate+u] = EA;
1599 if (!RT.isvec)
1600 break # destination scalar, end now
1601 if (RA.isvec) i++;
1602 if (RAupdate.isvec) u++;
1603 if (RT.isvec) j++;
1604 ```
1605
1606 Indexed LD is:
1607
1608 ```
1609 # format: ldop RT, RA, RB
1610 function op_ldx(RT, RA, RB, RAupdate=False) # LD not VLD!
1611  ps = get_pred_val(FALSE, RA); # predication on src
1612  pd = get_pred_val(FALSE, RT); # ... AND on dest
1613  for (i=0, j=0, k=0, u=0; i < VL && j < VL && k < VL):
1614 # skip nonpredicated RA, RB and RT
1615 if (RA.isvec) while (!(ps & 1<<i)) i++;
1616 if (RAupdate.isvec) while (!(ps & 1<<u)) u++;
1617 if (RB.isvec) while (!(ps & 1<<k)) k++;
1618 if (RT.isvec) while (!(pd & 1<<j)) j++;
1619 if svctx.ldstmode == elementstride:
1620 EA = ireg[RA] + ireg[RB]*j # register-strided
1621 else
1622 EA = ireg[RA+i] + ireg[RB+k] # indexed address
1623 if RAupdate: ireg[RAupdate+u] = EA
1624 ireg[RT+j] <= MEM[EA];
1625 if (!RT.isvec)
1626 break # destination scalar, end immediately
1627 if (RA.isvec) i++;
1628 if (RAupdate.isvec) u++;
1629 if (RB.isvec) k++;
1630 if (RT.isvec) j++;
1631 ```
1632
1633 Note that Element-Strided uses the Destination Step because with both
1634 sources being Scalar as a prerequisite condition of activation of
1635 Element-Stride Mode, the source step (being Scalar) would never advance.
1636
1637 Note in both cases that [[sv/svp64]] allows RA-as-a-dest in "update"
1638 mode (`ldux`) to be effectively a *completely different* register from
1639 RA-as-a-source. This because there is room in svp64 to extend RA-as-src
1640 as well as RA-as-dest, both independently as scalar or vector *and*
1641 independently extending their range.
1642
1643 *Programmer's note: being able to set RA-as-a-source as separate from
1644 RA-as-a-destination as Scalar is **extremely valuable** once it is
1645 remembered that Simple-V element operations must be in Program Order,
1646 especially in loops, for saving on multiple address computations. Care
1647 does have to be taken however that RA-as-src is not overwritten by
1648 RA-as-dest unless intentionally desired, especially in element-strided
1649 Mode.*
1650
1651 ## LD/ST Indexed vs Indexed REMAP
1652
1653 Unfortunately the word "Indexed" is used twice in completely different
1654 contexts, potentially causing confusion.
1655
1656 * There has existed instructions in the Power ISA `ld RT,RA,RB` since
1657 its creation: these are called "LD/ST Indexed" instructions and their
1658 name and meaning is well-established.
1659 * There now exists, in Simple-V, a REMAP mode called "Indexed"
1660 Mode that can be applied to *any* instruction **including those
1661 named LD/ST Indexed**.
1662
1663 Whilst it may be costly in terms of register reads to allow REMAP Indexed
1664 Mode to be applied to any Vectorised LD/ST Indexed operation such as
1665 `sv.ld *RT,RA,*RB`, or even misleadingly labelled as redundant, firstly
1666 the strict application of the RISC Paradigm that Simple-V follows makes
1667 it awkward to consider *preventing* the application of Indexed REMAP to
1668 such operations, and secondly they are not actually the same at all.
1669
1670 Indexed REMAP, as applied to RB in the instruction `sv.ld *RT,RA,*RB`
1671 effectively performs an *in-place* re-ordering of the offsets, RB.
1672 To achieve the same effect without Indexed REMAP would require taking
1673 a *copy* of the Vector of offsets starting at RB, manually explicitly
1674 reordering them, and finally using the copy of re-ordered offsets in a
1675 non-REMAP'ed `sv.ld`. Using non-strided LD as an example, pseudocode
1676 showing what actually occurs, where the pseudocode for `indexed_remap`
1677 may be found in [[sv/remap]]:
1678
1679 ```
1680 # sv.ld *RT,RA,*RB with Index REMAP applied to RB
1681 for i in 0..VL-1:
1682 if remap.indexed:
1683 rb_idx = indexed_remap(i) # remap
1684 else:
1685 rb_idx = i # use the index as-is
1686 EA = GPR(RA) + GPR(RB+rb_idx)
1687 GPR(RT+i) = MEM(EA, 8)
1688 ```
1689
1690 Thus it can be seen that the use of Indexed REMAP saves copying
1691 and manual reordering of the Vector of RB offsets.
1692
1693 ## LD/ST ffirst
1694
1695 LD/ST ffirst treats the first LD/ST in a vector (element 0 if REMAP
1696 is not active) as an ordinary one, with all behaviour with respect to
1697 Interrupts Exceptions Page Faults Memory Management being identical
1698 in every regard to Scalar v3.0 Power ISA LD/ST. However for elements
1699 1 and above, if an exception would occur, then VL is **truncated**
1700 to the previous element: the exception is **not** then raised because
1701 the LD/ST that would otherwise have caused an exception is *required*
1702 to be cancelled. Additionally an implementor may choose to truncate VL
1703 for any arbitrary reason *except for the very first*.
1704
1705 ffirst LD/ST to multiple pages via a Vectorised Index base is
1706 considered a security risk due to the abuse of probing multiple
1707 pages in rapid succession and getting speculative feedback on which
1708 pages would fail. Therefore Vector Indexed LD/ST is prohibited
1709 entirely, and the Mode bit instead used for element-strided LD/ST.
1710
1711 ```
1712 for(i = 0; i < VL; i++)
1713 reg[rt + i] = mem[reg[ra] + i * reg[rb]];
1714 ```
1715
1716 High security implementations where any kind of speculative probing of
1717 memory pages is considered a risk should take advantage of the fact
1718 that implementations may truncate VL at any point, without requiring
1719 software to be rewritten and made non-portable. Such implementations may
1720 choose to *always* set VL=1 which will have the effect of terminating
1721 any speculative probing (and also adversely affect performance), but
1722 will at least not require applications to be rewritten.
1723
1724 Low-performance simpler hardware implementations may also choose (always)
1725 to also set VL=1 as the bare minimum compliant implementation of LD/ST
1726 Fail-First. It is however critically important to remember that the first
1727 element LD/ST **MUST** be treated as an ordinary LD/ST, i.e. **MUST**
1728 raise exceptions exactly like an ordinary LD/ST.
1729
1730 For ffirst LD/STs, VL may be truncated arbitrarily to a nonzero value
1731 for any implementation-specific reason. For example: it is perfectly
1732 reasonable for implementations to alter VL when ffirst LD or ST operations
1733 are initiated on a nonaligned boundary, such that within a loop the
1734 subsequent iteration of that loop begins the following ffirst LD/ST
1735 operations on an aligned boundary such as the beginning of a cache line,
1736 or beginning of a Virtual Memory page. Likewise, to reduce workloads or
1737 balance resources.
1738
1739 Vertical-First Mode is slightly strange in that only one element at a time
1740 is ever executed anyway. Given that programmers may legitimately choose
1741 to alter srcstep and dststep in non-sequential order as part of explicit
1742 loops, it is neither possible nor safe to make speculative assumptions
1743 about future LD/STs. Therefore, Fail-First LD/ST in Vertical-First is
1744 `UNDEFINED`. This is very different from Arithmetic (Data-dependent)
1745 FFirst where Vertical-First Mode is fully deterministic, not speculative.
1746
1747 ## LOAD/STORE Elwidths <a name="elwidth"></a>
1748
1749 Loads and Stores are almost unique in that the Power Scalar ISA
1750 provides a width for the operation (lb, lh, lw, ld). Only `extsb` and
1751 others like it provide an explicit operation width. There are therefore
1752 *three* widths involved:
1753
1754 * operation width (lb=8, lh=16, lw=32, ld=64)
1755 * src element width override (8/16/32/default)
1756 * destination element width override (8/16/32/default)
1757
1758 Some care is therefore needed to express and make clear the transformations,
1759 which are expressly in this order:
1760
1761 * Calculate the Effective Address from RA at full width
1762 but (on Indexed Load) allow srcwidth overrides on RB
1763 * Load at the operation width (lb/lh/lw/ld) as usual
1764 * byte-reversal as usual
1765 * Non-saturated mode:
1766 - zero-extension or truncation from operation width to dest elwidth
1767 - place result in destination at dest elwidth
1768 * Saturated mode:
1769 - Sign-extension or truncation from operation width to dest width
1770 - signed/unsigned saturation down to dest elwidth
1771
1772 In order to respect Power v3.0B Scalar behaviour the memory side
1773 is treated effectively as completely separate and distinct from SV
1774 augmentation. This is primarily down to quirks surrounding LE/BE and
1775 byte-reversal.
1776
1777 It is rather unfortunately possible to request an elwidth override on
1778 the memory side which does not mesh with the overridden operation width:
1779 these result in `UNDEFINED` behaviour. The reason is that the effect
1780 of attempting a 64-bit `sv.ld` operation with a source elwidth override
1781 of 8/16/32 would result in overlapping memory requests, particularly
1782 on unit and element strided operations. Thus it is `UNDEFINED` when
1783 the elwidth is smaller than the memory operation width. Examples include
1784 `sv.lw/sw=16/els` which requests (overlapping) 4-byte memory reads offset
1785 from each other at 2-byte intervals. Store likewise is also `UNDEFINED`
1786 where the dest elwidth override is less than the operation width.
1787
1788 Note the following regarding the pseudocode to follow:
1789
1790 * `scalar identity behaviour` SV Context parameter conditions turn this
1791 into a straight absolute fully-compliant Scalar v3.0B LD operation
1792 * `brev` selects whether the operation is the byte-reversed variant (`ldbrx`
1793 rather than `ld`)
1794 * `op_width` specifies the operation width (`lb`, `lh`, `lw`, `ld`) as
1795 a "normal" part of Scalar v3.0B LD
1796 * `imm_offs` specifies the immediate offset `ld r3, imm_offs(r5)`, again
1797 as a "normal" part of Scalar v3.0B LD
1798 * `svctx` specifies the SV Context and includes VL as well as
1799 source and destination elwidth overrides.
1800
1801 Below is the pseudocode for Unit-Strided LD (which includes Vector
1802 capability). Observe in particular that RA, as the base address in both
1803 Immediate and Indexed LD/ST, does not have element-width overriding
1804 applied to it.
1805
1806 Note that predication, predication-zeroing, and other modes except
1807 saturation have all been removed, for clarity and simplicity:
1808
1809 ```
1810 # LD not VLD!
1811 # this covers unit stride mode and a type of vector offset
1812 function op_ld(RT, RA, op_width, imm_offs, svctx)
1813 for (int i = 0, int j = 0; i < svctx.VL && j < svctx.VL):
1814 if not svctx.unit/el-strided:
1815 # strange vector mode, compute 64 bit address which is
1816 # not polymorphic! elwidth hardcoded to 64 here
1817 srcbase = get_polymorphed_reg(RA, 64, i)
1818 else:
1819 # unit / element stride mode, compute 64 bit address
1820 srcbase = get_polymorphed_reg(RA, 64, 0)
1821 # adjust for unit/el-stride
1822 srcbase += ....
1823
1824 # read the underlying memory
1825 memread <= MEM(srcbase + imm_offs, op_width)
1826
1827 # check saturation.
1828 if svpctx.saturation_mode:
1829 # ... saturation adjustment...
1830 memread = clamp(memread, op_width, svctx.dest_elwidth)
1831 else:
1832 # truncate/extend to over-ridden dest width.
1833 memread = adjust_wid(memread, op_width, svctx.dest_elwidth)
1834
1835 # takes care of inserting memory-read (now correctly byteswapped)
1836 # into regfile underlying LE-defined order, into the right place
1837 # within the NEON-like register, respecting destination element
1838 # bitwidth, and the element index (j)
1839 set_polymorphed_reg(RT, svctx.dest_elwidth, j, memread)
1840
1841 # increments both src and dest element indices (no predication here)
1842 i++;
1843 j++;
1844 ```
1845
1846 Note above that the source elwidth is *not used at all* in LD-immediate.
1847
1848 For LD/Indexed, the key is that in the calculation of the Effective Address,
1849 RA has no elwidth override but RB does. Pseudocode below is simplified
1850 for clarity: predication and all modes except saturation are removed:
1851
1852 ```
1853 # LD not VLD! ld*rx if brev else ld*
1854 function op_ld(RT, RA, RB, op_width, svctx, brev)
1855 for (int i = 0, int j = 0; i < svctx.VL && j < svctx.VL):
1856 if not svctx.el-strided:
1857 # RA not polymorphic! elwidth hardcoded to 64 here
1858 srcbase = get_polymorphed_reg(RA, 64, i)
1859 else:
1860 # element stride mode, again RA not polymorphic
1861 srcbase = get_polymorphed_reg(RA, 64, 0)
1862 # RB *is* polymorphic
1863 offs = get_polymorphed_reg(RB, svctx.src_elwidth, i)
1864 # sign-extend
1865 if svctx.SEA: offs = sext(offs, svctx.src_elwidth, 64)
1866
1867 # takes care of (merges) processor LE/BE and ld/ldbrx
1868 bytereverse = brev XNOR MSR.LE
1869
1870 # read the underlying memory
1871 memread <= MEM(srcbase + offs, op_width)
1872
1873 # optionally performs byteswap at op width
1874 if (bytereverse):
1875 memread = byteswap(memread, op_width)
1876
1877 if svpctx.saturation_mode:
1878 # ... saturation adjustment...
1879 memread = clamp(memread, op_width, svctx.dest_elwidth)
1880 else:
1881 # truncate/extend to over-ridden dest width.
1882 memread = adjust_wid(memread, op_width, svctx.dest_elwidth)
1883
1884 # takes care of inserting memory-read (now correctly byteswapped)
1885 # into regfile underlying LE-defined order, into the right place
1886 # within the NEON-like register, respecting destination element
1887 # bitwidth, and the element index (j)
1888 set_polymorphed_reg(RT, svctx.dest_elwidth, j, memread)
1889
1890 # increments both src and dest element indices (no predication here)
1891 i++;
1892 j++;
1893 ```
1894
1895 ## Remapped LD/ST
1896
1897 In the [[sv/remap]] page the concept of "Remapping" is described. Whilst
1898 it is expensive to set up (2 64-bit opcodes minimum) it provides a way to
1899 arbitrarily perform 1D, 2D and 3D "remapping" of up to 64 elements worth
1900 of LDs or STs. The usual interest in such re-mapping is for example in
1901 separating out 24-bit RGB channel data into separate contiguous registers.
1902
1903 REMAP easily covers this capability, and with dest elwidth overrides
1904 and saturation may do so with built-in conversion that would normally
1905 require additional width-extension, sign-extension and min/max Vectorised
1906 instructions as post-processing stages.
1907
1908 Thus we do not need to provide specialist LD/ST "Structure Packed" opcodes
1909 because the generic abstracted concept of "Remapping", when applied to
1910 LD/ST, will give that same capability, with far more flexibility.
1911
1912 It is worth noting that Pack/Unpack Modes of SVSTATE, which may be
1913 established through `svstep`, are also an easy way to perform regular
1914 Structure Packing, at the vec2/vec3/vec4 granularity level. Beyond that,
1915 REMAP will need to be used.
1916
1917 --------
1918
1919 \newpage{}
1920
1921 # Condition Register SVP64 Operations
1922
1923 Condition Register Fields are only 4 bits wide: this presents some
1924 interesting conceptual challenges for SVP64, which was designed
1925 primarily for vectors of arithmetic and logical operations. However
1926 if predicates may be bits of CR Fields it makes sense to extend
1927 Simple-V to cover CR Operations, especially given that Vectorised Rc=1
1928 may be processed by Vectorised CR Operations tbat usefully in turn
1929 may become Predicate Masks to yet more Vector operations, like so:
1930
1931 ```
1932 sv.cmpi/ew=8 *B,*ra,0 # compare bytes against zero
1933 sv.cmpi/ew=8 *B2,*ra,13. # and against newline
1934 sv.cror PM.EQ,B.EQ,B2.EQ # OR compares to create mask
1935 sv.stb/sm=EQ ... # store only nonzero/newline
1936 ```
1937
1938 Element width however is clearly meaningless for a 4-bit collation of
1939 Conditions, EQ LT GE SO. Likewise, arithmetic saturation (an important
1940 part of Arithmetic SVP64) has no meaning. An alternative Mode Format is
1941 required, and given that elwidths are meaningless for CR Fields the bits
1942 in SVP64 `RM` may be used for other purposes.
1943
1944 This alternative mapping **only** applies to instructions that **only**
1945 reference a CR Field or CR bit as the sole exclusive result. This section
1946 **does not** apply to instructions which primarily produce arithmetic
1947 results that also, as an aside, produce a corresponding CR Field (such as
1948 when Rc=1). Instructions that involve Rc=1 are definitively arithmetic
1949 in nature, where the corresponding Condition Register Field can be
1950 considered to be a "co-result". Such CR Field "co-result" arithmeric
1951 operations are firmly out of scope for this section, being covered fully
1952 by [[sv/normal]].
1953
1954 * Examples of v3.0B instructions to which this section does
1955 apply is
1956 - `mfcr` and `cmpi` (3 bit operands) and
1957 - `crnor` and `crand` (5 bit operands).
1958 * Examples to which this section does **not** apply include
1959 `fadds.` and `subf.` which both produce arithmetic results
1960 (and a CR Field co-result).
1961
1962 The CR Mode Format still applies to `sv.cmpi` because despite
1963 taking a GPR as input, the output from the Base Scalar v3.0B `cmpi`
1964 instruction is purely to a Condition Register Field.
1965
1966 Other modes are still applicable and include:
1967
1968 * **Data-dependent fail-first**.
1969 useful to truncate VL based on analysis of a Condition Register result bit.
1970 * **Reduction**.
1971 Reduction is useful for analysing a Vector of Condition Register Fields
1972 and reducing it to one single Condition Register Field.
1973
1974 Predicate-result does not make any sense because when Rc=1 a co-result
1975 is created (a CR Field). Testing the co-result allows the decision to
1976 be made to store or not store the main result, and for CR Ops the CR
1977 Field result *is* the main result.
1978
1979 ## Format
1980
1981 SVP64 RM `MODE` (includes `ELWIDTH_SRC` bits) for CR-based operations:
1982
1983 |6 | 7 |19-20| 21 | 22 23 | description |
1984 |--|---|-----| --- |---------|----------------- |
1985 |/ | / |0 RG | 0 | dz sz | simple mode |
1986 |/ | / |0 RG | 1 | dz sz | scalar reduce mode (mapreduce) |
1987 |zz|SNZ|1 VLI| inv | CR-bit | Ffirst 3-bit mode |
1988 |/ |SNZ|1 VLI| inv | dz sz | Ffirst 5-bit mode (implies CR-bit from result) |
1989
1990 Fields:
1991
1992 * **sz / dz** if predication is enabled will put zeros into the dest
1993 (or as src in the case of twin pred) when the predicate bit is zero.
1994 otherwise the element is ignored or skipped, depending on context.
1995 * **zz** set both sz and dz equal to this flag
1996 * **SNZ** In fail-first mode, on the bit being tested, when sz=1 and
1997 SNZ=1 a value "1" is put in place of "0".
1998 * **inv CR-bit** just as in branches (BO) these bits allow testing of
1999 a CR bit and whether it is set (inv=0) or unset (inv=1)
2000 * **RG** inverts the Vector Loop order (VL-1 downto 0) rather
2001 than the normal 0..VL-1
2002 * **SVM** sets "subvector" reduce mode
2003 * **VLi** VL inclusive: in fail-first mode, the truncation of
2004 VL *includes* the current element at the failure point rather
2005 than excludes it from the count.
2006
2007 ## Data-dependent fail-first on CR operations
2008
2009 The principle of data-dependent fail-first is that if, during the course
2010 of sequentially evaluating an element's Condition Test, one such test
2011 is encountered which fails, then VL (Vector Length) is truncated (set)
2012 at that point. In the case of Arithmetic SVP64 Operations the Condition
2013 Register Field generated from Rc=1 is used as the basis for the truncation
2014 decision. However with CR-based operations that CR Field result to be
2015 tested is provided *by the operation itself*.
2016
2017 Data-dependent SVP64 Vectorised Operations involving the creation
2018 or modification of a CR can require an extra two bits, which are not
2019 available in the compact space of the SVP64 RM `MODE` Field. With the
2020 concept of element width overrides being meaningless for CR Fields it
2021 is possible to use the `ELWIDTH` field for alternative purposes.
2022
2023 Condition Register based operations such as `sv.mfcr` and `sv.crand`
2024 can thus be made more flexible. However the rules that apply in this
2025 section also apply to future CR-based instructions.
2026
2027 There are two primary different types of CR operations:
2028
2029 * Those which have a 3-bit operand field (referring to a CR Field)
2030 * Those which have a 5-bit operand (referring to a bit within the
2031 whole 32-bit CR)
2032
2033 Examining these two types it is observed that the difference may
2034 be considered to be that the 5-bit variant *already* provides the
2035 prerequisite information about which CR Field bit (EQ, GE, LT, SO) is
2036 to be operated on by the instruction. Thus, logically, we may set the
2037 following rule:
2038
2039 * When a 5-bit CR Result field is used in an instruction, the
2040 5-bit variant of Data-Dependent Fail-First
2041 must be used. i.e. the bit of the CR field to be tested is
2042 the one that has just been modified (created) by the operation.
2043 * When a 3-bit CR Result field is used the 3-bit variant
2044 must be used, providing as it does the missing `CRbit` field
2045 in order to select which CR Field bit of the result shall
2046 be tested (EQ, LE, GE, SO)
2047
2048 The reason why the 3-bit CR variant needs the additional CR-bit field
2049 should be obvious from the fact that the 3-bit CR Field from the base
2050 Power ISA v3.0B operation clearly does not contain and is missing the
2051 two CR Field Selector bits. Thus, these two bits (to select EQ, LE,
2052 GE or SO) must be provided in another way.
2053
2054 Examples of the former type:
2055
2056 * crand, cror, crnor. These all are 5-bit (BA, BB, BT). The bit
2057 to be tested against `inv` is the one selected by `BT`
2058 * mcrf. This has only 3-bit (BF, BFA). In order to select the
2059 bit to be tested, the alternative encoding must be used.
2060 With `CRbit` coming from the SVP64 RM bits 22-23 the bit
2061 of BF to be tested is identified.
2062
2063 Just as with SVP64 [[sv/branches]] there is the option to truncate
2064 VL to include the element being tested (`VLi=1`) and to exclude it
2065 (`VLi=0`).
2066
2067 Also exactly as with [[sv/normal]] fail-first, VL cannot, unlike
2068 [[sv/ldst]], be set to an arbitrary value. Deterministic behaviour
2069 is *required*.
2070
2071 ## Reduction and Iteration
2072
2073 Bearing in mind as described in the svp64 Appendix, SVP64 Horizontal
2074 Reduction is a deterministic schedule on top of base Scalar v3.0
2075 operations, the same rules apply to CR Operations, i.e. that programmers
2076 must follow certain conventions in order for an *end result* of a
2077 reduction to be achieved. Unlike other Vector ISAs *there are no explicit
2078 reduction opcodes* in SVP64: Schedules however achieve the same effect.
2079
2080 Due to these conventions only reduction on operations such as `crand`
2081 and `cror` are meaningful because these have Condition Register Fields
2082 as both input and output. Meaningless operations are not prohibited
2083 because the cost in hardware of doing so is prohibitive, but neither
2084 are they `UNDEFINED`. Implementations are still required to execute them
2085 but are at liberty to optimise out any operations that would ultimately
2086 be overwritten, as long as Strict Program Order is still obvservable by
2087 the programmer.
2088
2089 Also bear in mind that 'Reverse Gear' may be enabled, which can be
2090 used in combination with overlapping CR operations to iteratively
2091 accumulate results. Issuing a `sv.crand` operation for example with
2092 `BA` differing from `BB` by one Condition Register Field would result
2093 in a cascade effect, where the first-encountered CR Field would set the
2094 result to zero, and also all subsequent CR Field elements thereafter:
2095
2096 ```
2097 # sv.crand/mr/rg CR4.ge.v, CR5.ge.v, CR4.ge.v
2098 for i in VL-1 downto 0 # reverse gear
2099 CR.field[4+i].ge &= CR.field[5+i].ge
2100 ```
2101
2102 `sv.crxor` with reduction would be particularly useful for parity
2103 calculation for example, although there are many ways in which the same
2104 calculation could be carried out after transferring a vector of CR Fields
2105 to a GPR using crweird operations.
2106
2107 Implementations are free and clear to optimise these reductions in any way
2108 they see fit, as long as the end-result is compatible with Strict Program
2109 Order being observed, and Interrupt latency is not adversely impacted.
2110
2111 ## Unusual and quirky CR operations
2112
2113 **cmp and other compare ops**
2114
2115 `cmp` and `cmpi` etc take GPRs as sources and create a CR Field as a result.
2116
2117 cmpli BF,L,RA,UI
2118 cmpeqb BF,RA,RB
2119
2120 With `ELWIDTH` applying to the source GPR operands this is perfectly fine.
2121
2122 **crweird operations**
2123
2124 There are 4 weird CR-GPR operations and one reasonable one in
2125 the [[cr_int_predication]] set:
2126
2127 * crrweird
2128 * mtcrweird
2129 * crweirder
2130 * crweird
2131 * mcrfm - reasonably normal and referring to CR Fields for src and dest.
2132
2133 The "weird" operations have a non-standard behaviour, being able to
2134 treat *individual bits* of a GPR effectively as elements. They are
2135 expected to be Micro-coded by most Hardware implementations.
2136
2137
2138 --------
2139
2140 \newpage{}
2141
2142 # SVP64 Branch Conditional behaviour
2143
2144 Please note: although similar, SVP64 Branch instructions should be
2145 considered completely separate and distinct from standard scalar
2146 OpenPOWER-approved v3.0B branches. **v3.0B branches are in no way
2147 impacted, altered, changed or modified in any way, shape or form by the
2148 SVP64 Vectorised Variants**.
2149
2150 It is also extremely important to note that Branches are the sole
2151 pseudo-exception in SVP64 to `Scalar Identity Behaviour`. SVP64 Branches
2152 contain additional modes that are useful for scalar operations (i.e. even
2153 when VL=1 or when using single-bit predication).
2154
2155 **Rationale**
2156
2157 Scalar 3.0B Branch Conditional operations, `bc`, `bctar` etc. test
2158 a Condition Register. However for parallel processing it is simply
2159 impossible to perform multiple independent branches: the Program
2160 Counter simply cannot branch to multiple destinations based on multiple
2161 conditions. The best that can be done is to test multiple Conditions
2162 and make a decision of a *single* branch, based on analysis of a *Vector*
2163 of CR Fields which have just been calculated from a *Vector* of results.
2164
2165 In 3D Shader binaries, which are inherently parallelised and predicated,
2166 testing all or some results and branching based on multiple tests is
2167 extremely common, and a fundamental part of Shader Compilers. Example:
2168 without such multi-condition test-and-branch, if a predicate mask is
2169 all zeros a large batch of instructions may be masked out to `nop`,
2170 and it would waste CPU cycles to run them. 3D GPU ISAs can test for
2171 this scenario and, with the appropriate predicate-analysis instruction,
2172 jump over fully-masked-out operations, by spotting that *all* Conditions
2173 are false.
2174
2175 Unless Branches are aware and capable of such analysis, additional
2176 instructions would be required which perform Horizontal Cumulative
2177 analysis of Vectorised Condition Register Fields, in order to reduce
2178 the Vector of CR Fields down to one single yes or no decision that a
2179 Scalar-only v3.0B Branch-Conditional could cope with. Such instructions
2180 would be unavoidable, required, and costly by comparison to a single
2181 Vector-aware Branch. Therefore, in order to be commercially competitive,
2182 `sv.bc` and other Vector-aware Branch Conditional instructions are a
2183 high priority for 3D GPU (and OpenCL-style) workloads.
2184
2185 Given that Power ISA v3.0B is already quite powerful, particularly
2186 the Condition Registers and their interaction with Branches, there are
2187 opportunities to create extremely flexible and compact Vectorised Branch
2188 behaviour. In addition, the side-effects (updating of CTR, truncation
2189 of VL, described below) make it a useful instruction even if the branch
2190 points to the next instruction (no actual branch).
2191
2192 ## Overview
2193
2194 When considering an "array" of branch-tests, there are four
2195 primarily-useful modes: AND, OR, NAND and NOR of all Conditions.
2196 NAND and NOR may be synthesised from AND and OR by inverting `BO[1]`
2197 which just leaves two modes:
2198
2199 * Branch takes place on the **first** CR Field test to succeed
2200 (a Great Big OR of all condition tests). Exit occurs
2201 on the first **successful** test.
2202 * Branch takes place only if **all** CR field tests succeed:
2203 a Great Big AND of all condition tests. Exit occurs
2204 on the first **failed** test.
2205
2206 Early-exit is enacted such that the Vectorised Branch does not
2207 perform needless extra tests, which will help reduce reads on
2208 the Condition Register file.
2209
2210 *Note: Early-exit is **MANDATORY** (required) behaviour. Branches
2211 **MUST** exit at the first sequentially-encountered failure point,
2212 for exactly the same reasons for which it is mandatory in programming
2213 languages doing early-exit: to avoid damaging side-effects and to provide
2214 deterministic behaviour. Speculative testing of Condition Register
2215 Fields is permitted, as is speculative calculation of CTR, as long as,
2216 as usual in any Out-of-Order microarchitecture, that speculative testing
2217 is cancelled should an early-exit occur. i.e. the speculation must be
2218 "precise": Program Order must be preserved*
2219
2220 Also note that when early-exit occurs in Horizontal-first Mode, srcstep,
2221 dststep etc. are all reset, ready to begin looping from the beginning
2222 for the next instruction. However for Vertical-first Mode srcstep
2223 etc. are incremented "as usual" i.e. an early-exit has no special impact,
2224 regardless of whether the branch occurred or not. This can leave srcstep
2225 etc. in what may be considered an unusual state on exit from a loop and
2226 it is up to the programmer to reset srcstep, dststep etc. to known-good
2227 values *(easily achieved with `setvl`)*.
2228
2229 Additional useful behaviour involves two primary Modes (both of which
2230 may be enabled and combined):
2231
2232 * **VLSET Mode**: identical to Data-Dependent Fail-First Mode
2233 for Arithmetic SVP64 operations, with more
2234 flexibility and a close interaction and integration into the
2235 underlying base Scalar v3.0B Branch instruction.
2236 Truncation of VL takes place around the early-exit point.
2237 * **CTR-test Mode**: gives much more flexibility over when and why
2238 CTR is decremented, including options to decrement if a Condition
2239 test succeeds *or if it fails*.
2240
2241 With these side-effects, basic Boolean Logic Analysis advises that it
2242 is important to provide a means to enact them each based on whether
2243 testing succeeds *or fails*. This results in a not-insignificant number
2244 of additional Mode Augmentation bits, accompanying VLSET and CTR-test
2245 Modes respectively.
2246
2247 Predicate skipping or zeroing may, as usual with SVP64, be controlled by
2248 `sz`. Where the predicate is masked out and zeroing is enabled, then in
2249 such circumstances the same Boolean Logic Analysis dictates that rather
2250 than testing only against zero, the option to test against one is also
2251 prudent. This introduces a new immediate field, `SNZ`, which works in
2252 conjunction with `sz`.
2253
2254 Vectorised Branches can be used in either SVP64 Horizontal-First or
2255 Vertical-First Mode. Essentially, at an element level, the behaviour
2256 is identical in both Modes, although the `ALL` bit is meaningless in
2257 Vertical-First Mode.
2258
2259 It is also important to bear in mind that, fundamentally, Vectorised
2260 Branch-Conditional is still extremely close to the Scalar v3.0B
2261 Branch-Conditional instructions, and that the same v3.0B Scalar
2262 Branch-Conditional instructions are still *completely separate and
2263 independent*, being unaltered and unaffected by their SVP64 variants in
2264 every conceivable way.
2265
2266 *Programming note: One important point is that SVP64 instructions are
2267 64 bit. (8 bytes not 4). This needs to be taken into consideration
2268 when computing branch offsets: the offset is relative to the start of
2269 the instruction, which **includes** the SVP64 Prefix*
2270
2271 ## Format and fields
2272
2273 With element-width overrides being meaningless for Condition Register
2274 Fields, bits 4 thru 7 of SVP64 RM may be used for additional Mode bits.
2275
2276 SVP64 RM `MODE` (includes repurposing `ELWIDTH` bits 4:5, and
2277 `ELWIDTH_SRC` bits 6-7 for *alternate* uses) for Branch Conditional:
2278
2279 | 4 | 5 | 6 | 7 | 17 | 18 | 19 | 20 | 21 | 22 23 | description |
2280 | - | - | - | - | -- | -- | -- | -- | --- |--------|----------------- |
2281 |ALL|SNZ| / | / | SL |SLu | 0 | 0 | / | LRu sz | simple mode |
2282 |ALL|SNZ| / |VSb| SL |SLu | 0 | 1 | VLI | LRu sz | VLSET mode |
2283 |ALL|SNZ|CTi| / | SL |SLu | 1 | 0 | / | LRu sz | CTR-test mode |
2284 |ALL|SNZ|CTi|VSb| SL |SLu | 1 | 1 | VLI | LRu sz | CTR-test+VLSET mode |
2285
2286 Brief description of fields:
2287
2288 * **sz=1** if predication is enabled and `sz=1` and a predicate
2289 element bit is zero, `SNZ` will
2290 be substituted in place of the CR bit selected by `BI`,
2291 as the Condition tested.
2292 Contrast this with
2293 normal SVP64 `sz=1` behaviour, where *only* a zero is put in
2294 place of masked-out predicate bits.
2295 * **sz=0** When `sz=0` skipping occurs as usual on
2296 masked-out elements, but unlike all
2297 other SVP64 behaviour which entirely skips an element with
2298 no related side-effects at all, there are certain
2299 special circumstances where CTR
2300 may be decremented. See CTR-test Mode, below.
2301 * **ALL** when set, all branch conditional tests must pass in order for
2302 the branch to succeed. When clear, it is the first sequentially
2303 encountered successful test that causes the branch to succeed.
2304 This is identical behaviour to how programming languages perform
2305 early-exit on Boolean Logic chains.
2306 * **VLI** VLSET is identical to Data-dependent Fail-First mode.
2307 In VLSET mode, VL *may* (depending on `VSb`) be truncated.
2308 If VLI (Vector Length Inclusive) is clear,
2309 VL is truncated to *exclude* the current element, otherwise it is
2310 included. SVSTATE.MVL is not altered: only VL.
2311 * **SL** identical to `LR` except applicable to SVSTATE. If `SL`
2312 is set, SVSTATE is transferred to SVLR (conditionally on
2313 whether `SLu` is set).
2314 * **SLu**: SVSTATE Link Update, like `LRu` except applies to SVSTATE.
2315 * **LRu**: Link Register Update, used in conjunction with LK=1
2316 to make LR update conditional
2317 * **VSb** In VLSET Mode, after testing,
2318 if VSb is set, VL is truncated if the test succeeds. If VSb is clear,
2319 VL is truncated if a test *fails*. Masked-out (skipped)
2320 bits are not considered
2321 part of testing when `sz=0`
2322 * **CTi** CTR inversion. CTR-test Mode normally decrements per element
2323 tested. CTR inversion decrements if a test *fails*. Only relevant
2324 in CTR-test Mode.
2325
2326 LRu and CTR-test modes are where SVP64 Branches subtly differ from
2327 Scalar v3.0B Branches. `sv.bcl` for example will always update LR,
2328 whereas `sv.bcl/lru` will only update LR if the branch succeeds.
2329
2330 Of special interest is that when using ALL Mode (Great Big AND of all
2331 Condition Tests), if `VL=0`, which is rare but can occur in Data-Dependent
2332 Modes, the Branch will always take place because there will be no failing
2333 Condition Tests to prevent it. Likewise when not using ALL Mode (Great
2334 Big OR of all Condition Tests) and `VL=0` the Branch is guaranteed not
2335 to occur because there will be no *successful* Condition Tests to make
2336 it happen.
2337
2338 ## Vectorised CR Field numbering, and Scalar behaviour
2339
2340 It is important to keep in mind that just like all SVP64 instructions,
2341 the `BI` field of the base v3.0B Branch Conditional instruction may be
2342 extended by SVP64 EXTRA augmentation, as well as be marked as either
2343 Scalar or Vector. It is also crucially important to keep in mind that for
2344 CRs, SVP64 sequentially increments the CR *Field* numbers. CR *Fields*
2345 are treated as elements, not bit-numbers of the CR *register*.
2346
2347 The `BI` operand of Branch Conditional operations is five bits, in scalar
2348 v3.0B this would select one bit of the 32 bit CR, comprising eight CR
2349 Fields of 4 bits each. In SVP64 there are 16 32 bit CRs, containing
2350 128 4-bit CR Fields. Therefore, the 2 LSBs of `BI` select the bit from
2351 the CR Field (EQ LT GT SO), and the top 3 bits are extended to either
2352 scalar or vector and to select CR Fields 0..127 as specified in SVP64
2353 [[sv/svp64/appendix]].
2354
2355 When the CR Fields selected by SVP64-Augmented `BI` is marked as scalar,
2356 then as the usual SVP64 rules apply: the Vector loop ends at the first
2357 element tested (the first CR *Field*), after taking predication into
2358 consideration. Thus, also as usual, when a predicate mask is given, and
2359 `BI` marked as scalar, and `sz` is zero, srcstep skips forward to the
2360 first non-zero predicated element, and only that one element is tested.
2361
2362 In other words, the fact that this is a Branch Operation (instead of an
2363 arithmetic one) does not result, ultimately, in significant changes as
2364 to how SVP64 is fundamentally applied, except with respect to:
2365
2366 * the unique properties associated with conditionally
2367 changing the Program Counter (aka "a Branch"), resulting in early-out
2368 opportunities
2369 * CTR-testing
2370
2371 Both are outlined below, in later sections.
2372
2373 ## Horizontal-First and Vertical-First Modes
2374
2375 In SVP64 Horizontal-First Mode, the first failure in ALL mode (Great Big
2376 AND) results in early exit: no more updates to CTR occur (if requested);
2377 no branch occurs, and LR is not updated (if requested). Likewise for
2378 non-ALL mode (Great Big Or) on first success early exit also occurs,
2379 however this time with the Branch proceeding. In both cases the testing
2380 of the Vector of CRs should be done in linear sequential order (or in
2381 REMAP re-sequenced order): such that tests that are sequentially beyond
2382 the exit point are *not* carried out. (*Note: it is standard practice
2383 in Programming languages to exit early from conditional tests, however a
2384 little unusual to consider in an ISA that is designed for Parallel Vector
2385 Processing. The reason is to have strictly-defined guaranteed behaviour*)
2386
2387 In Vertical-First Mode, setting the `ALL` bit results in `UNDEFINED`
2388 behaviour. Given that only one element is being tested at a time in
2389 Vertical-First Mode, a test designed to be done on multiple bits is
2390 meaningless.
2391
2392 ## Description and Modes
2393
2394 Predication in both INT and CR modes may be applied to `sv.bc` and other
2395 SVP64 Branch Conditional operations, exactly as they may be applied to
2396 other SVP64 operations. When `sz` is zero, any masked-out Branch-element
2397 operations are not included in condition testing, exactly like all other
2398 SVP64 operations, *including* side-effects such as potentially updating
2399 LR or CTR, which will also be skipped. There is *one* exception here,
2400 which is when `BO[2]=0, sz=0, CTR-test=0, CTi=1` and the relevant element
2401 predicate mask bit is also zero: under these special circumstances CTR
2402 will also decrement.
2403
2404 When `sz` is non-zero, this normally requests insertion of a zero in
2405 place of the input data, when the relevant predicate mask bit is zero.
2406 This would mean that a zero is inserted in place of `CR[BI+32]` for
2407 testing against `BO`, which may not be desirable in all circumstances.
2408 Therefore, an extra field is provided `SNZ`, which, if set, will insert
2409 a **one** in place of a masked-out element, instead of a zero.
2410
2411 (*Note: Both options are provided because it is useful to deliberately
2412 cause the Branch-Conditional Vector testing to fail at a specific point,
2413 controlled by the Predicate mask. This is particularly useful in `VLSET`
2414 mode, which will truncate SVSTATE.VL at the point of the first failed
2415 test.*)
2416
2417 Normally, CTR mode will decrement once per Condition Test, resulting under
2418 normal circumstances that CTR reduces by up to VL in Horizontal-First
2419 Mode. Just as when v3.0B Branch-Conditional saves at least one instruction
2420 on tight inner loops through auto-decrementation of CTR, likewise it
2421 is also possible to save instruction count for SVP64 loops in both
2422 Vertical-First and Horizontal-First Mode, particularly in circumstances
2423 where there is conditional interaction between the element computation
2424 and testing, and the continuation (or otherwise) of a given loop. The
2425 potential combinations of interactions is why CTR testing options have
2426 been added.
2427
2428 Also, the unconditional bit `BO[0]` is still relevant when Predication
2429 is applied to the Branch because in `ALL` mode all nonmasked bits have
2430 to be tested, and when `sz=0` skipping occurs. Even when VLSET mode is
2431 not used, CTR may still be decremented by the total number of nonmasked
2432 elements, acting in effect as either a popcount or cntlz depending
2433 on which mode bits are set. In short, Vectorised Branch becomes an
2434 extremely powerful tool.
2435
2436 **Micro-Architectural Implementation Note**: *when implemented on top
2437 of a Multi-Issue Out-of-Order Engine it is possible to pass a copy of
2438 the predicate and the prerequisite CR Fields to all Branch Units, as
2439 well as the current value of CTR at the time of multi-issue, and for
2440 each Branch Unit to compute how many times CTR would be subtracted,
2441 in a fully-deterministic and parallel fashion. A SIMD-based Branch
2442 Unit, receiving and processing multiple CR Fields covered by multiple
2443 predicate bits, would do the exact same thing. Obviously, however, if
2444 CTR is modified within any given loop (mtctr) the behaviour of CTR is
2445 no longer deterministic.*
2446
2447 ### Link Register Update
2448
2449 For a Scalar Branch, unconditional updating of the Link Register LR
2450 is useful and practical. However, if a loop of CR Fields is tested,
2451 unconditional updating of LR becomes problematic.
2452
2453 For example when using `bclr` with `LRu=1,LK=0` in Horizontal-First Mode,
2454 LR's value will be unconditionally overwritten after the first element,
2455 such that for execution (testing) of the second element, LR has the value
2456 `CIA+8`. This is covered in the `bclrl` example, in a later section.
2457
2458 The addition of a LRu bit modifies behaviour in conjunction with LK,
2459 as follows:
2460
2461 * `sv.bc` When LRu=0,LK=0, Link Register is not updated
2462 * `sv.bcl` When LRu=0,LK=1, Link Register is updated unconditionally
2463 * `sv.bcl/lru` When LRu=1,LK=1, Link Register will
2464 only be updated if the Branch Condition fails.
2465 * `sv.bc/lru` When LRu=1,LK=0, Link Register will only be updated if
2466 the Branch Condition succeeds.
2467
2468 This avoids destruction of LR during loops (particularly Vertical-First
2469 ones).
2470
2471 **SVLR and SVSTATE**
2472
2473 For precisely the reasons why `LK=1` was added originally to the Power
2474 ISA, with SVSTATE being a peer of the Program Counter it becomes necessary
2475 to also add an SVLR (SVSTATE Link Register) and corresponding control bits
2476 `SL` and `SLu`.
2477
2478 ### CTR-test
2479
2480 Where a standard Scalar v3.0B branch unconditionally decrements CTR when
2481 `BO[2]` is clear, CTR-test Mode introduces more flexibility which allows
2482 CTR to be used for many more types of Vector loops constructs.
2483
2484 CTR-test mode and CTi interaction is as follows: note that `BO[2]`
2485 is still required to be clear for CTR decrements to be considered,
2486 exactly as is the case in Scalar Power ISA v3.0B
2487
2488 * **CTR-test=0, CTi=0**: CTR decrements on a per-element basis
2489 if `BO[2]` is zero. Masked-out elements when `sz=0` are
2490 skipped (i.e. CTR is *not* decremented when the predicate
2491 bit is zero and `sz=0`).
2492 * **CTR-test=0, CTi=1**: CTR decrements on a per-element basis
2493 if `BO[2]` is zero and a masked-out element is skipped
2494 (`sz=0` and predicate bit is zero). This one special case is the
2495 **opposite** of other combinations, as well as being
2496 completely different from normal SVP64 `sz=0` behaviour)
2497 * **CTR-test=1, CTi=0**: CTR decrements on a per-element basis
2498 if `BO[2]` is zero and the Condition Test succeeds.
2499 Masked-out elements when `sz=0` are skipped (including
2500 not decrementing CTR)
2501 * **CTR-test=1, CTi=1**: CTR decrements on a per-element basis
2502 if `BO[2]` is zero and the Condition Test *fails*.
2503 Masked-out elements when `sz=0` are skipped (including
2504 not decrementing CTR)
2505
2506 `CTR-test=0, CTi=1, sz=0` requires special emphasis because it is the
2507 only time in the entirety of SVP64 that has side-effects when
2508 a predicate mask bit is clear. **All** other SVP64 operations
2509 entirely skip an element when sz=0 and a predicate mask bit is zero.
2510 It is also critical to emphasise that in this unusual mode,
2511 no other side-effects occur: **only** CTR is decremented, i.e. the
2512 rest of the Branch operation is skipped.
2513
2514 ### VLSET Mode
2515
2516 VLSET Mode truncates the Vector Length so that subsequent instructions
2517 operate on a reduced Vector Length. This is similar to Data-dependent
2518 Fail-First and LD/ST Fail-First, where for VLSET the truncation occurs
2519 at the Branch decision-point.
2520
2521 Interestingly, due to the side-effects of `VLSET` mode it is actually
2522 useful to use Branch Conditional even to perform no actual branch
2523 operation, i.e to point to the instruction after the branch. Truncation of
2524 VL would thus conditionally occur yet control flow alteration would not.
2525
2526 `VLSET` mode with Vertical-First is particularly unusual. Vertical-First
2527 is designed to be used for explicit looping, where an explicit call to
2528 `svstep` is required to move both srcstep and dststep on to the next
2529 element, until VL (or other condition) is reached. Vertical-First Looping
2530 is expected (required) to terminate if the end of the Vector, VL, is
2531 reached. If however that loop is terminated early because VL is truncated,
2532 VLSET with Vertical-First becomes meaningless. Resolving this would
2533 require two branches: one Conditional, the other branching unconditionally
2534 to create the loop, where the Conditional one jumps over it.
2535
2536 Therefore, with `VSb`, the option to decide whether truncation should
2537 occur if the branch succeeds *or* if the branch condition fails allows
2538 for the flexibility required. This allows a Vertical-First Branch to
2539 *either* be used as a branch-back (loop) *or* as part of a conditional
2540 exit or function call from *inside* a loop, and for VLSET to be integrated
2541 into both types of decision-making.
2542
2543 In the case of a Vertical-First branch-back (loop), with `VSb=0` the
2544 branch takes place if success conditions are met, but on exit from that
2545 loop (branch condition fails), VL will be truncated. This is extremely
2546 useful.
2547
2548 `VLSET` mode with Horizontal-First when `VSb=0` is still useful, because
2549 it can be used to truncate VL to the first predicated (non-masked-out)
2550 element.
2551
2552 The truncation point for VL, when VLi is clear, must not include skipped
2553 elements that preceded the current element being tested. Example:
2554 `sz=0, VLi=0, predicate mask = 0b110010` and the Condition Register
2555 failure point is at CR Field element 4.
2556
2557 * Testing at element 0 is skipped because its predicate bit is zero
2558 * Testing at element 1 passed
2559 * Testing elements 2 and 3 are skipped because their
2560 respective predicate mask bits are zero
2561 * Testing element 4 fails therefore VL is truncated to **2**
2562 not 4 due to elements 2 and 3 being skipped.
2563
2564 If `sz=1` in the above example *then* VL would have been set to 4 because
2565 in non-zeroing mode the zero'd elements are still effectively part of the
2566 Vector (with their respective elements set to `SNZ`)
2567
2568 If `VLI=1` then VL would be set to 5 regardless of sz, due to being inclusive
2569 of the element actually being tested.
2570
2571 ### VLSET and CTR-test combined
2572
2573 If both CTR-test and VLSET Modes are requested, it is important to
2574 observe the correct order. What occurs depends on whether VLi is enabled,
2575 because VLi affects the length, VL.
2576
2577 If VLi (VL truncate inclusive) is set:
2578
2579 1. compute the test including whether CTR triggers
2580 2. (optionally) decrement CTR
2581 3. (optionally) truncate VL (VSb inverts the decision)
2582 4. decide (based on step 1) whether to terminate looping
2583 (including not executing step 5)
2584 5. decide whether to branch.
2585
2586 If VLi is clear, then when a test fails that element
2587 and any following it
2588 should **not** be considered part of the Vector. Consequently:
2589
2590 1. compute the branch test including whether CTR triggers
2591 2. if the test fails against VSb, truncate VL to the *previous*
2592 element, and terminate looping. No further steps executed.
2593 3. (optionally) decrement CTR
2594 4. decide whether to branch.
2595
2596 ## Boolean Logic combinations
2597
2598 In a Scalar ISA, Branch-Conditional testing even of vector results may be
2599 performed through inversion of tests. NOR of all tests may be performed
2600 by inversion of the scalar condition and branching *out* from the scalar
2601 loop around elements, using scalar operations.
2602
2603 In a parallel (Vector) ISA it is the ISA itself which must perform
2604 the prerequisite logic manipulation. Thus for SVP64 there are an
2605 extraordinary number of nesessary combinations which provide completely
2606 different and useful behaviour. Available options to combine:
2607
2608 * `BO[0]` to make an unconditional branch would seem irrelevant if
2609 it were not for predication and for side-effects (CTR Mode
2610 for example)
2611 * Enabling CTR-test Mode and setting `BO[2]` can still result in the
2612 Branch
2613 taking place, not because the Condition Test itself failed, but
2614 because CTR reached zero **because**, as required by CTR-test mode,
2615 CTR was decremented as a **result** of Condition Tests failing.
2616 * `BO[1]` to select whether the CR bit being tested is zero or nonzero
2617 * `R30` and `~R30` and other predicate mask options including CR and
2618 inverted CR bit testing
2619 * `sz` and `SNZ` to insert either zeros or ones in place of masked-out
2620 predicate bits
2621 * `ALL` or `ANY` behaviour corresponding to `AND` of all tests and
2622 `OR` of all tests, respectively.
2623 * Predicate Mask bits, which combine in effect with the CR being
2624 tested.
2625 * Inversion of Predicate Masks (`~r3` instead of `r3`, or using
2626 `NE` rather than `EQ`) which results in an additional
2627 level of possible ANDing, ORing etc. that would otherwise
2628 need explicit instructions.
2629
2630 The most obviously useful combinations here are to set `BO[1]` to zero
2631 in order to turn `ALL` into Great-Big-NAND and `ANY` into Great-Big-NOR.
2632 Other Mode bits which perform behavioural inversion then have to work
2633 round the fact that the Condition Testing is NOR or NAND. The alternative
2634 to not having additional behavioural inversion (`SNZ`, `VSb`, `CTi`)
2635 would be to have a second (unconditional) branch directly after the first,
2636 which the first branch jumps over. This contrivance is avoided by the
2637 behavioural inversion bits.
2638
2639 ## Pseudocode and examples
2640
2641 Please see the SVP64 appendix regarding CR bit ordering and for
2642 the definition of `CR{n}`
2643
2644 For comparative purposes this is a copy of the v3.0B `bc` pseudocode
2645
2646 ```
2647 if (mode_is_64bit) then M <- 0
2648 else M <- 32
2649 if ¬BO[2] then CTR <- CTR - 1
2650 ctr_ok <- BO[2] | ((CTR[M:63] != 0) ^ BO[3])
2651 cond_ok <- BO[0] | ¬(CR[BI+32] ^ BO[1])
2652 if ctr_ok & cond_ok then
2653 if AA then NIA <-iea EXTS(BD || 0b00)
2654 else NIA <-iea CIA + EXTS(BD || 0b00)
2655 if LK then LR <-iea CIA + 4
2656 ```
2657
2658 Simplified pseudocode including LRu and CTR skipping, which illustrates
2659 clearly that SVP64 Scalar Branches (VL=1) are **not** identical to
2660 v3.0B Scalar Branches. The key areas where differences occur are the
2661 inclusion of predication (which can still be used when VL=1), in when and
2662 why CTR is decremented (CTRtest Mode) and whether LR is updated (which
2663 is unconditional in v3.0B when LK=1, and conditional in SVP64 when LRu=1).
2664
2665 Inline comments highlight the fact that the Scalar Branch behaviour and
2666 pseudocode is still clearly visible and embedded within the Vectorised
2667 variant:
2668
2669 ```
2670 if (mode_is_64bit) then M <- 0
2671 else M <- 32
2672 # the bit of CR to test, if the predicate bit is zero,
2673 # is overridden
2674 testbit = CR[BI+32]
2675 if ¬predicate_bit then testbit = SVRMmode.SNZ
2676 # otherwise apart from the override ctr_ok and cond_ok
2677 # are exactly the same
2678 ctr_ok <- BO[2] | ((CTR[M:63] != 0) ^ BO[3])
2679 cond_ok <- BO[0] | ¬(testbit ^ BO[1])
2680 if ¬predicate_bit & ¬SVRMmode.sz then
2681 # this is entirely new: CTR-test mode still decrements CTR
2682 # even when predicate-bits are zero
2683 if ¬BO[2] & CTRtest & ¬CTi then
2684 CTR = CTR - 1
2685 # instruction finishes here
2686 else
2687 # usual BO[2] CTR-mode now under CTR-test mode as well
2688 if ¬BO[2] & ¬(CTRtest & (cond_ok ^ CTi)) then CTR <- CTR - 1
2689 # new VLset mode, conditional test truncates VL
2690 if VLSET and VSb = (cond_ok & ctr_ok) then
2691 if SVRMmode.VLI then SVSTATE.VL = srcstep+1
2692 else SVSTATE.VL = srcstep
2693 # usual LR is now conditional, but also joined by SVLR
2694 lr_ok <- LK
2695 svlr_ok <- SVRMmode.SL
2696 if ctr_ok & cond_ok then
2697 if AA then NIA <-iea EXTS(BD || 0b00)
2698 else NIA <-iea CIA + EXTS(BD || 0b00)
2699 if SVRMmode.LRu then lr_ok <- ¬lr_ok
2700 if SVRMmode.SLu then svlr_ok <- ¬svlr_ok
2701 if lr_ok then LR <-iea CIA + 4
2702 if svlr_ok then SVLR <- SVSTATE
2703 ```
2704
2705 Below is the pseudocode for SVP64 Branches, which is a little less
2706 obvious but identical to the above. The lack of obviousness is down to
2707 the early-exit opportunities.
2708
2709 Effective pseudocode for Horizontal-First Mode:
2710
2711 ```
2712 if (mode_is_64bit) then M <- 0
2713 else M <- 32
2714 cond_ok = not SVRMmode.ALL
2715 for srcstep in range(VL):
2716 # select predicate bit or zero/one
2717 if predicate[srcstep]:
2718 # get SVP64 extended CR field 0..127
2719 SVCRf = SVP64EXTRA(BI>>2)
2720 CRbits = CR{SVCRf}
2721 testbit = CRbits[BI & 0b11]
2722 # testbit = CR[BI+32+srcstep*4]
2723 else if not SVRMmode.sz:
2724 # inverted CTR test skip mode
2725 if ¬BO[2] & CTRtest & ¬CTI then
2726 CTR = CTR - 1
2727 continue # skip to next element
2728 else
2729 testbit = SVRMmode.SNZ
2730 # actual element test here
2731 ctr_ok <- BO[2] | ((CTR[M:63] != 0) ^ BO[3])
2732 el_cond_ok <- BO[0] | ¬(testbit ^ BO[1])
2733 # check if CTR dec should occur
2734 ctrdec = ¬BO[2]
2735 if CTRtest & (el_cond_ok ^ CTi) then
2736 ctrdec = 0b0
2737 if ctrdec then CTR <- CTR - 1
2738 # merge in the test
2739 if SVRMmode.ALL:
2740 cond_ok &= (el_cond_ok & ctr_ok)
2741 else
2742 cond_ok |= (el_cond_ok & ctr_ok)
2743 # test for VL to be set (and exit)
2744 if VLSET and VSb = (el_cond_ok & ctr_ok) then
2745 if SVRMmode.VLI then SVSTATE.VL = srcstep+1
2746 else SVSTATE.VL = srcstep
2747 break
2748 # early exit?
2749 if SVRMmode.ALL != (el_cond_ok & ctr_ok):
2750 break
2751 # SVP64 rules about Scalar registers still apply!
2752 if SVCRf.scalar:
2753 break
2754 # loop finally done, now test if branch (and update LR)
2755 lr_ok <- LK
2756 svlr_ok <- SVRMmode.SL
2757 if cond_ok then
2758 if AA then NIA <-iea EXTS(BD || 0b00)
2759 else NIA <-iea CIA + EXTS(BD || 0b00)
2760 if SVRMmode.LRu then lr_ok <- ¬lr_ok
2761 if SVRMmode.SLu then svlr_ok <- ¬svlr_ok
2762 if lr_ok then LR <-iea CIA + 4
2763 if svlr_ok then SVLR <- SVSTATE
2764 ```
2765
2766 Pseudocode for Vertical-First Mode:
2767
2768 ```
2769 # get SVP64 extended CR field 0..127
2770 SVCRf = SVP64EXTRA(BI>>2)
2771 CRbits = CR{SVCRf}
2772 # select predicate bit or zero/one
2773 if predicate[srcstep]:
2774 if BRc = 1 then # CR0 vectorised
2775 CR{SVCRf+srcstep} = CRbits
2776 testbit = CRbits[BI & 0b11]
2777 else if not SVRMmode.sz:
2778 # inverted CTR test skip mode
2779 if ¬BO[2] & CTRtest & ¬CTI then
2780 CTR = CTR - 1
2781 SVSTATE.srcstep = new_srcstep
2782 exit # no branch testing
2783 else
2784 testbit = SVRMmode.SNZ
2785 # actual element test here
2786 cond_ok <- BO[0] | ¬(testbit ^ BO[1])
2787 # test for VL to be set (and exit)
2788 if VLSET and cond_ok = VSb then
2789 if SVRMmode.VLI
2790 SVSTATE.VL = new_srcstep+1
2791 else
2792 SVSTATE.VL = new_srcstep
2793 ```
2794
2795 ### Example Shader code
2796
2797 ```
2798 // assume f() g() or h() modify a and/or b
2799 while(a > 2) {
2800 if(b < 5)
2801 f();
2802 else
2803 g();
2804 h();
2805 }
2806 ```
2807
2808 which compiles to something like:
2809
2810 ```
2811 vec<i32> a, b;
2812 // ...
2813 pred loop_pred = a > 2;
2814 // loop continues while any of a elements greater than 2
2815 while(loop_pred.any()) {
2816 // vector of predicate bits
2817 pred if_pred = loop_pred & (b < 5);
2818 // only call f() if at least 1 bit set
2819 if(if_pred.any()) {
2820 f(if_pred);
2821 }
2822 label1:
2823 // loop mask ANDs with inverted if-test
2824 pred else_pred = loop_pred & ~if_pred;
2825 // only call g() if at least 1 bit set
2826 if(else_pred.any()) {
2827 g(else_pred);
2828 }
2829 h(loop_pred);
2830 }
2831 ```
2832
2833 which will end up as:
2834
2835 ```
2836 # start from while loop test point
2837 b looptest
2838 while_loop:
2839 sv.cmpi CR80.v, b.v, 5 # vector compare b into CR64 Vector
2840 sv.bc/m=r30/~ALL/sz CR80.v.LT skip_f # skip when none
2841 # only calculate loop_pred & pred_b because needed in f()
2842 sv.crand CR80.v.SO, CR60.v.GT, CR80.V.LT # if = loop & pred_b
2843 f(CR80.v.SO)
2844 skip_f:
2845 # illustrate inversion of pred_b. invert r30, test ALL
2846 # rather than SOME, but masked-out zero test would FAIL,
2847 # therefore masked-out instead is tested against 1 not 0
2848 sv.bc/m=~r30/ALL/SNZ CR80.v.LT skip_g
2849 # else = loop & ~pred_b, need this because used in g()
2850 sv.crternari(A&~B) CR80.v.SO, CR60.v.GT, CR80.V.LT
2851 g(CR80.v.SO)
2852 skip_g:
2853 # conditionally call h(r30) if any loop pred set
2854 sv.bclr/m=r30/~ALL/sz BO[1]=1 h()
2855 looptest:
2856 sv.cmpi CR60.v a.v, 2 # vector compare a into CR60 vector
2857 sv.crweird r30, CR60.GT # transfer GT vector to r30
2858 sv.bc/m=r30/~ALL/sz BO[1]=1 while_loop
2859 end:
2860 ```
2861
2862 ### LRu example
2863
2864 show why LRu would be useful in a loop. Imagine the following
2865 c code:
2866
2867 ```
2868 for (int i = 0; i < 8; i++) {
2869 if (x < y) break;
2870 }
2871 ```
2872
2873 Under these circumstances exiting from the loop is not only based on
2874 CTR it has become conditional on a CR result. Thus it is desirable that
2875 NIA *and* LR only be modified if the conditions are met
2876
2877 v3.0 pseudocode for `bclrl`:
2878
2879 ```
2880 if (mode_is_64bit) then M <- 0
2881 else M <- 32
2882 if ¬BO[2] then CTR <- CTR - 1
2883 ctr_ok <- BO[2] | ((CTR[M:63] != 0) ^ BO[3])
2884 cond_ok <- BO[0] | ¬(CR[BI+32] ^ BO[1])
2885 if ctr_ok & cond_ok then NIA <-iea LR[0:61] || 0b00
2886 if LK then LR <-iea CIA + 4
2887 ```
2888
2889 the latter part for SVP64 `bclrl` becomes:
2890
2891 ```
2892 for i in 0 to VL-1:
2893 ...
2894 ...
2895 cond_ok <- BO[0] | ¬(CR[BI+32] ^ BO[1])
2896 lr_ok <- LK
2897 if ctr_ok & cond_ok then
2898 NIA <-iea LR[0:61] || 0b00
2899 if SVRMmode.LRu then lr_ok <- ¬lr_ok
2900 if lr_ok then LR <-iea CIA + 4
2901 # if NIA modified exit loop
2902 ```
2903
2904 The reason why should be clear from this being a Vector loop:
2905 unconditional destruction of LR when LK=1 makes `sv.bclrl` ineffective,
2906 because the intention going into the loop is that the branch should be to
2907 the copy of LR set at the *start* of the loop, not half way through it.
2908 However if the change to LR only occurs if the branch is taken then it
2909 becomes a useful instruction.
2910
2911 The following pseudocode should **not** be implemented because it
2912 violates the fundamental principle of SVP64 which is that SVP64 looping
2913 is a thin wrapper around Scalar Instructions. The pseducode below is
2914 more an actual Vector ISA Branch and as such is not at all appropriate:
2915
2916 ```
2917 for i in 0 to VL-1:
2918 ...
2919 ...
2920 cond_ok <- BO[0] | ¬(CR[BI+32] ^ BO[1])
2921 if ctr_ok & cond_ok then NIA <-iea LR[0:61] || 0b00
2922 # only at the end of looping is LK checked.
2923 # this completely violates the design principle of SVP64
2924 # and would actually need to be a separate (scalar)
2925 # instruction "set LR to CIA+4 but retrospectively"
2926 # which is clearly impossible
2927 if LK then LR <-iea CIA + 4
2928 ```
2929
2930 [[!tag opf_rfc]]