[rtems-docs commit] cpu-supplement/sparc.rst: Merge Annul Slot Explanation (GCI 2018)
Joel Sherrill
joel at rtems.org
Tue Nov 20 16:37:14 UTC 2018
Module: rtems-docs
Branch: master
Commit: fdaef809d58ea959a9bdd6bcc16749000bb08279
Changeset: http://git.rtems.org/rtems-docs/commit/?id=fdaef809d58ea959a9bdd6bcc16749000bb08279
Author: zehata <zenon.hans.taneka at dhs.sg>
Date: Tue Nov 20 10:36:10 2018 -0600
cpu-supplement/sparc.rst: Merge Annul Slot Explanation (GCI 2018)
This content originated as an email response from Jiri Gaisler
to Joel Sherrill in response to a question.
---
cpu-supplement/sparc.rst | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
diff --git a/cpu-supplement/sparc.rst b/cpu-supplement/sparc.rst
index b50f8c4..45b4b40 100644
--- a/cpu-supplement/sparc.rst
+++ b/cpu-supplement/sparc.rst
@@ -436,6 +436,51 @@ User-Provided Routines
All user-provided routines invoked by RTEMS, such as user extensions, device
drivers, and MPCI routines, must also adhere to these calling conventions.
+----------------
+
+.. sidebar:: *Origin*
+
+ This SPARC Annul Slot section was originally an email from Jiri Gaisler
+ to Joel Sherrill that explained why sometimes, a single instruction
+ will not be executed, due to the Annul Slot feature.
+
+In SPARC, the default behaviour is to execute instructions after a branch.
+As with the behaviour of most RISC (Reduced Instruction Set Computer)
+machines, SPARC uses a branch delay slot. This is because completing
+an instruction every clock cycle introduces the problem that a branch
+may not be resolved until the instruction has passed through the
+pipeline. By inserting stalls, this is prevented. In each cycle, if a
+stall is inserted, it is considered one branch delay slot.
+
+For example, a regular branch instruction might look like so:
+
+.. code-block:: assembly
+
+ cmp %o4, %g4 /* if %o4 is equals to %g4 */
+ be 200fd06 /* then branch */
+ mov [%g4], %o4 /* instructions after the branch, this is a */
+ /* branch delay slot it is executed regardless */
+ /* of whether %o4 is equals to %g4 */
+
+However, if marked with "``,a``", the instructions after the branch will
+only be executed if the branch is taken. In other words, only if the
+condition before is true, then it would be executed. Otherwise if would be
+"annulled".
+
+.. code-block:: assembly
+
+ cmp %o4, %g4 /* if %o4 is equals to %g4 */
+ be,a 200fd06 /* then branch */
+ mov [%g4], %o4 /* instruction after the branch */
+
+
+The ``mov`` instruction is in a branch delay slot and is only executed
+if the branch is taken (e.g. if %o4 is equals to %g4).
+
+This shows up in analysis of coverage reports when a single instruction
+is marked unexecuted when the instruction above and below it are executed.
+
+
Memory Model
============
More information about the vc
mailing list