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