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