add mode section
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 15 Sep 2021 16:41:20 +0000 (17:41 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 15 Sep 2021 16:41:20 +0000 (17:41 +0100)
openpower/sv/normal.mdwn

index 44124a2e263655b794d71b132de55c3b6409f465..64326e24a783870ac4f645aed1c78bd1af083fc5 100644 (file)
@@ -8,6 +8,58 @@ Table of contents:
 [[!toc]]
 
 
+# Mode
+
+Mode is an augmentation of SV behaviour.  Some of these alterations are element-based (saturation), others involve post-analysis (predicate result) and others are Vector-based (mapreduce, fail-on-first).
+
+These are the modes for everything except [[sv/ldst]],
+[[sv/cr_ops]] and [[sv/branches]] which are covered separately:
+
+* **normal** mode is straight vectorisation.  no augmentations: the vector comprises an array of independently created results.
+* **ffirst** or data-dependent fail-on-first: see separate section.  the vector may be truncated depending on certain criteria.
+  *VL is altered as a result*.
+* **sat mode** or saturation: clamps each element result to a min/max rather than overflows / wraps.  allows signed and unsigned clamping for both INT
+and FP.
+* **reduce mode**. a mapreduce is performed.  the result is a scalar.  a result vector however is required, as the upper elements may be used to store intermediary computations.  the result of the mapreduce is in the first element with a nonzero predicate bit.  see [[appendix]]
+  note that there are comprehensive caveats when using this mode.
+* **pred-result** will test the result (CR testing selects a bit of CR and inverts it, just like branch testing) and if the test fails it is as if the 
+*destination* predicate bit was zero.  When Rc=1 the CR element however is still stored in the CR regfile, even if the test failed.  See appendix for details.
+
+Note that ffirst and reduce modes are not anticipated to be high-performance in some implementations.  ffirst due to interactions with VL, and reduce due to it requiring additional operations to produce a result.  normal, saturate and pred-result are however inter-element independent and may easily be parallelised to give high performance, regardless of the value of VL.
+
+The Mode table for operations except LD/ST and Branch Conditional
+ is laid out as follows:
+
+| 0-1 |  2  |  3   4  |  description              |
+| --- | --- |---------|-------------------------- |
+| 00  |   0 |  dz  sz | normal mode                      |
+| 00  |   1 | 0  RG   | scalar reduce mode (mapreduce), SUBVL=1 |
+| 00  |   1 | 1  CRM  | parallel reduce mode (mapreduce), SUBVL=1 |
+| 00  |   1 | SVM RG  | subvector reduce mode, SUBVL>1   |
+| 01  | inv | CR-bit  | Rc=1: ffirst CR sel              |
+| 01  | inv | VLi RC1 |  Rc=0: ffirst z/nonz |
+| 10  |   N | dz   sz |  sat mode: N=0/1 u/s |
+| 11  | inv | CR-bit  |  Rc=1: pred-result CR sel |
+| 11  | inv | dz  RC1 |  Rc=0: pred-result z/nonz |
+
+Fields:
+
+* **sz / dz**  if predication is enabled will put zeros into the dest (or as src in the case of twin pred) when the predicate bit is zero.  otherwise the element is ignored or skipped, depending on context.
+* **inv CR bit** just as in branches (BO) these bits allow testing of a CR bit and whether it is set (inv=0) or unset (inv=1)
+* **RG** inverts the Vector Loop order (VL-1 downto 0) rather
+than the normal 0..VL-1
+* **CRM** affects the CR on reduce mode when Rc=1
+* **SVM** sets "subvector" reduce mode
+* **N** sets signed/unsigned saturation.
+* **RC1** as if Rc=1, stores CRs *but not the result*
+* **VLi** VL inclusive: in fail-first mode, the truncation of
+  VL *includes* the current element at the failure point rather
+  than excludes it from the count.
+
+For LD/ST Modes, see [[sv/ldst]].  For Branch modes, see [[sv/branches]] Immediate and Indexed LD/ST
+are both different, in order to support a large range of features
+normally found in Vector ISAs.
+
 # Rounding, clamp and saturate
 
 see  [[av_opcodes]].
@@ -362,3 +414,4 @@ Vectorisation applies to 4-bit CR Fields which are treated as
 elements, not the individual bits of the 32-bit CR.
 CR ops and how to identify them is described in [[sv/cr_ops]]
 
+