about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--archive/2024/README.md12
-rw-r--r--archive/2024/winter/.gitignore3
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.clang-format2
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.clangd2
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.gitignore3
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/LICENSE338
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/PROGRESS.md207
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/README.md88
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/AUTHORS14
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/README233
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/correlation/correlation.c163
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/correlation/correlation.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/covariance/covariance.c134
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/covariance/covariance.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/justfile30
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/2mm.c154
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/2mm.h66
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/compiler.opts1
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/3mm.c163
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/3mm.h72
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/compiler.opts1
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/atax/atax.c121
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/atax/atax.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/bicg/bicg.c137
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/bicg/bicg.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/cholesky/cholesky.c118
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/cholesky/cholesky.h48
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/doitgen/doitgen.c123
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/doitgen/doitgen.h60
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemm/gemm.c133
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemm/gemm.h60
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemver/gemver.c177
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemver/gemver.h48
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gesummv/gesummv.c140
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gesummv/gesummv.h48
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/mvt/mvt.c134
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/mvt/mvt.h48
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/symm/symm.c136
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/symm/symm.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syr2k/syr2k.c134
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syr2k/syr2k.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syrk/syrk.c118
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syrk/syrk.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trisolv/trisolv.c112
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trisolv/trisolv.h48
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trmm/trmm.c109
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trmm/trmm.h48
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/durbin/durbin.c147
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/durbin/durbin.h48
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/dynprog/dynprog.c123
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/dynprog/dynprog.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/gramschmidt/gramschmidt.c147
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/gramschmidt/gramschmidt.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/lu/lu.c104
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/lu/lu.h48
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/ludcmp/ludcmp.c156
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/ludcmp/ludcmp.h48
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/floyd-warshall/floyd-warshall.c103
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/floyd-warshall/floyd-warshall.h48
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/reg_detect/reg_detect.c147
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/reg_detect/reg_detect.h60
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/polybench.py68
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/polybench_plot.py92
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/adi/adi.c140
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/adi/adi.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-2d/fdtd-2d.c150
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-2d/fdtd-2d.h60
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-apml/fdtd-apml.c256
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-apml/fdtd-apml.h60
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-1d-imper/jacobi-1d-imper.c111
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-1d-imper/jacobi-1d-imper.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-2d-imper/jacobi-2d-imper.c114
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-2d-imper/jacobi-2d-imper.h54
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/seidel-2d/seidel-2d.c104
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/seidel-2d/seidel-2d.h54
-rwxr-xr-xarchive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/trisolvbin0 -> 10520 bytes
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/benchmark_list30
-rwxr-xr-xarchive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/create_cpped_version.sh28
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/papi_counters.list5
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/polybench.c402
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/polybench.h202
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/template-for-new-benchmark.c94
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/template-for-new-benchmark.h48
-rwxr-xr-xarchive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/time_benchmark.sh78
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/flake.lock336
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/flake.nix49
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/instruction_latency_weird.pngbin0 -> 80494 bytes
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/instructions.pngbin0 -> 55055 bytes
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/memory_latency_plot.svg1719
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions.py211
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_nocap.c90
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_nocap.s257
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_purecap.c171
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_purecap.s857
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/justfile64
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency.c76
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency_hybrid.c80
-rw-r--r--archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency_plot.py35
98 files changed, 11654 insertions, 0 deletions
diff --git a/archive/2024/README.md b/archive/2024/README.md
new file mode 100644
index 000000000..26f1995c6
--- /dev/null
+++ b/archive/2024/README.md
@@ -0,0 +1,12 @@
+# Research work artifacts in 2024
+
+## Summer semester
+
+| Student                           | Title                                                                                     | Type | Advisors                                 | Artifacts                                                     |
+| --------------------------------- | ----------------------------------------------------------------------------------------- | ---- | ---------------------------------------- | ------------------------------------------------------------- |
+| Yude Jiang               | Microarchitectural Analysis of CHERI on the Morello Platform | BA   | Martin Fink                                              |   [Source](/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform)                             |
+
+## Winter semester
+
+| Student                           | Title                                                                                     | Type | Advisors                                 | Artifacts                                                     |
+| --------------------------------- | ----------------------------------------------------------------------------------------- | ---- | ---------------------------------------- | ------------------------------------------------------------- |
diff --git a/archive/2024/winter/.gitignore b/archive/2024/winter/.gitignore
new file mode 100644
index 000000000..1da3845a7
--- /dev/null
+++ b/archive/2024/winter/.gitignore
@@ -0,0 +1,3 @@
+*.o
+__pycache__
+
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.clang-format b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.clang-format
new file mode 100644
index 000000000..84f9c6ae0
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.clang-format
@@ -0,0 +1,2 @@
+BasedOnStyle: Google
+IndentWidth: 4
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.clangd b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.clangd
new file mode 100644
index 000000000..e4b8ec693
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.clangd
@@ -0,0 +1,2 @@
+CompileFlags:
+    Add: [-xc]
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.gitignore b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.gitignore
new file mode 100644
index 000000000..f0dd30060
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/.gitignore
@@ -0,0 +1,3 @@
+*/**/output
+.zed
+.ropeproject
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/LICENSE b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/LICENSE
new file mode 100644
index 000000000..9efa6fbc9
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/LICENSE
@@ -0,0 +1,338 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Moe Ghoul>, 1 April 1989
+  Moe Ghoul, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/PROGRESS.md b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/PROGRESS.md
new file mode 100644
index 000000000..93134fb0a
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/PROGRESS.md
@@ -0,0 +1,207 @@
+## Links and Resources:
+
+- https://ctsrd-cheri.github.io/morello-early-performance-results/cover/index.html
+- https://www.cheribsd.org/tutorial/23.11/benchmark/index.html
+- https://capabilitiesforcoders.com/faq/index.html
+- https://www.bazhenov.me/posts/paired-benchmarking/
+- Neoverse N1
+- https://www.brendangregg.com/perf.html
+
+## Week 05.03.2025 - 12.03.2025
+
+
+
+## Week 05.02.2025 - 12.02.2025
+
+### TODOs:
+
+- Add Latency Tests to CVTD, maybe LDP
+- Test the assoaiated instructions as well to actually determine latency
+- Try Polybench C
+    - Compile with hybrid compiler
+        - Done
+    - Add some \_\_capability annotations
+        - probably need to inline the macros for this? Code is quite macro heavy
+    - Compile with purecap compiler
+        - Done
+
+### Challenges/Questions:
+
+- What exactly should I test using Polybench? Time? Cycles? Instructions?
+- What is PAPI?
+- Where is the mythical Postgres CHERI mentioned in the programming manual?
+
+## Week 30.01.2025 - 05.02.2025
+
+### TODOs:
+
+- Add Latency Tests to LD Instructions
+- Add Tests for and find ASM eqivalents to:
+    - cheri_address_get, cheri_base_get, cheri_length_get, cheri_offset_get, cheri_perms_get, cheri_tag_get
+    - cheri_address_set, cheri_bounds_set, cheri_perms_and, cheri_tag_clear
+- CVTD as they will most likely be used by hybrid
+
+### Challenges/Questions:
+
+- Testing Latency for LDP purecap is difficult. I can't find a good way to introduce a Data Dependency. If necessary, I could just test it in Hybrid Mode.
+
+### Results:
+
+- Added LDR_CAP, LDP_CAP Latency tests
+- Consistent Latency of 4 cycles for all of them
+
+| Instruction | Metric  | Capability | Cycles/Instruction | Instructions/Cycle  |
+| ----------- | ------- | ---------- | ------------------ | ------------------- |
+| LDR         | LATENCY | PURECAP    | 4.002747679312501  | 0.2498283879267046  |
+| LDR_CAP     | LATENCY | PURECAP    | 4.003325177874999  | 0.24979234900193867 |
+| LDP_CAP     | LATENCY | PURECAP    | 4.002923937312500  | 0.24981738740491385 |
+
+## Week 23.01.2025 - 29.01.2025
+
+### TODOs:
+
+- Restructure Latency and throughput tests. Make it easier to add new ones.
+- Cheri specific instructions
+
+### Results:
+
+- Changed test structure, split instructions.c file into nocap and purecap. Python script is now more configurable.
+- Added LDR_CAP, LDP, LDP_CAP, STP, STP_CAP. Only Throughput so far.
+- Interesting results when looking at STP and STP_CAP.
+
+    - Results somewhat correspond with results discussed in https://ctsrd-cheri.github.io/morello-early-performance-results/performance-methodology/morello-microarchitectural-limitations.html
+
+    | instruction | metric     | capabillity | cycles/instruction | instructions/cycle  |
+    | ----------- | ---------- | ----------- | ------------------ | ------------------- |
+    | LDR         | LATENCY    | PURECAP     | 4.003302436625     | 0.2497937679779832  |
+    | LDR         | THROUGHPUT | PURECAP     | 0.5006907406875    | 1.9972408489657647  |
+    | STR         | THROUGHPUT | PURECAP     | 0.503850282625     | 1.9847165606221735  |
+    | LDAR        | THROUGHPUT | PURECAP     | 0.50074740225      | 1.9970148532108534  |
+    | STLR        | THROUGHPUT | PURECAP     | 0.5013126245624999 | 1.9947632495246037  |
+    | LDR_CAP     | THROUGHPUT | PURECAP     | 0.5009836686249999 | 1.9960730511327858  |
+    | LDP         | THROUGHPUT | PURECAP     | 1.0011793094375    | 0.9988220796950321  |
+    | LDP_CAP     | THROUGHPUT | PURECAP     | 1.0012018573750001 | 0.9987995853521974  |
+    | STP         | THROUGHPUT | PURECAP     | 3.0023033595624997 | 0.3330776008410161  |
+    | STP_CAP     | THROUGHPUT | PURECAP     | 6.003304391375     | 0.16657492854047326 |
+    | LDR         | LATENCY    | NOCAP       | 4.003402525437499  | 0.24978752289984085 |
+    | LDR         | THROUGHPUT | NOCAP       | 0.5006485694999999 | 1.9974090827797724  |
+    | STR         | THROUGHPUT | NOCAP       | 0.5039982210625    | 1.9841339874014983  |
+    | LDAR        | THROUGHPUT | NOCAP       | 0.500702752875     | 1.9971929338476178  |
+    | STLR        | THROUGHPUT | NOCAP       | 0.501135059        | 1.995470047526649   |
+
+## Week 16.01.2025 - 22.01.2025
+
+### TODOs:
+
+- Add more latency/throughput tests
+- Test branch prediction
+
+### Challenges/Questions
+
+- Current test framewrok structure is too generalized, makes it harder to add new tests.
+- Introducing Data Dependencies for Latency tests can be challenging (LDAR)
+- CPYM/CPYP does not exist.
+- LDR loading 64bit vs 128bit cap poitner might be different. (Look at STP LDP)
+
+### Results:
+
+- LDAR and STLR are in, seem pretty similar to the others
+
+## Week 15.01.2025-22.01.2025
+
+### TODOs:
+
+- DO the other instructions
+- Branching, capability branch, manually check and strip.
+
+## Week 09.01.2025-15.01.2025
+
+### TODOs:
+
+- finish instruction latency tests
+- look into how to test the branch prediction
+
+### Questions:
+
+- How should I plot this data?
+- What other instructions need to be tested?
+
+### Results:
+
+- str and ldr cycle tests work! ignore str latency
+  ![terminal output showing 0.5 cycles per instruction for both str and ldr](./images/instructions.png)
+- Purecap and Nocap show no difference (ldr 4 cycle latency)
+
+## Week 01.01.2025 - 08.01.2025
+
+### TODOs:
+
+- Update memory latency tests for purecap
+- Write instruction latency tests
+
+### Challenges/Questions:
+
+- As we are using purecap musl libc for purecap, would it make sense to also statically link musl libc for the hybrid binary, as to avoid accidentally measuring glibc vs musl libc perf differences?
+- What about dynamic clock speeds?
+- Why not just use perf? at least for cycles per instruction.
+- Assembly is really hard. Especially if you don't know the ABI.
+- The idea that could not be executed:
+    - Use perf to measure cycles, orchestrated from a python script.
+    - For each instruction, run main once with iteration = 0. Count the cycles = base_cycles.
+    - Run main with x iterations. Count cycles again = total_instruction_cycles.
+    - Get cycles per instruction by: total_instruction_cycles / iterations - base_cycles
+
+### Results:
+
+![plot](./images/memory_latency_plot.svg)
+
+- Memory latency test now runs nocap, hybrid and purecap
+
+## Week 4.12.2024 - 11.12.2024
+
+### TODOs:
+
+- See if purecap works now. If not, try the Hybrid-ABI.
+- Visualization. I'm thinking of keeping the justfile as main orchestration, but running visualizations optionally via python.
+- Read morello ISA
+- Write Instruction Latency/Cycle tests (LDR, STR, LDAR, STLR, LDAXR, STLXR, PUSH, POP, PRFM )
+- Research paired benchmarking. Discuss with supervisors.
+
+### Challenges/Questions:
+
+- cheri.h does not compile
+- Where is vaddr_t?
+- What is the significance of memory latency data? How could accuracy be improved?
+- Does hybrid vs purecap make a difference?
+- How do the instruction cycle tests work? How is clkspeed determined?
+
+### Results:
+
+- Got memory latency running on morello hybrid!
+- Memory latency tests comparisons are pretty inconsistent. More precision/analysis needed.
+
+## Week 27.11.2024 - 03.12.2024
+
+### TODOs (not ordered):
+
+- Run memory latency test on morello. Do they still work? Do results differ based on ABI/compiler?
+- Find better way to orchestrate tests. Better Justfile? Rust? ZIG??
+    - build two binaries, with cap or nocap
+- Visualization. Possibly Python + Matplotlib, perhaps Rust if a different orchestration method is chosen.
+- Read morello ISA, deepen understanding of relevant Instructions
+- Write Instruction Latency/Cycle tests
+
+### Challenges/Questions:
+
+- clang-morello is barely documented, some clang args don't work
+- could not find way to discern a cap binary from a nocap binary (tried file and llvm-readelf)
+- "-mabi=purecap" does not compile. Issues with stdio.h/glibc.
+- Compiling purecap/nocap binaries does not work? Resulting binaries stay the same
+
+### Results:
+
+- Got clang-morello working (Thank you Martin!)
+- Preliminary run of memory latency test with caps
+    - Still runs without problems
+    - No easily visible differences, but needs more precise investigation
+- Justfile updated to support purecap/nocap (but does not produce different binaries)
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/README.md b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/README.md
new file mode 100644
index 000000000..9dee75bcc
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/README.md
@@ -0,0 +1,88 @@
+# CHERI Microanalysis
+
+This project contains a suite of microbenchmarks for analyzing performance characteristics of CHERI (Capability Hardware Enhanced RISC Instructions) on Morello hardware. It focuses on two main areas:
+
+1. Instruction-level benchmarks
+2. Memory access latency benchmarks
+3. Application-level benchmarks using Polybench/C
+
+## Project Structure
+
+```
+cheri-microanalysis/
+├── instructions/         # Instruction-level benchmarking
+├── memory_latency/      # Memory access latency analysis
+├── applications/        # Application-level benchmarks
+└── flake.nix           # Development environment setup
+```
+
+## Components
+
+### Instructions Benchmark
+
+Tests performance characteristics of various CHERI instructions, measuring both latency and throughput:
+- Regular load/store operations (LDR, STR)
+- Capability load/store operations (LDR.CAP, STR.CAP)
+- Pair operations (LDP, STP)
+- Atomic operations (LDAR, STLR)
+- Capability manipulation instructions (CVTD, CFHI, CTHI, etc.)
+
+### Memory Latency Benchmark
+
+Measures memory access latency across different working set sizes to analyze:
+- Cache hierarchy performance
+- Impact of capability overhead on memory access
+
+### Polybench Applications
+
+Runs the Polybench/C benchmark suite compiled for:
+- Regular AArch64 (nocap)
+- Pure-capability CHERI (purecap)
+
+Includes various computational kernels:
+- Linear algebra computations
+- Stencil computations
+- Data mining
+- Dynamic programming
+
+## Usage
+
+The project uses `just` as its command runner. Key commands:
+
+```bash
+# Build and run all benchmarks
+just run_all
+
+# Build and run specific benchmark
+just run_memory_latency # Or instructions/applications
+
+# Build specific benchmark
+just build_memory_latency # Or instructions/applications
+
+# Plot benchmark results. Only possible after run!
+just plot_memory_latency # Or applications
+
+```
+
+## Development Environment
+
+The project uses Nix flakes to provide a reproducible development environment with:
+- CHERI-aware LLVM/Clang
+- CHERI-MUSL C library
+- Python with data analysis packages
+- Build tools and utilities
+
+To enter the development environment:
+
+```bash
+nix develop
+```
+
+## Results
+
+The benchmarks generate CSV/TEX files and SVG plots showing:
+- Instruction latency and throughput metrics
+- Memory access latency curves
+- Application performance comparisons between regular and CHERI versions
+
+Results are generated in each component's respective output directory.
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/AUTHORS b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/AUTHORS
new file mode 100644
index 000000000..62ea0bd4a
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/AUTHORS
@@ -0,0 +1,14 @@
+* * * * * * * * * * * * *
+* Authors of PolyBench  *
+* * * * * * * * * * * * *
+
+
+* Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+  Who provided packaging and harmonization of all test files,
+  the PolyBench infrastructure and machinery, and several
+  reference C files.
+
+* Uday Bondugula <uday@csa.iisc.ernet.in>
+  Who provided many of the original reference C files, including
+  Fortran to C translation.
+
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/README b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/README
new file mode 100644
index 000000000..dc350515d
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/README
@@ -0,0 +1,233 @@
+* * * * * * * * * *
+* PolyBench/C 3.2 *
+* * * * * * * * * *
+
+Copyright (c) 2011-2012 the Ohio State University.
+Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+
+
+-------------
+* New in 3.2:
+-------------
+
+- Rename the package to PolyBench/C, to prepare for the upcoming
+  PolyBench/Fortran and PolyBench/GPU.
+- Fixed a typo in polybench.h, causing compilation problems for 5D arrays.
+- Fixed minor typos in correlation, atax, cholesky, fdtd-2d.
+- Added an option to build the test suite with constant loop bounds
+  (default is parametric loop bounds)
+
+
+-------------
+* New in 3.1:
+-------------
+
+- Fixed a typo in polybench.h, causing compilation problems for 3D arrays.
+- Set by default heap arrays, stack arrays are now optional.
+
+
+-------------
+* New in 3.0:
+-------------
+
+- Multiple dataset sizes are predefined. Each file comes now with a .h
+  header file defining the dataset.
+- Support of heap-allocated arrays. It uses a single malloc for the
+  entire array region, the data allocated is cast into a C99
+  multidimensional array.
+- One benchmark is out: gauss_filter
+- One benchmark is in: floyd-warshall
+- PAPI support has been greatly improved; it also can report the
+  counters on a specific core to be set by the user.
+
+
+
+----------------
+* Mailing lists:
+----------------
+
+** polybench-announces@lists.sourceforge.net:
+---------------------------------------------
+
+Announces about releases of PolyBench.
+
+** polybench-discussion@lists.sourceforge.net:
+----------------------------------------------
+
+General discussions reg. PolyBench.
+
+
+
+-----------------------
+* Available benchmarks:
+-----------------------
+
+::linear-algebra::
+linear-algebra/kernels:
+linear-algebra/kernels/2mm/2mm.c
+linear-algebra/kernels/3mm/3mm.c
+linear-algebra/kernels/atax/atax.c
+linear-algebra/kernels/bicg/bicg.c
+linear-algebra/kernels/cholesky/cholesky.c
+linear-algebra/kernels/doitgen/doitgen.c
+linear-algebra/kernels/gemm/gemm.c
+linear-algebra/kernels/gemver/gemver.c
+linear-algebra/kernels/gesummv/gesummv.c
+linear-algebra/kernels/mvt/mvt.c
+linear-algebra/kernels/symm/symm.c
+linear-algebra/kernels/syr2k/syr2k.c
+linear-algebra/kernels/syrk/syrk.c
+linear-algebra/kernels/trisolv/trisolv.c
+linear-algebra/kernels/trmm/trmm.c
+
+linear-algebra/solvers:
+linear-algebra/solvers/durbin/durbin.c
+linear-algebra/solvers/dynprog/dynprog.c
+linear-algebra/solvers/gramschmidt/gramschmidt.c
+linear-algebra/solvers/lu/lu.c
+linear-algebra/solvers/ludcmp/ludcmp.c
+
+::datamining::
+datamining/correlation/correlation.c
+datamining/covariance/covariance.c
+
+::medley::
+medley/floyd-warshall/floyd-warshall.c
+medley/reg_detect/reg_detect.c
+
+::stencils::
+stencils/adi/adi.c
+stencils/fdtd-2d/fdtd-2d.c
+stencils/fdtd-apml/fdtd-apml.c
+stencils/jacobi-1d-imper/jacobi-1d-imper.c
+stencils/jacobi-2d-imper/jacobi-2d-imper.c
+stencils/seidel-2d/seidel-2d.c
+
+
+
+------------------------------
+* Sample compilation commands:
+------------------------------
+
+
+** To compile a benchmark without any monitoring:
+-------------------------------------------------
+
+$> gcc -I utilities -I linear-algebra/kernels/atax utilities/polybench.c linear-algebra/kernels/atax/atax.c -o atax_base
+
+
+** To compile a benchmark with execution time reporting:
+--------------------------------------------------------
+
+$> gcc -O3 -I utilities -I linear-algebra/kernels/atax utilities/polybench.c linear-algebra/kernels/atax/atax.c -DPOLYBENCH_TIME -o atax_time
+
+
+** To generate the reference output of a benchmark:
+---------------------------------------------------
+
+$> gcc -O0 -I utilities -I linear-algebra/kernels/atax utilities/polybench.c linear-algebra/kernels/atax/atax.c -DPOLYBENCH_DUMP_ARRAYS -o atax_ref
+$> ./atax_ref 2>atax_ref.out
+
+
+
+
+-------------------------
+* Some available options:
+-------------------------
+
+They are all passed as macro definitions during compilation time (e.g,
+-Dname_of_the_option).
+
+- POLYBENCH_TIME: output execution time (gettimeofday) [default: off]
+
+- POLYBENCH_NO_FLUSH_CACHE: don't flush the cache before calling the
+  timer [default: flush the cache]
+
+- POLYBENCH_LINUX_FIFO_SCHEDULER: use FIFO real-time scheduler for the
+  kernel execution, the program must be run as root, under linux only,
+  and compiled with -lc [default: off]
+
+- POLYBENCH_CACHE_SIZE_KB: cache size to flush, in kB [default: 33MB]
+
+- POLYBENCH_STACK_ARRAYS: use stack allocation instead of malloc [default: off]
+
+- POLYBENCH_DUMP_ARRAYS: dump all live-out arrays on stderr [default: off]
+
+- POLYBENCH_CYCLE_ACCURATE_TIMER: Use Time Stamp Counter to monitor
+  the execution time of the kernel [default: off]
+
+- POLYBENCH_PAPI: turn on papi timing (see below).
+
+- MINI_DATASET, SMALL_DATASET, STANDARD_DATASET, LARGE_DATASET,
+  EXTRALARGE_DATASET: set the dataset size to be used
+  [default: STANDARD_DATASET]
+
+- POLYBENCH_USE_C99_PROTO: Use standard C99 prototype for the functions.
+
+- POLYBENCH_USE_SCALAR_LB: Use scalar loop bounds instead of parametric ones.
+
+
+
+---------------
+* PAPI support:
+---------------
+
+** To compile a benchmark with PAPI support:
+--------------------------------------------
+
+$> gcc -O3 -I utilities -I linear-algebra/kernels/atax utilities/polybench.c linear-algebra/kernels/atax/atax.c -DPOLYBENCH_PAPI -lpapi -o atax_papi
+
+
+** To specify which counter(s) to monitor:
+------------------------------------------
+
+Edit utilities/papi_counters.list, and add 1 line per event to
+monitor. Each line (including the last one) must finish with a ',' and
+both native and standard events are supported.
+
+The whole kernel is run one time per counter (no multiplexing) and
+there is no sampling being used for the counter value.
+
+
+
+------------------------------
+* Accurate performance timing:
+------------------------------
+
+With kernels that have an execution time in the orders of a few tens
+of milliseconds, it is critical to validate any performance number by
+repeating several times the experiment. A companion script is
+available to perform reasonable performance measurement of a PolyBench.
+
+$> gcc -O3 -I utilities -I linear-algebra/kernels/atax utilities/polybench.c linear-algebra/kernels/atax/atax.c -DPOLYBENCH_TIME -o atax_time
+$> ./utilities/time_benchmark.sh ./atax_time
+
+This script will run five times the benchmark (that must be a
+PolyBench compiled with -DPOLYBENCH_TIME), eliminate the two extremal
+times, and check that the deviation of the three remaining does not
+exceed a given threshold, set to 5%.
+
+It is also possible to use POLYBENCH_CYCLE_ACCURATE_TIMER to use the
+Time Stamp Counter instead of gettimeofday() to monitor the number of
+elapsed cycles.
+
+
+
+
+----------------------------------------
+* Generating macro-free benchmark suite:
+----------------------------------------
+
+(from the root of the archive:)
+$> PARGS="-I utilities -DPOLYBENCH_TIME";
+$> for i in `cat utilities/benchmark_list`; do create_cpped_version.sh $i "$PARGS"; done
+
+This create for each benchmark file 'xxx.c' a new file
+'xxx.preproc.c'. The PARGS variable in the above example can be set to
+the desired configuration, for instance to create a full C99 version
+(parametric arrays):
+
+$> PARGS="-I utilities -DPOLYBENCH_USE_C99_PROTO";
+$> for i in `cat utilities/benchmark_list`; do ./utilities/create_cpped_version.sh "$i" "$PARGS"; done
+
+
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/correlation/correlation.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/correlation/correlation.c
new file mode 100644
index 000000000..dbf3161e6
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/correlation/correlation.c
@@ -0,0 +1,163 @@
+/**
+ * correlation.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "correlation.h"
+
+
+/* Array initialization. */
+static
+void init_array (int m,
+		 int n,
+		 DATA_TYPE *float_n,
+		 DATA_TYPE POLYBENCH_2D(data,M,N,m,n))
+{
+  int i, j;
+
+  *float_n = 1.2;
+
+  for (i = 0; i < m; i++)
+    for (j = 0; j < n; j++)
+      data[i][j] = ((DATA_TYPE) i*j) / M;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int m,
+		 DATA_TYPE POLYBENCH_2D(symmat,M,M,m,m))
+
+{
+  int i, j;
+
+  for (i = 0; i < m; i++)
+    for (j = 0; j < m; j++) {
+      fprintf (stderr, DATA_PRINTF_MODIFIER, symmat[i][j]);
+      if ((i * m + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_correlation(int m, int n,
+			DATA_TYPE float_n,
+			DATA_TYPE POLYBENCH_2D(data,M,N,m,n),
+			DATA_TYPE POLYBENCH_2D(symmat,M,M,m,m),
+			DATA_TYPE POLYBENCH_1D(mean,M,m),
+			DATA_TYPE POLYBENCH_1D(stddev,M,m))
+{
+  int i, j, j1, j2;
+
+  DATA_TYPE eps = 0.1f;
+
+#define sqrt_of_array_cell(x,j) sqrt(x[j])
+
+#pragma scop
+  /* Determine mean of column vectors of input data matrix */
+  for (j = 0; j < _PB_M; j++)
+    {
+      mean[j] = 0.0;
+      for (i = 0; i < _PB_N; i++)
+	mean[j] += data[i][j];
+      mean[j] /= float_n;
+    }
+
+  /* Determine standard deviations of column vectors of data matrix. */
+  for (j = 0; j < _PB_M; j++)
+    {
+      stddev[j] = 0.0;
+      for (i = 0; i < _PB_N; i++)
+	stddev[j] += (data[i][j] - mean[j]) * (data[i][j] - mean[j]);
+      stddev[j] /= float_n;
+      stddev[j] = sqrt_of_array_cell(stddev, j);
+      /* The following in an inelegant but usual way to handle
+	 near-zero std. dev. values, which below would cause a zero-
+	 divide. */
+      stddev[j] = stddev[j] <= eps ? 1.0 : stddev[j];
+    }
+
+  /* Center and reduce the column vectors. */
+  for (i = 0; i < _PB_N; i++)
+    for (j = 0; j < _PB_M; j++)
+      {
+	data[i][j] -= mean[j];
+	data[i][j] /= sqrt(float_n) * stddev[j];
+      }
+
+  /* Calculate the m * m correlation matrix. */
+  for (j1 = 0; j1 < _PB_M-1; j1++)
+    {
+      symmat[j1][j1] = 1.0;
+      for (j2 = j1+1; j2 < _PB_M; j2++)
+	{
+	  symmat[j1][j2] = 0.0;
+	  for (i = 0; i < _PB_N; i++)
+	    symmat[j1][j2] += (data[i][j1] * data[i][j2]);
+	  symmat[j2][j1] = symmat[j1][j2];
+	}
+    }
+  symmat[_PB_M-1][_PB_M-1] = 1.0;
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+  int m = M;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE float_n;
+  POLYBENCH_2D_ARRAY_DECL(data,DATA_TYPE,M,N,m,n);
+  POLYBENCH_2D_ARRAY_DECL(symmat,DATA_TYPE,M,M,m,m);
+  POLYBENCH_1D_ARRAY_DECL(mean,DATA_TYPE,M,m);
+  POLYBENCH_1D_ARRAY_DECL(stddev,DATA_TYPE,M,m);
+
+  /* Initialize array(s). */
+  init_array (m, n, &float_n, POLYBENCH_ARRAY(data));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_correlation (m, n, float_n,
+		      POLYBENCH_ARRAY(data),
+		      POLYBENCH_ARRAY(symmat),
+		      POLYBENCH_ARRAY(mean),
+		      POLYBENCH_ARRAY(stddev));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(m, POLYBENCH_ARRAY(symmat)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(data);
+  POLYBENCH_FREE_ARRAY(symmat);
+  POLYBENCH_FREE_ARRAY(mean);
+  POLYBENCH_FREE_ARRAY(stddev);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/correlation/correlation.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/correlation/correlation.h
new file mode 100644
index 000000000..d3854dd6d
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/correlation/correlation.h
@@ -0,0 +1,54 @@
+/**
+ * correlation.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef CORRELATION_H
+# define CORRELATION_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(N) && !defined(M)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#   define M 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 500
+#   define M 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 1000
+#   define M 1000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 2000
+#   define M 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 4000
+#   define M 4000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+# define _PB_M POLYBENCH_LOOP_BOUND(M,m)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !CORRELATION_H */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/covariance/covariance.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/covariance/covariance.c
new file mode 100644
index 000000000..9a5bfbf87
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/covariance/covariance.c
@@ -0,0 +1,134 @@
+/**
+ * covariance.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "covariance.h"
+
+
+/* Array initialization. */
+static
+void init_array (int m, int n,
+		 DATA_TYPE *float_n,
+		 DATA_TYPE POLYBENCH_2D(data,M,N,m,n))
+{
+  int i, j;
+
+  *float_n = 1.2;
+
+  for (i = 0; i < M; i++)
+    for (j = 0; j < N; j++)
+      data[i][j] = ((DATA_TYPE) i*j) / M;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int m,
+		 DATA_TYPE POLYBENCH_2D(symmat,M,M,m,m))
+
+{
+  int i, j;
+
+  for (i = 0; i < m; i++)
+    for (j = 0; j < m; j++) {
+      fprintf (stderr, DATA_PRINTF_MODIFIER, symmat[i][j]);
+      if ((i * m + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_covariance(int m, int n,
+		       DATA_TYPE float_n,
+		       DATA_TYPE POLYBENCH_2D(data,M,N,m,n),
+		       DATA_TYPE POLYBENCH_2D(symmat,M,M,m,m),
+		       DATA_TYPE POLYBENCH_1D(mean,M,m))
+{
+  int i, j, j1, j2;
+
+#pragma scop
+  /* Determine mean of column vectors of input data matrix */
+  for (j = 0; j < _PB_M; j++)
+    {
+      mean[j] = 0.0;
+      for (i = 0; i < _PB_N; i++)
+        mean[j] += data[i][j];
+      mean[j] /= float_n;
+    }
+
+  /* Center the column vectors. */
+  for (i = 0; i < _PB_N; i++)
+    for (j = 0; j < _PB_M; j++)
+      data[i][j] -= mean[j];
+
+  /* Calculate the m * m covariance matrix. */
+  for (j1 = 0; j1 < _PB_M; j1++)
+    for (j2 = j1; j2 < _PB_M; j2++)
+      {
+        symmat[j1][j2] = 0.0;
+        for (i = 0; i < _PB_N; i++)
+	  symmat[j1][j2] += data[i][j1] * data[i][j2];
+        symmat[j2][j1] = symmat[j1][j2];
+      }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+  int m = M;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE float_n;
+  POLYBENCH_2D_ARRAY_DECL(data,DATA_TYPE,M,N,m,n);
+  POLYBENCH_2D_ARRAY_DECL(symmat,DATA_TYPE,M,M,m,m);
+  POLYBENCH_1D_ARRAY_DECL(mean,DATA_TYPE,M,m);
+
+
+  /* Initialize array(s). */
+  init_array (m, n, &float_n, POLYBENCH_ARRAY(data));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_covariance (m, n, float_n,
+		     POLYBENCH_ARRAY(data),
+		     POLYBENCH_ARRAY(symmat),
+		     POLYBENCH_ARRAY(mean));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(m, POLYBENCH_ARRAY(symmat)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(data);
+  POLYBENCH_FREE_ARRAY(symmat);
+  POLYBENCH_FREE_ARRAY(mean);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/covariance/covariance.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/covariance/covariance.h
new file mode 100644
index 000000000..7f63a94c9
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/datamining/covariance/covariance.h
@@ -0,0 +1,54 @@
+/**
+ * covariance.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef COVARIANCE_H
+# define COVARIANCE_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(N) && !defined(M)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#   define M 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 500
+#   define M 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 1000
+#   define M 1000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 2000
+#   define M 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 4000
+#   define M 4000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+# define _PB_M POLYBENCH_LOOP_BOUND(M,m)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !COVARIANCE_H */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/justfile b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/justfile
new file mode 100644
index 000000000..a17365f96
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/justfile
@@ -0,0 +1,30 @@
+# Common flags for both variants
+common_flags := "-O2 -lm"
+
+# Specific flags for each variant
+purecap_flags := "--target=aarch64-unknown-linux-musl_purecap -mabi=purecap -march=morello -fuse-ld=lld -nostdinc --sysroot $MUSL_PATH/ -isystem $MUSL_PATH/include -L$MUSL_PATH/lib -static -I\"$LLVM_PATH/lib/clang/14.0.0/include\""
+nocap_flags := ""
+hybrid_flags := "-march=morello -Wcheri"
+
+bench_flag := "-DPOLYBENCH_TIME"
+
+plot:
+    python ./polybench_plot.py ./output/polybench.csv
+
+run: build
+    python ./polybench.py > ./output/polybench.csv
+
+build: clean
+    #!/usr/bin/env bash
+    while read -r bench_path; do
+        just build_bench $bench_path
+    done < "utilities/benchmark_list"
+
+
+build_bench bench_path:
+    env -i $CLANG_HYBRID_PATH {{common_flags}} {{nocap_flags}} -I utilities -I {{parent_dir(bench_path)}} utilities/polybench.c {{bench_path}}  {{bench_flag}} -o ./output/{{file_stem(bench_path)}}_nocap
+    $CLANG_PURECAP_PATH {{common_flags}} {{purecap_flags}} -I utilities -I {{parent_dir(bench_path)}} utilities/polybench.c {{bench_path}}  {{bench_flag}} -o ./output/{{file_stem(bench_path)}}_purecap
+
+clean:
+    rm -rf ./output
+    mkdir ./output
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/2mm.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/2mm.c
new file mode 100644
index 000000000..740b2ff1c
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/2mm.c
@@ -0,0 +1,154 @@
+/**
+ * 2mm.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "2mm.h"
+
+
+/* Array initialization. */
+static
+void init_array(int ni, int nj, int nk, int nl,
+		DATA_TYPE *alpha,
+		DATA_TYPE *beta,
+		DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nl),
+		DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj),
+		DATA_TYPE POLYBENCH_2D(C,NL,NJ,nl,nj),
+		DATA_TYPE POLYBENCH_2D(D,NI,NL,ni,nl))
+{
+  int i, j;
+
+  *alpha = 32412;
+  *beta = 2123;
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nk; j++)
+      A[i][j] = ((DATA_TYPE) i*j) / ni;
+  for (i = 0; i < nk; i++)
+    for (j = 0; j < nj; j++)
+      B[i][j] = ((DATA_TYPE) i*(j+1)) / nj;
+  for (i = 0; i < nl; i++)
+    for (j = 0; j < nj; j++)
+      C[i][j] = ((DATA_TYPE) i*(j+3)) / nl;
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nl; j++)
+      D[i][j] = ((DATA_TYPE) i*(j+2)) / nk;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int ni, int nl,
+		 DATA_TYPE POLYBENCH_2D(D,NI,NL,ni,nl))
+{
+  int i, j;
+
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nl; j++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, D[i][j]);
+	if ((i * ni + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_2mm(int ni, int nj, int nk, int nl,
+		DATA_TYPE alpha,
+		DATA_TYPE beta,
+		DATA_TYPE POLYBENCH_2D(tmp,NI,NJ,ni,nj),
+		DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nk),
+		DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj),
+		DATA_TYPE POLYBENCH_2D(C,NL,NJ,nl,nj),
+		DATA_TYPE POLYBENCH_2D(D,NI,NL,ni,nl))
+{
+  int i, j, k;
+
+#pragma scop
+  /* D := alpha*A*B*C + beta*D */
+  for (i = 0; i < _PB_NI; i++)
+    for (j = 0; j < _PB_NJ; j++)
+      {
+	tmp[i][j] = 0;
+	for (k = 0; k < _PB_NK; ++k)
+	  tmp[i][j] += alpha * A[i][k] * B[k][j];
+      }
+  for (i = 0; i < _PB_NI; i++)
+    for (j = 0; j < _PB_NL; j++)
+      {
+	D[i][j] *= beta;
+	for (k = 0; k < _PB_NJ; ++k)
+	  D[i][j] += tmp[i][k] * C[k][j];
+      }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int ni = NI;
+  int nj = NJ;
+  int nk = NK;
+  int nl = NL;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE alpha;
+  DATA_TYPE beta;
+  POLYBENCH_2D_ARRAY_DECL(tmp,DATA_TYPE,NI,NJ,ni,nj);
+  POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NI,NK,ni,nk);
+  POLYBENCH_2D_ARRAY_DECL(B,DATA_TYPE,NK,NJ,nk,nj);
+  POLYBENCH_2D_ARRAY_DECL(C,DATA_TYPE,NL,NJ,nl,nj);
+  POLYBENCH_2D_ARRAY_DECL(D,DATA_TYPE,NI,NL,ni,nl);
+
+  /* Initialize array(s). */
+  init_array (ni, nj, nk, nl, &alpha, &beta,
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(B),
+	      POLYBENCH_ARRAY(C),
+	      POLYBENCH_ARRAY(D));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_2mm (ni, nj, nk, nl,
+	      alpha, beta,
+	      POLYBENCH_ARRAY(tmp),
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(B),
+	      POLYBENCH_ARRAY(C),
+	      POLYBENCH_ARRAY(D));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(ni, nl,  POLYBENCH_ARRAY(D)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(tmp);
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(B);
+  POLYBENCH_FREE_ARRAY(C);
+  POLYBENCH_FREE_ARRAY(D);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/2mm.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/2mm.h
new file mode 100644
index 000000000..51c10611f
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/2mm.h
@@ -0,0 +1,66 @@
+/**
+ * 2mm.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef _2MM_H
+# define _2MM_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NI) && !defined(NJ) && !defined(NK)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NI 32
+#   define NJ 32
+#   define NK 32
+#   define NL 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NI 128
+#   define NJ 128
+#   define NK 128
+#   define NL 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NI 1024
+#   define NJ 1024
+#   define NK 1024
+#   define NL 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NI 2000
+#   define NJ 2000
+#   define NK 2000
+#   define NL 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NI 4000
+#   define NJ 4000
+#   define NK 4000
+#   define NL 4000
+#  endif
+# endif /* !N */
+
+# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni)
+# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj)
+# define _PB_NK POLYBENCH_LOOP_BOUND(NK,nk)
+# define _PB_NL POLYBENCH_LOOP_BOUND(NL,nl)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !_2MM */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/compiler.opts b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/compiler.opts
new file mode 100644
index 000000000..483defa80
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/2mm/compiler.opts
@@ -0,0 +1 @@
+-DNI=1024 -DNJ=1024 -DNK=1024 -DNL=1024
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/3mm.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/3mm.c
new file mode 100644
index 000000000..32bdb4493
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/3mm.c
@@ -0,0 +1,163 @@
+/**
+ * 3mm.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "3mm.h"
+
+
+/* Array initialization. */
+static
+void init_array(int ni, int nj, int nk, int nl, int nm,
+		DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nk),
+		DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj),
+		DATA_TYPE POLYBENCH_2D(C,NJ,NM,nj,nm),
+		DATA_TYPE POLYBENCH_2D(D,NM,NL,nm,nl))
+{
+  int i, j;
+
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nk; j++)
+      A[i][j] = ((DATA_TYPE) i*j) / ni;
+  for (i = 0; i < nk; i++)
+    for (j = 0; j < nj; j++)
+      B[i][j] = ((DATA_TYPE) i*(j+1)) / nj;
+  for (i = 0; i < nj; i++)
+    for (j = 0; j < nm; j++)
+      C[i][j] = ((DATA_TYPE) i*(j+3)) / nl;
+  for (i = 0; i < nm; i++)
+    for (j = 0; j < nl; j++)
+      D[i][j] = ((DATA_TYPE) i*(j+2)) / nk;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int ni, int nl,
+		 DATA_TYPE POLYBENCH_2D(G,NI,NL,ni,nl))
+{
+  int i, j;
+
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nl; j++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, G[i][j]);
+	if ((i * ni + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_3mm(int ni, int nj, int nk, int nl, int nm,
+		DATA_TYPE POLYBENCH_2D(E,NI,NJ,ni,nj),
+		DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nk),
+		DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj),
+		DATA_TYPE POLYBENCH_2D(F,NJ,NL,nj,nl),
+		DATA_TYPE POLYBENCH_2D(C,NJ,NM,nj,nm),
+		DATA_TYPE POLYBENCH_2D(D,NM,NL,nm,nl),
+		DATA_TYPE POLYBENCH_2D(G,NI,NL,ni,nl))
+{
+  int i, j, k;
+
+#pragma scop
+  /* E := A*B */
+  for (i = 0; i < _PB_NI; i++)
+    for (j = 0; j < _PB_NJ; j++)
+      {
+	E[i][j] = 0;
+	for (k = 0; k < _PB_NK; ++k)
+	  E[i][j] += A[i][k] * B[k][j];
+      }
+  /* F := C*D */
+  for (i = 0; i < _PB_NJ; i++)
+    for (j = 0; j < _PB_NL; j++)
+      {
+	F[i][j] = 0;
+	for (k = 0; k < _PB_NM; ++k)
+	  F[i][j] += C[i][k] * D[k][j];
+      }
+  /* G := E*F */
+  for (i = 0; i < _PB_NI; i++)
+    for (j = 0; j < _PB_NL; j++)
+      {
+	G[i][j] = 0;
+	for (k = 0; k < _PB_NJ; ++k)
+	  G[i][j] += E[i][k] * F[k][j];
+      }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int ni = NI;
+  int nj = NJ;
+  int nk = NK;
+  int nl = NL;
+  int nm = NM;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(E, DATA_TYPE, NI, NJ, ni, nj);
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, NI, NK, ni, nk);
+  POLYBENCH_2D_ARRAY_DECL(B, DATA_TYPE, NK, NJ, nk, nj);
+  POLYBENCH_2D_ARRAY_DECL(F, DATA_TYPE, NJ, NL, nj, nl);
+  POLYBENCH_2D_ARRAY_DECL(C, DATA_TYPE, NJ, NM, nj, nm);
+  POLYBENCH_2D_ARRAY_DECL(D, DATA_TYPE, NM, NL, nm, nl);
+  POLYBENCH_2D_ARRAY_DECL(G, DATA_TYPE, NI, NL, ni, nl);
+
+  /* Initialize array(s). */
+  init_array (ni, nj, nk, nl, nm,
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(B),
+	      POLYBENCH_ARRAY(C),
+	      POLYBENCH_ARRAY(D));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_3mm (ni, nj, nk, nl, nm,
+	      POLYBENCH_ARRAY(E),
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(B),
+	      POLYBENCH_ARRAY(F),
+	      POLYBENCH_ARRAY(C),
+	      POLYBENCH_ARRAY(D),
+	      POLYBENCH_ARRAY(G));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(ni, nl,  POLYBENCH_ARRAY(G)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(E);
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(B);
+  POLYBENCH_FREE_ARRAY(F);
+  POLYBENCH_FREE_ARRAY(C);
+  POLYBENCH_FREE_ARRAY(D);
+  POLYBENCH_FREE_ARRAY(G);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/3mm.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/3mm.h
new file mode 100644
index 000000000..f989e6586
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/3mm.h
@@ -0,0 +1,72 @@
+/**
+ * 3mm.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef _3MM_H
+# define _3MM_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NI) && !defined(NJ) && !defined(NK)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NI 32
+#   define NJ 32
+#   define NK 32
+#   define NL 32
+#   define NM 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NI 128
+#   define NJ 128
+#   define NK 128
+#   define NL 128
+#   define NM 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NI 1024
+#   define NJ 1024
+#   define NK 1024
+#   define NL 1024
+#   define NM 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NI 2000
+#   define NJ 2000
+#   define NK 2000
+#   define NL 2000
+#   define NM 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NI 4000
+#   define NJ 4000
+#   define NK 4000
+#   define NL 4000
+#   define NM 4000
+#  endif
+# endif /* !N */
+
+# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni)
+# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj)
+# define _PB_NK POLYBENCH_LOOP_BOUND(NK,nk)
+# define _PB_NL POLYBENCH_LOOP_BOUND(NL,nl)
+# define _PB_NM POLYBENCH_LOOP_BOUND(NM,nm)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !_3MM */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/compiler.opts b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/compiler.opts
new file mode 100644
index 000000000..9d37e0bfe
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/3mm/compiler.opts
@@ -0,0 +1 @@
+-DNI=1024 -DNJ=1024 -DNK=1024 -DNL=1024 -DNM=1024
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/atax/atax.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/atax/atax.c
new file mode 100644
index 000000000..b9fb14baf
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/atax/atax.c
@@ -0,0 +1,121 @@
+/**
+ * atax.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "atax.h"
+
+
+/* Array initialization. */
+static
+void init_array (int nx, int ny,
+		 DATA_TYPE POLYBENCH_2D(A,NX,NY,nx,ny),
+		 DATA_TYPE POLYBENCH_1D(x,NY,ny))
+{
+  int i, j;
+
+  for (i = 0; i < ny; i++)
+      x[i] = i * M_PI;
+  for (i = 0; i < nx; i++)
+    for (j = 0; j < ny; j++)
+      A[i][j] = ((DATA_TYPE) i*(j+1)) / nx;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int nx,
+		 DATA_TYPE POLYBENCH_1D(y,NX,nx))
+
+{
+  int i;
+
+  for (i = 0; i < nx; i++) {
+    fprintf (stderr, DATA_PRINTF_MODIFIER, y[i]);
+    if (i % 20 == 0) fprintf (stderr, "\n");
+  }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_atax(int nx, int ny,
+		 DATA_TYPE POLYBENCH_2D(A,NX,NY,nx,ny),
+		 DATA_TYPE POLYBENCH_1D(x,NY,ny),
+		 DATA_TYPE POLYBENCH_1D(y,NY,ny),
+		 DATA_TYPE POLYBENCH_1D(tmp,NX,nx))
+{
+  int i, j;
+
+#pragma scop
+  for (i = 0; i < _PB_NY; i++)
+    y[i] = 0;
+  for (i = 0; i < _PB_NX; i++)
+    {
+      tmp[i] = 0;
+      for (j = 0; j < _PB_NY; j++)
+	tmp[i] = tmp[i] + A[i][j] * x[j];
+      for (j = 0; j < _PB_NY; j++)
+	y[j] = y[j] + A[i][j] * tmp[i];
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int nx = NX;
+  int ny = NY;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, NX, NY, nx, ny);
+  POLYBENCH_1D_ARRAY_DECL(x, DATA_TYPE, NY, ny);
+  POLYBENCH_1D_ARRAY_DECL(y, DATA_TYPE, NY, ny);
+  POLYBENCH_1D_ARRAY_DECL(tmp, DATA_TYPE, NX, nx);
+
+  /* Initialize array(s). */
+  init_array (nx, ny, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(x));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_atax (nx, ny,
+	       POLYBENCH_ARRAY(A),
+	       POLYBENCH_ARRAY(x),
+	       POLYBENCH_ARRAY(y),
+	       POLYBENCH_ARRAY(tmp));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(nx, POLYBENCH_ARRAY(y)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(x);
+  POLYBENCH_FREE_ARRAY(y);
+  POLYBENCH_FREE_ARRAY(tmp);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/atax/atax.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/atax/atax.h
new file mode 100644
index 000000000..d1f67e68f
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/atax/atax.h
@@ -0,0 +1,54 @@
+/**
+ * atax.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef ATAX_H
+# define ATAX_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NX) && !defined(NY)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NX 32
+#   define NY 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NX 500
+#   define NY 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NX 4000
+#   define NY 4000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NX 8000
+#   define NY 8000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NX 100000
+#   define NY 100000
+#  endif
+# endif /* !N */
+
+# define _PB_NX POLYBENCH_LOOP_BOUND(NX,nx)
+# define _PB_NY POLYBENCH_LOOP_BOUND(NY,ny)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !ATAX */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/bicg/bicg.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/bicg/bicg.c
new file mode 100644
index 000000000..cace4b423
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/bicg/bicg.c
@@ -0,0 +1,137 @@
+/**
+ * bicg.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "bicg.h"
+
+
+/* Array initialization. */
+static
+void init_array (int nx, int ny,
+		 DATA_TYPE POLYBENCH_2D(A,NX,NY,nx,ny),
+		 DATA_TYPE POLYBENCH_1D(r,NX,nx),
+		 DATA_TYPE POLYBENCH_1D(p,NY,ny))
+{
+  int i, j;
+
+  for (i = 0; i < ny; i++)
+    p[i] = i * M_PI;
+  for (i = 0; i < nx; i++) {
+    r[i] = i * M_PI;
+    for (j = 0; j < ny; j++)
+      A[i][j] = ((DATA_TYPE) i*(j+1))/nx;
+  }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int nx, int ny,
+		 DATA_TYPE POLYBENCH_1D(s,NY,ny),
+		 DATA_TYPE POLYBENCH_1D(q,NX,nx))
+
+{
+  int i;
+
+  for (i = 0; i < ny; i++) {
+    fprintf (stderr, DATA_PRINTF_MODIFIER, s[i]);
+    if (i % 20 == 0) fprintf (stderr, "\n");
+  }
+  for (i = 0; i < nx; i++) {
+    fprintf (stderr, DATA_PRINTF_MODIFIER, q[i]);
+    if (i % 20 == 0) fprintf (stderr, "\n");
+  }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_bicg(int nx, int ny,
+		 DATA_TYPE POLYBENCH_2D(A,NX,NY,nx,ny),
+		 DATA_TYPE POLYBENCH_1D(s,NY,ny),
+		 DATA_TYPE POLYBENCH_1D(q,NX,nx),
+		 DATA_TYPE POLYBENCH_1D(p,NY,ny),
+		 DATA_TYPE POLYBENCH_1D(r,NX,nx))
+{
+  int i, j;
+
+#pragma scop
+  for (i = 0; i < _PB_NY; i++)
+    s[i] = 0;
+  for (i = 0; i < _PB_NX; i++)
+    {
+      q[i] = 0;
+      for (j = 0; j < _PB_NY; j++)
+	{
+	  s[j] = s[j] + r[i] * A[i][j];
+	  q[i] = q[i] + A[i][j] * p[j];
+	}
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int nx = NX;
+  int ny = NY;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, NX, NY, nx, ny);
+  POLYBENCH_1D_ARRAY_DECL(s, DATA_TYPE, NY, ny);
+  POLYBENCH_1D_ARRAY_DECL(q, DATA_TYPE, NX, nx);
+  POLYBENCH_1D_ARRAY_DECL(p, DATA_TYPE, NY, ny);
+  POLYBENCH_1D_ARRAY_DECL(r, DATA_TYPE, NX, nx);
+
+  /* Initialize array(s). */
+  init_array (nx, ny,
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(r),
+	      POLYBENCH_ARRAY(p));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_bicg (nx, ny,
+	       POLYBENCH_ARRAY(A),
+	       POLYBENCH_ARRAY(s),
+	       POLYBENCH_ARRAY(q),
+	       POLYBENCH_ARRAY(p),
+	       POLYBENCH_ARRAY(r));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(nx, ny, POLYBENCH_ARRAY(s), POLYBENCH_ARRAY(q)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(s);
+  POLYBENCH_FREE_ARRAY(q);
+  POLYBENCH_FREE_ARRAY(p);
+  POLYBENCH_FREE_ARRAY(r);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/bicg/bicg.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/bicg/bicg.h
new file mode 100644
index 000000000..4b3c311a9
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/bicg/bicg.h
@@ -0,0 +1,54 @@
+/**
+ * bicg.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef BICG_H
+# define BICG_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NX) && !defined(NY)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NX 32
+#   define NY 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NX 500
+#   define NY 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NX 4000
+#   define NY 4000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NX 8000
+#   define NY 8000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NX 100000
+#   define NY 100000
+#  endif
+# endif /* !N */
+
+# define _PB_NX POLYBENCH_LOOP_BOUND(NX,nx)
+# define _PB_NY POLYBENCH_LOOP_BOUND(NY,ny)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !BICG */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/cholesky/cholesky.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/cholesky/cholesky.c
new file mode 100644
index 000000000..78abeec1c
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/cholesky/cholesky.c
@@ -0,0 +1,118 @@
+/**
+ * cholesky.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "cholesky.h"
+
+
+/* Array initialization. */
+static
+void init_array(int n,
+		DATA_TYPE POLYBENCH_1D(p,N,n),
+		DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    {
+      p[i] = 1.0 / n;
+      for (j = 0; j < n; j++)
+	A[i][j] = 1.0 / n;
+    }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++) {
+    fprintf (stderr, DATA_PRINTF_MODIFIER, A[i][j]);
+    if ((i * N + j) % 20 == 0) fprintf (stderr, "\n");
+  }
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_cholesky(int n,
+		     DATA_TYPE POLYBENCH_1D(p,N,n),
+		     DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+{
+  int i, j, k;
+
+  DATA_TYPE x;
+
+#pragma scop
+for (i = 0; i < _PB_N; ++i)
+  {
+    x = A[i][i];
+    for (j = 0; j <= i - 1; ++j)
+      x = x - A[i][j] * A[i][j];
+    p[i] = 1.0 / sqrt(x);
+    for (j = i + 1; j < _PB_N; ++j)
+      {
+	x = A[i][j];
+	for (k = 0; k <= i - 1; ++k)
+	  x = x - A[j][k] * A[i][k];
+	A[j][i] = x * p[i];
+      }
+  }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, N, N, n, n);
+  POLYBENCH_1D_ARRAY_DECL(p, DATA_TYPE, N, n);
+
+
+  /* Initialize array(s). */
+  init_array (n, POLYBENCH_ARRAY(p), POLYBENCH_ARRAY(A));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_cholesky (n, POLYBENCH_ARRAY(p), POLYBENCH_ARRAY(A));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(A)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(p);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/cholesky/cholesky.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/cholesky/cholesky.h
new file mode 100644
index 000000000..b85a477ff
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/cholesky/cholesky.h
@@ -0,0 +1,48 @@
+/**
+ * cholesky.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef CHOLESKY_H
+# define CHOLESKY_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(N)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 4000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !CHOLESKY */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/doitgen/doitgen.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/doitgen/doitgen.c
new file mode 100644
index 000000000..d765be7b6
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/doitgen/doitgen.c
@@ -0,0 +1,123 @@
+/**
+ * doitgen.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "doitgen.h"
+
+
+/* Array initialization. */
+static
+void init_array(int nr, int nq, int np,
+		DATA_TYPE POLYBENCH_3D(A,NR,NQ,NP,nr,nq,np),
+		DATA_TYPE POLYBENCH_2D(C4,NP,NP,np,np))
+{
+  int i, j, k;
+
+  for (i = 0; i < nr; i++)
+    for (j = 0; j < nq; j++)
+      for (k = 0; k < np; k++)
+	A[i][j][k] = ((DATA_TYPE) i*j + k) / np;
+  for (i = 0; i < np; i++)
+    for (j = 0; j < np; j++)
+      C4[i][j] = ((DATA_TYPE) i*j) / np;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int nr, int nq, int np,
+		 DATA_TYPE POLYBENCH_3D(A,NR,NQ,NP,nr,nq,np))
+{
+  int i, j, k;
+
+  for (i = 0; i < nr; i++)
+    for (j = 0; j < nq; j++)
+      for (k = 0; k < np; k++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, A[i][j][k]);
+	if (i % 20 == 0) fprintf (stderr, "\n");
+      }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_doitgen(int nr, int nq, int np,
+		    DATA_TYPE POLYBENCH_3D(A,NR,NQ,NP,nr,nq,np),
+		    DATA_TYPE POLYBENCH_2D(C4,NP,NP,np,np),
+		    DATA_TYPE POLYBENCH_3D(sum,NR,NQ,NP,nr,nq,np))
+{
+  int r, q, p, s;
+
+#pragma scop
+  for (r = 0; r < _PB_NR; r++)
+    for (q = 0; q < _PB_NQ; q++)  {
+      for (p = 0; p < _PB_NP; p++)  {
+	sum[r][q][p] = 0;
+	for (s = 0; s < _PB_NP; s++)
+	  sum[r][q][p] = sum[r][q][p] + A[r][q][s] * C4[s][p];
+      }
+      for (p = 0; p < _PB_NR; p++)
+	A[r][q][p] = sum[r][q][p];
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int nr = NR;
+  int nq = NQ;
+  int np = NP;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_3D_ARRAY_DECL(A,DATA_TYPE,NR,NQ,NP,nr,nq,np);
+  POLYBENCH_3D_ARRAY_DECL(sum,DATA_TYPE,NR,NQ,NP,nr,nq,np);
+  POLYBENCH_2D_ARRAY_DECL(C4,DATA_TYPE,NP,NP,np,np);
+
+  /* Initialize array(s). */
+  init_array (nr, nq, np,
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(C4));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_doitgen (nr, nq, np,
+		  POLYBENCH_ARRAY(A),
+		  POLYBENCH_ARRAY(C4),
+		  POLYBENCH_ARRAY(sum));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(nr, nq, np,  POLYBENCH_ARRAY(A)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(sum);
+  POLYBENCH_FREE_ARRAY(C4);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/doitgen/doitgen.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/doitgen/doitgen.h
new file mode 100644
index 000000000..0cc8010e9
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/doitgen/doitgen.h
@@ -0,0 +1,60 @@
+/**
+ * doitgen.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef DOITGEN_H
+# define DOITGEN_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NQ) && !defined(NR) && !defined(NP)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NQ 10
+#   define NR 10
+#   define NP 10
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NQ 32
+#   define NR 32
+#   define NP 32
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NQ 128
+#   define NR 128
+#   define NP 128
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NQ 256
+#   define NR 256
+#   define NP 256
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NQ 1000
+#   define NR 1000
+#   define NP 1000
+#  endif
+# endif /* !N */
+
+# define _PB_NQ POLYBENCH_LOOP_BOUND(NQ,nq)
+# define _PB_NR POLYBENCH_LOOP_BOUND(NR,nr)
+# define _PB_NP POLYBENCH_LOOP_BOUND(NP,np)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !DOITGEN */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemm/gemm.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemm/gemm.c
new file mode 100644
index 000000000..902dda911
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemm/gemm.c
@@ -0,0 +1,133 @@
+/**
+ * gemm.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "gemm.h"
+
+
+/* Array initialization. */
+static
+void init_array(int ni, int nj, int nk,
+		DATA_TYPE *alpha,
+		DATA_TYPE *beta,
+		DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj),
+		DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nk),
+		DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj))
+{
+  int i, j;
+
+  *alpha = 32412;
+  *beta = 2123;
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nj; j++)
+      C[i][j] = ((DATA_TYPE) i*j) / ni;
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nk; j++)
+      A[i][j] = ((DATA_TYPE) i*j) / ni;
+  for (i = 0; i < nk; i++)
+    for (j = 0; j < nj; j++)
+      B[i][j] = ((DATA_TYPE) i*j) / ni;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int ni, int nj,
+		 DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj))
+{
+  int i, j;
+
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nj; j++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, C[i][j]);
+	if ((i * ni + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_gemm(int ni, int nj, int nk,
+		 DATA_TYPE alpha,
+		 DATA_TYPE beta,
+		 DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj),
+		 DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nk),
+		 DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj))
+{
+  int i, j, k;
+
+#pragma scop
+  /* C := alpha*A*B + beta*C */
+  for (i = 0; i < _PB_NI; i++)
+    for (j = 0; j < _PB_NJ; j++)
+      {
+	C[i][j] *= beta;
+	for (k = 0; k < _PB_NK; ++k)
+	  C[i][j] += alpha * A[i][k] * B[k][j];
+      }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int ni = NI;
+  int nj = NJ;
+  int nk = NK;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE alpha;
+  DATA_TYPE beta;
+  POLYBENCH_2D_ARRAY_DECL(C,DATA_TYPE,NI,NJ,ni,nj);
+  POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NI,NK,ni,nk);
+  POLYBENCH_2D_ARRAY_DECL(B,DATA_TYPE,NK,NJ,nk,nj);
+
+  /* Initialize array(s). */
+  init_array (ni, nj, nk, &alpha, &beta,
+	      POLYBENCH_ARRAY(C),
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(B));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_gemm (ni, nj, nk,
+	       alpha, beta,
+	       POLYBENCH_ARRAY(C),
+	       POLYBENCH_ARRAY(A),
+	       POLYBENCH_ARRAY(B));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(ni, nj,  POLYBENCH_ARRAY(C)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(C);
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(B);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemm/gemm.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemm/gemm.h
new file mode 100644
index 000000000..8a89e4589
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemm/gemm.h
@@ -0,0 +1,60 @@
+/**
+ * gemm.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef GEMM_H
+# define GEMM_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NI) && !defined(NJ) && !defined(NK)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NI 32
+#   define NJ 32
+#   define NK 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NI 128
+#   define NJ 128
+#   define NK 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NI 1024
+#   define NJ 1024
+#   define NK 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NI 2000
+#   define NJ 2000
+#   define NK 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NI 4000
+#   define NJ 4000
+#   define NK 4000
+#  endif
+# endif /* !N */
+
+# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni)
+# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj)
+# define _PB_NK POLYBENCH_LOOP_BOUND(NK,nk)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !GEMM */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemver/gemver.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemver/gemver.c
new file mode 100644
index 000000000..ca442f37a
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemver/gemver.c
@@ -0,0 +1,177 @@
+/**
+ * gemver.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "gemver.h"
+
+
+/* Array initialization. */
+static
+void init_array (int n,
+		 DATA_TYPE *alpha,
+		 DATA_TYPE *beta,
+		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n),
+		 DATA_TYPE POLYBENCH_1D(u1,N,n),
+		 DATA_TYPE POLYBENCH_1D(v1,N,n),
+		 DATA_TYPE POLYBENCH_1D(u2,N,n),
+		 DATA_TYPE POLYBENCH_1D(v2,N,n),
+		 DATA_TYPE POLYBENCH_1D(w,N,n),
+		 DATA_TYPE POLYBENCH_1D(x,N,n),
+		 DATA_TYPE POLYBENCH_1D(y,N,n),
+		 DATA_TYPE POLYBENCH_1D(z,N,n))
+{
+  int i, j;
+
+  *alpha = 43532;
+  *beta = 12313;
+
+  for (i = 0; i < n; i++)
+    {
+      u1[i] = i;
+      u2[i] = (i+1)/n/2.0;
+      v1[i] = (i+1)/n/4.0;
+      v2[i] = (i+1)/n/6.0;
+      y[i] = (i+1)/n/8.0;
+      z[i] = (i+1)/n/9.0;
+      x[i] = 0.0;
+      w[i] = 0.0;
+      for (j = 0; j < n; j++)
+	A[i][j] = ((DATA_TYPE) i*j) / n;
+    }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_1D(w,N,n))
+{
+  int i;
+
+  for (i = 0; i < n; i++) {
+    fprintf (stderr, DATA_PRINTF_MODIFIER, w[i]);
+    if (i % 20 == 0) fprintf (stderr, "\n");
+  }
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_gemver(int n,
+		   DATA_TYPE alpha,
+		   DATA_TYPE beta,
+		   DATA_TYPE POLYBENCH_2D(A,N,N,n,n),
+		   DATA_TYPE POLYBENCH_1D(u1,N,n),
+		   DATA_TYPE POLYBENCH_1D(v1,N,n),
+		   DATA_TYPE POLYBENCH_1D(u2,N,n),
+		   DATA_TYPE POLYBENCH_1D(v2,N,n),
+		   DATA_TYPE POLYBENCH_1D(w,N,n),
+		   DATA_TYPE POLYBENCH_1D(x,N,n),
+		   DATA_TYPE POLYBENCH_1D(y,N,n),
+		   DATA_TYPE POLYBENCH_1D(z,N,n))
+{
+  int i, j;
+
+#pragma scop
+
+  for (i = 0; i < _PB_N; i++)
+    for (j = 0; j < _PB_N; j++)
+      A[i][j] = A[i][j] + u1[i] * v1[j] + u2[i] * v2[j];
+
+  for (i = 0; i < _PB_N; i++)
+    for (j = 0; j < _PB_N; j++)
+      x[i] = x[i] + beta * A[j][i] * y[j];
+
+  for (i = 0; i < _PB_N; i++)
+    x[i] = x[i] + z[i];
+
+  for (i = 0; i < _PB_N; i++)
+    for (j = 0; j < _PB_N; j++)
+      w[i] = w[i] +  alpha * A[i][j] * x[j];
+
+#pragma endscop
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE alpha;
+  DATA_TYPE beta;
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, N, N, n, n);
+  POLYBENCH_1D_ARRAY_DECL(u1, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(v1, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(u2, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(v2, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(w, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(x, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(y, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(z, DATA_TYPE, N, n);
+
+
+  /* Initialize array(s). */
+  init_array (n, &alpha, &beta,
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(u1),
+	      POLYBENCH_ARRAY(v1),
+	      POLYBENCH_ARRAY(u2),
+	      POLYBENCH_ARRAY(v2),
+	      POLYBENCH_ARRAY(w),
+	      POLYBENCH_ARRAY(x),
+	      POLYBENCH_ARRAY(y),
+	      POLYBENCH_ARRAY(z));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_gemver (n, alpha, beta,
+		 POLYBENCH_ARRAY(A),
+		 POLYBENCH_ARRAY(u1),
+		 POLYBENCH_ARRAY(v1),
+		 POLYBENCH_ARRAY(u2),
+		 POLYBENCH_ARRAY(v2),
+		 POLYBENCH_ARRAY(w),
+		 POLYBENCH_ARRAY(x),
+		 POLYBENCH_ARRAY(y),
+		 POLYBENCH_ARRAY(z));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(w)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(u1);
+  POLYBENCH_FREE_ARRAY(v1);
+  POLYBENCH_FREE_ARRAY(u2);
+  POLYBENCH_FREE_ARRAY(v2);
+  POLYBENCH_FREE_ARRAY(w);
+  POLYBENCH_FREE_ARRAY(x);
+  POLYBENCH_FREE_ARRAY(y);
+  POLYBENCH_FREE_ARRAY(z);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemver/gemver.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemver/gemver.h
new file mode 100644
index 000000000..baae7f8cb
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gemver/gemver.h
@@ -0,0 +1,48 @@
+/**
+ * gemver.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef GEMVER_H
+# define GEMVER_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# ifndef N
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 4000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 8000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 100000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !GEMVER */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gesummv/gesummv.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gesummv/gesummv.c
new file mode 100644
index 000000000..00ac25353
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gesummv/gesummv.c
@@ -0,0 +1,140 @@
+/**
+ * gesummv.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "gesummv.h"
+
+
+/* Array initialization. */
+static
+void init_array(int n,
+		DATA_TYPE *alpha,
+		DATA_TYPE *beta,
+		DATA_TYPE POLYBENCH_2D(A,N,N,n,n),
+		DATA_TYPE POLYBENCH_2D(B,N,N,n,n),
+		DATA_TYPE POLYBENCH_1D(x,N,n))
+{
+  int i, j;
+
+  *alpha = 43532;
+  *beta = 12313;
+  for (i = 0; i < n; i++)
+    {
+      x[i] = ((DATA_TYPE) i) / n;
+      for (j = 0; j < n; j++) {
+	A[i][j] = ((DATA_TYPE) i*j) / n;
+	B[i][j] = ((DATA_TYPE) i*j) / n;
+      }
+    }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_1D(y,N,n))
+
+{
+  int i;
+
+  for (i = 0; i < n; i++) {
+    fprintf (stderr, DATA_PRINTF_MODIFIER, y[i]);
+    if (i % 20 == 0) fprintf (stderr, "\n");
+  }
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_gesummv(int n,
+		    DATA_TYPE alpha,
+		    DATA_TYPE beta,
+		    DATA_TYPE POLYBENCH_2D(A,N,N,n,n),
+		    DATA_TYPE POLYBENCH_2D(B,N,N,n,n),
+		    DATA_TYPE POLYBENCH_1D(tmp,N,n),
+		    DATA_TYPE POLYBENCH_1D(x,N,n),
+		    DATA_TYPE POLYBENCH_1D(y,N,n))
+{
+  int i, j;
+
+#pragma scop
+  for (i = 0; i < _PB_N; i++)
+    {
+      tmp[i] = 0;
+      y[i] = 0;
+      for (j = 0; j < _PB_N; j++)
+	{
+	  tmp[i] = A[i][j] * x[j] + tmp[i];
+	  y[i] = B[i][j] * x[j] + y[i];
+	}
+      y[i] = alpha * tmp[i] + beta * y[i];
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE alpha;
+  DATA_TYPE beta;
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, N, N, n, n);
+  POLYBENCH_2D_ARRAY_DECL(B, DATA_TYPE, N, N, n, n);
+  POLYBENCH_1D_ARRAY_DECL(tmp, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(x, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(y, DATA_TYPE, N, n);
+
+
+  /* Initialize array(s). */
+  init_array (n, &alpha, &beta,
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(B),
+	      POLYBENCH_ARRAY(x));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_gesummv (n, alpha, beta,
+		  POLYBENCH_ARRAY(A),
+		  POLYBENCH_ARRAY(B),
+		  POLYBENCH_ARRAY(tmp),
+		  POLYBENCH_ARRAY(x),
+		  POLYBENCH_ARRAY(y));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(y)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(B);
+  POLYBENCH_FREE_ARRAY(tmp);
+  POLYBENCH_FREE_ARRAY(x);
+  POLYBENCH_FREE_ARRAY(y);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gesummv/gesummv.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gesummv/gesummv.h
new file mode 100644
index 000000000..2661acab4
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/gesummv/gesummv.h
@@ -0,0 +1,48 @@
+/**
+ * gesummv.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef GESUMMV_H
+# define GESUMMV_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# ifndef N
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 4000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 8000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 100000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !GESUMMV */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/mvt/mvt.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/mvt/mvt.c
new file mode 100644
index 000000000..4adbb9c9d
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/mvt/mvt.c
@@ -0,0 +1,134 @@
+/**
+ * mvt.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "mvt.h"
+
+
+/* Array initialization. */
+static
+void init_array(int n,
+		DATA_TYPE POLYBENCH_1D(x1,N,n),
+		DATA_TYPE POLYBENCH_1D(x2,N,n),
+		DATA_TYPE POLYBENCH_1D(y_1,N,n),
+		DATA_TYPE POLYBENCH_1D(y_2,N,n),
+		DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    {
+      x1[i] = ((DATA_TYPE) i) / n;
+      x2[i] = ((DATA_TYPE) i + 1) / n;
+      y_1[i] = ((DATA_TYPE) i + 3) / n;
+      y_2[i] = ((DATA_TYPE) i + 4) / n;
+      for (j = 0; j < n; j++)
+	A[i][j] = ((DATA_TYPE) i*j) / N;
+    }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_1D(x1,N,n),
+		 DATA_TYPE POLYBENCH_1D(x2,N,n))
+
+{
+  int i;
+
+  for (i = 0; i < n; i++) {
+    fprintf (stderr, DATA_PRINTF_MODIFIER, x1[i]);
+    fprintf (stderr, DATA_PRINTF_MODIFIER, x2[i]);
+    if (i % 20 == 0) fprintf (stderr, "\n");
+  }
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_mvt(int n,
+		DATA_TYPE POLYBENCH_1D(x1,N,n),
+		DATA_TYPE POLYBENCH_1D(x2,N,n),
+		DATA_TYPE POLYBENCH_1D(y_1,N,n),
+		DATA_TYPE POLYBENCH_1D(y_2,N,n),
+		DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+{
+  int i, j;
+
+#pragma scop
+  for (i = 0; i < _PB_N; i++)
+    for (j = 0; j < _PB_N; j++)
+      x1[i] = x1[i] + A[i][j] * y_1[j];
+  for (i = 0; i < _PB_N; i++)
+    for (j = 0; j < _PB_N; j++)
+      x2[i] = x2[i] + A[j][i] * y_2[j];
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, N, N, n, n);
+  POLYBENCH_1D_ARRAY_DECL(x1, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(x2, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(y_1, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(y_2, DATA_TYPE, N, n);
+
+
+  /* Initialize array(s). */
+  init_array (n,
+	      POLYBENCH_ARRAY(x1),
+	      POLYBENCH_ARRAY(x2),
+	      POLYBENCH_ARRAY(y_1),
+	      POLYBENCH_ARRAY(y_2),
+	      POLYBENCH_ARRAY(A));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_mvt (n,
+	      POLYBENCH_ARRAY(x1),
+	      POLYBENCH_ARRAY(x2),
+	      POLYBENCH_ARRAY(y_1),
+	      POLYBENCH_ARRAY(y_2),
+	      POLYBENCH_ARRAY(A));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(x1), POLYBENCH_ARRAY(x2)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(x1);
+  POLYBENCH_FREE_ARRAY(x2);
+  POLYBENCH_FREE_ARRAY(y_1);
+  POLYBENCH_FREE_ARRAY(y_2);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/mvt/mvt.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/mvt/mvt.h
new file mode 100644
index 000000000..290848eca
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/mvt/mvt.h
@@ -0,0 +1,48 @@
+/**
+ * mvt.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef MVT_H
+# define MVT_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# ifndef N
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 4000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 8000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 100000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !MVT */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/symm/symm.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/symm/symm.c
new file mode 100644
index 000000000..c317f6101
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/symm/symm.c
@@ -0,0 +1,136 @@
+/**
+ * symm.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "symm.h"
+
+
+/* Array initialization. */
+static
+void init_array(int ni, int nj,
+		DATA_TYPE *alpha,
+		DATA_TYPE *beta,
+		DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj),
+		DATA_TYPE POLYBENCH_2D(A,NJ,NJ,nj,nj),
+		DATA_TYPE POLYBENCH_2D(B,NI,NJ,ni,nj))
+{
+  int i, j;
+
+  *alpha = 32412;
+  *beta = 2123;
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nj; j++) {
+      C[i][j] = ((DATA_TYPE) i*j) / ni;
+      B[i][j] = ((DATA_TYPE) i*j) / ni;
+    }
+  for (i = 0; i < nj; i++)
+    for (j = 0; j < nj; j++)
+      A[i][j] = ((DATA_TYPE) i*j) / ni;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int ni, int nj,
+		 DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj))
+{
+  int i, j;
+
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nj; j++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, C[i][j]);
+	if ((i * ni + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_symm(int ni, int nj,
+		 DATA_TYPE alpha,
+		 DATA_TYPE beta,
+		 DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj),
+		 DATA_TYPE POLYBENCH_2D(A,NJ,NJ,nj,nj),
+		 DATA_TYPE POLYBENCH_2D(B,NI,NJ,ni,nj))
+{
+  int i, j, k;
+  DATA_TYPE acc;
+
+#pragma scop
+  /*  C := alpha*A*B + beta*C, A is symetric */
+  for (i = 0; i < _PB_NI; i++)
+    for (j = 0; j < _PB_NJ; j++)
+      {
+	acc = 0;
+	for (k = 0; k < j - 1; k++)
+	  {
+	    C[k][j] += alpha * A[k][i] * B[i][j];
+	    acc += B[k][j] * A[k][i];
+	  }
+	C[i][j] = beta * C[i][j] + alpha * A[i][i] * B[i][j] + alpha * acc;
+      }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int ni = NI;
+  int nj = NJ;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE alpha;
+  DATA_TYPE beta;
+  POLYBENCH_2D_ARRAY_DECL(C,DATA_TYPE,NI,NJ,ni,nj);
+  POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NJ,NJ,nj,nj);
+  POLYBENCH_2D_ARRAY_DECL(B,DATA_TYPE,NI,NJ,ni,nj);
+
+  /* Initialize array(s). */
+  init_array (ni, nj, &alpha, &beta,
+	      POLYBENCH_ARRAY(C),
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(B));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_symm (ni, nj,
+	       alpha, beta,
+	       POLYBENCH_ARRAY(C),
+	       POLYBENCH_ARRAY(A),
+	       POLYBENCH_ARRAY(B));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(ni, nj,  POLYBENCH_ARRAY(C)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(C);
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(B);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/symm/symm.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/symm/symm.h
new file mode 100644
index 000000000..39f147d9c
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/symm/symm.h
@@ -0,0 +1,54 @@
+/**
+ * symm.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef SYMM_H
+# define SYMM_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NI) && !defined(NJ)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NI 32
+#   define NJ 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NI 128
+#   define NJ 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NI 1024
+#   define NJ 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NI 2000
+#   define NJ 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NI 4000
+#   define NJ 4000
+#  endif
+# endif /* !N */
+
+# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni)
+# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !SYMM */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syr2k/syr2k.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syr2k/syr2k.c
new file mode 100644
index 000000000..9e3890257
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syr2k/syr2k.c
@@ -0,0 +1,134 @@
+/**
+ * syr2k.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "syr2k.h"
+
+
+/* Array initialization. */
+static
+void init_array(int ni, int nj,
+		DATA_TYPE *alpha,
+		DATA_TYPE *beta,
+		DATA_TYPE POLYBENCH_2D(C,NI,NI,ni,ni),
+		DATA_TYPE POLYBENCH_2D(A,NI,NJ,ni,nj),
+		DATA_TYPE POLYBENCH_2D(B,NI,NJ,ni,nj))
+{
+  int i, j;
+
+  *alpha = 32412;
+  *beta = 2123;
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nj; j++) {
+      A[i][j] = ((DATA_TYPE) i*j) / ni;
+      B[i][j] = ((DATA_TYPE) i*j) / ni;
+    }
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < ni; j++)
+      C[i][j] = ((DATA_TYPE) i*j) / ni;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int ni,
+		 DATA_TYPE POLYBENCH_2D(C,NI,NI,ni,ni))
+{
+  int i, j;
+
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < ni; j++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, C[i][j]);
+	if ((i * ni + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_syr2k(int ni, int nj,
+		  DATA_TYPE alpha,
+		  DATA_TYPE beta,
+		  DATA_TYPE POLYBENCH_2D(C,NI,NI,ni,ni),
+		  DATA_TYPE POLYBENCH_2D(A,NI,NJ,ni,nj),
+		  DATA_TYPE POLYBENCH_2D(B,NI,NJ,ni,nj))
+{
+  int i, j, k;
+
+#pragma scop
+  /*    C := alpha*A*B' + alpha*B*A' + beta*C */
+  for (i = 0; i < _PB_NI; i++)
+    for (j = 0; j < _PB_NI; j++)
+      C[i][j] *= beta;
+  for (i = 0; i < _PB_NI; i++)
+    for (j = 0; j < _PB_NI; j++)
+      for (k = 0; k < _PB_NJ; k++)
+	{
+	  C[i][j] += alpha * A[i][k] * B[j][k];
+	  C[i][j] += alpha * B[i][k] * A[j][k];
+	}
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int ni = NI;
+  int nj = NJ;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE alpha;
+  DATA_TYPE beta;
+  POLYBENCH_2D_ARRAY_DECL(C,DATA_TYPE,NI,NI,ni,ni);
+  POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NI,NJ,ni,nj);
+  POLYBENCH_2D_ARRAY_DECL(B,DATA_TYPE,NI,NJ,ni,nj);
+
+  /* Initialize array(s). */
+  init_array (ni, nj, &alpha, &beta,
+	      POLYBENCH_ARRAY(C),
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(B));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_syr2k (ni, nj,
+		alpha, beta,
+		POLYBENCH_ARRAY(C),
+		POLYBENCH_ARRAY(A),
+		POLYBENCH_ARRAY(B));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(ni, POLYBENCH_ARRAY(C)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(C);
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(B);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syr2k/syr2k.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syr2k/syr2k.h
new file mode 100644
index 000000000..3941477a3
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syr2k/syr2k.h
@@ -0,0 +1,54 @@
+/**
+ * syr2k.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef SYR2K_H
+# define SYR2K_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NI) && !defined(NJ)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NI 32
+#   define NJ 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NI 128
+#   define NJ 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NI 1024
+#   define NJ 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NI 2000
+#   define NJ 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NI 4000
+#   define NJ 4000
+#  endif
+# endif /* !N */
+
+# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni)
+# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !SYR2K */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syrk/syrk.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syrk/syrk.c
new file mode 100644
index 000000000..d113f8059
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syrk/syrk.c
@@ -0,0 +1,118 @@
+/**
+ * syrk.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "syrk.h"
+
+
+/* Array initialization. */
+static
+void init_array(int ni, int nj,
+		DATA_TYPE *alpha,
+		DATA_TYPE *beta,
+		DATA_TYPE POLYBENCH_2D(C,NI,NI,ni,ni),
+		DATA_TYPE POLYBENCH_2D(A,NI,NJ,ni,nj))
+{
+  int i, j;
+
+  *alpha = 32412;
+  *beta = 2123;
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nj; j++)
+      A[i][j] = ((DATA_TYPE) i*j) / ni;
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < ni; j++)
+      C[i][j] = ((DATA_TYPE) i*j) / ni;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int ni,
+		 DATA_TYPE POLYBENCH_2D(C,NI,NI,ni,ni))
+{
+  int i, j;
+
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < ni; j++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, C[i][j]);
+	if ((i * ni + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_syrk(int ni, int nj,
+		 DATA_TYPE alpha,
+		 DATA_TYPE beta,
+		 DATA_TYPE POLYBENCH_2D(C,NI,NI,ni,ni),
+		 DATA_TYPE POLYBENCH_2D(A,NI,NJ,ni,nj))
+{
+  int i, j, k;
+
+#pragma scop
+  /*  C := alpha*A*A' + beta*C */
+  for (i = 0; i < _PB_NI; i++)
+    for (j = 0; j < _PB_NI; j++)
+      C[i][j] *= beta;
+  for (i = 0; i < _PB_NI; i++)
+    for (j = 0; j < _PB_NI; j++)
+      for (k = 0; k < _PB_NJ; k++)
+	  C[i][j] += alpha * A[i][k] * A[j][k];
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int ni = NI;
+  int nj = NJ;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE alpha;
+  DATA_TYPE beta;
+  POLYBENCH_2D_ARRAY_DECL(C,DATA_TYPE,NI,NI,ni,ni);
+  POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NI,NJ,ni,nj);
+
+  /* Initialize array(s). */
+  init_array (ni, nj, &alpha, &beta, POLYBENCH_ARRAY(C), POLYBENCH_ARRAY(A));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_syrk (ni, nj, alpha, beta, POLYBENCH_ARRAY(C), POLYBENCH_ARRAY(A));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(ni, POLYBENCH_ARRAY(C)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(C);
+  POLYBENCH_FREE_ARRAY(A);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syrk/syrk.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syrk/syrk.h
new file mode 100644
index 000000000..c753ff3b3
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/syrk/syrk.h
@@ -0,0 +1,54 @@
+/**
+ * syrk.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef SYRK_H
+# define SYRK_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NI) && !defined(NJ)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NI 32
+#   define NJ 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NI 128
+#   define NJ 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NI 1024
+#   define NJ 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NI 2000
+#   define NJ 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NI 4000
+#   define NJ 4000
+#  endif
+# endif /* !N */
+
+# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni)
+# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !SYRK */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trisolv/trisolv.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trisolv/trisolv.c
new file mode 100644
index 000000000..31269286c
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trisolv/trisolv.c
@@ -0,0 +1,112 @@
+/**
+ * trisolv.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "trisolv.h"
+
+
+/* Array initialization. */
+static
+void init_array(int n,
+		DATA_TYPE POLYBENCH_2D(A,N,N,n,n),
+		DATA_TYPE POLYBENCH_1D(x,N,n),
+		DATA_TYPE POLYBENCH_1D(c,N,n))
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    {
+      c[i] = x[i] = ((DATA_TYPE) i) / n;
+      for (j = 0; j < n; j++)
+	A[i][j] = ((DATA_TYPE) i*j) / n;
+    }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_1D(x,N,n))
+
+{
+  int i;
+
+  for (i = 0; i < n; i++) {
+    fprintf (stderr, DATA_PRINTF_MODIFIER, x[i]);
+    if (i % 20 == 0) fprintf (stderr, "\n");
+  }
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_trisolv(int n,
+		    DATA_TYPE POLYBENCH_2D(A,N,N,n,n),
+		    DATA_TYPE POLYBENCH_1D(x,N,n),
+		    DATA_TYPE POLYBENCH_1D(c,N,n))
+{
+  int i, j;
+
+#pragma scop
+  for (i = 0; i < _PB_N; i++)
+    {
+      x[i] = c[i];
+      for (j = 0; j <= i - 1; j++)
+        x[i] = x[i] - A[i][j] * x[j];
+      x[i] = x[i] / A[i][i];
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, N, N, n, n);
+  POLYBENCH_1D_ARRAY_DECL(x, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(c, DATA_TYPE, N, n);
+
+
+  /* Initialize array(s). */
+  init_array (n, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(x), POLYBENCH_ARRAY(c));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_trisolv (n, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(x), POLYBENCH_ARRAY(c));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(x)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(x);
+  POLYBENCH_FREE_ARRAY(c);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trisolv/trisolv.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trisolv/trisolv.h
new file mode 100644
index 000000000..351317282
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trisolv/trisolv.h
@@ -0,0 +1,48 @@
+/**
+ * trisolv.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef TRISOLV_H
+# define TRISOLV_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# ifndef N
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 4000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 8000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 100000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !TRISOLV */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trmm/trmm.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trmm/trmm.c
new file mode 100644
index 000000000..bec75e461
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trmm/trmm.c
@@ -0,0 +1,109 @@
+/**
+ * trmm.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "trmm.h"
+
+
+/* Array initialization. */
+static
+void init_array(int ni,
+		DATA_TYPE *alpha,
+		DATA_TYPE POLYBENCH_2D(A,NI,NI,ni,ni),
+		DATA_TYPE POLYBENCH_2D(B,NI,NI,ni,ni))
+{
+  int i, j;
+
+  *alpha = 32412;
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < ni; j++) {
+      A[i][j] = ((DATA_TYPE) i*j) / ni;
+      B[i][j] = ((DATA_TYPE) i*j) / ni;
+    }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int ni,
+		 DATA_TYPE POLYBENCH_2D(B,NI,NI,ni,ni))
+{
+  int i, j;
+
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < ni; j++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, B[i][j]);
+	if ((i * ni + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_trmm(int ni,
+		 DATA_TYPE alpha,
+		 DATA_TYPE POLYBENCH_2D(A,NI,NI,ni,ni),
+		 DATA_TYPE POLYBENCH_2D(B,NI,NI,ni,ni))
+{
+  int i, j, k;
+
+#pragma scop
+  /*  B := alpha*A'*B, A triangular */
+  for (i = 1; i < _PB_NI; i++)
+    for (j = 0; j < _PB_NI; j++)
+      for (k = 0; k < i; k++)
+        B[i][j] += alpha * A[i][k] * B[j][k];
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int ni = NI;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE alpha;
+  POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NI,NI,ni,ni);
+  POLYBENCH_2D_ARRAY_DECL(B,DATA_TYPE,NI,NI,ni,ni);
+
+  /* Initialize array(s). */
+  init_array (ni, &alpha, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_trmm (ni, alpha, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(ni, POLYBENCH_ARRAY(B)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(B);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trmm/trmm.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trmm/trmm.h
new file mode 100644
index 000000000..4c612c1cc
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/kernels/trmm/trmm.h
@@ -0,0 +1,48 @@
+/**
+ * trmm.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef TRMM_H
+# define TRMM_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NI)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NI 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NI 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NI 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NI 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NI 4000
+#  endif
+# endif /* !N */
+
+# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !TRMM */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/durbin/durbin.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/durbin/durbin.c
new file mode 100644
index 000000000..79ae05b5e
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/durbin/durbin.c
@@ -0,0 +1,147 @@
+/**
+ * durbin.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 4000. */
+#include "durbin.h"
+
+
+/* Array initialization. */
+static
+void init_array (int n,
+		 DATA_TYPE POLYBENCH_2D(y,N,N,n,n),
+		 DATA_TYPE POLYBENCH_2D(sum,N,N,n,n),
+		 DATA_TYPE POLYBENCH_1D(alpha,N,n),
+		 DATA_TYPE POLYBENCH_1D(beta,N,n),
+		 DATA_TYPE POLYBENCH_1D(r,N,n))
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    {
+      alpha[i] = i;
+      beta[i] = (i+1)/n/2.0;
+      r[i] = (i+1)/n/4.0;
+      for (j = 0; j < n; j++) {
+	y[i][j] = ((DATA_TYPE) i*j) / n;
+	sum[i][j] = ((DATA_TYPE) i*j) / n;
+      }
+    }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_1D(out,N,n))
+
+{
+  int i;
+
+  for (i = 0; i < n; i++) {
+    fprintf (stderr, DATA_PRINTF_MODIFIER, out[i]);
+    if (i % 20 == 0) fprintf (stderr, "\n");
+  }
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_durbin(int n,
+		   DATA_TYPE POLYBENCH_2D(y,N,N,n,n),
+		   DATA_TYPE POLYBENCH_2D(sum,N,N,n,n),
+		   DATA_TYPE POLYBENCH_1D(alpha,N,n),
+		   DATA_TYPE POLYBENCH_1D(beta,N,n),
+		   DATA_TYPE POLYBENCH_1D(r,N,n),
+		   DATA_TYPE POLYBENCH_1D(out,N,n))
+{
+  int i, k;
+
+#pragma scop
+  y[0][0] = r[0];
+  beta[0] = 1;
+  alpha[0] = r[0];
+  for (k = 1; k < _PB_N; k++)
+    {
+      beta[k] = beta[k-1] - alpha[k-1] * alpha[k-1] * beta[k-1];
+      sum[0][k] = r[k];
+      for (i = 0; i <= k - 1; i++)
+	sum[i+1][k] = sum[i][k] + r[k-i-1] * y[i][k-1];
+      alpha[k] = -sum[k][k] * beta[k];
+      for (i = 0; i <= k-1; i++)
+	y[i][k] = y[i][k-1] + alpha[k] * y[k-i-1][k-1];
+      y[k][k] = alpha[k];
+    }
+  for (i = 0; i < _PB_N; i++)
+    out[i] = y[i][_PB_N-1];
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(y, DATA_TYPE, N, N, n, n);
+  POLYBENCH_2D_ARRAY_DECL(sum, DATA_TYPE, N, N, n, n);
+  POLYBENCH_1D_ARRAY_DECL(alpha, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(beta, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(r, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(out, DATA_TYPE, N, n);
+
+
+  /* Initialize array(s). */
+  init_array (n,
+	      POLYBENCH_ARRAY(y),
+	      POLYBENCH_ARRAY(sum),
+	      POLYBENCH_ARRAY(alpha),
+	      POLYBENCH_ARRAY(beta),
+	      POLYBENCH_ARRAY(r));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_durbin (n,
+		 POLYBENCH_ARRAY(y),
+		 POLYBENCH_ARRAY(sum),
+		 POLYBENCH_ARRAY(alpha),
+		 POLYBENCH_ARRAY(beta),
+		 POLYBENCH_ARRAY(r),
+		 POLYBENCH_ARRAY(out));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(out)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(y);
+  POLYBENCH_FREE_ARRAY(sum);
+  POLYBENCH_FREE_ARRAY(alpha);
+  POLYBENCH_FREE_ARRAY(beta);
+  POLYBENCH_FREE_ARRAY(r);
+  POLYBENCH_FREE_ARRAY(out);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/durbin/durbin.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/durbin/durbin.h
new file mode 100644
index 000000000..f5df1c365
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/durbin/durbin.h
@@ -0,0 +1,48 @@
+/**
+ * durbin.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef DURBIN_H
+# define DURBIN_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# ifndef N
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 4000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 8000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 100000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !DURBIN */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/dynprog/dynprog.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/dynprog/dynprog.c
new file mode 100644
index 000000000..310011c04
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/dynprog/dynprog.c
@@ -0,0 +1,123 @@
+/**
+ * dynprog.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is int, default size is 50. */
+#include "dynprog.h"
+
+
+/* Array initialization. */
+static
+void init_array(int length,
+		DATA_TYPE POLYBENCH_2D(c,LENGTH,LENGTH,length,length),
+		DATA_TYPE POLYBENCH_2D(W,LENGTH,LENGTH,length,length))
+{
+  int i, j;
+  for (i = 0; i < length; i++)
+    for (j = 0; j < length; j++) {
+      c[i][j] = i*j % 2;
+      W[i][j] = ((DATA_TYPE) i-j) / length;
+    }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(DATA_TYPE out)
+{
+  fprintf (stderr, DATA_PRINTF_MODIFIER, out);
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_dynprog(int tsteps, int length,
+		    DATA_TYPE POLYBENCH_2D(c,LENGTH,LENGTH,length,length),
+		    DATA_TYPE POLYBENCH_2D(W,LENGTH,LENGTH,length,length),
+		    DATA_TYPE POLYBENCH_3D(sum_c,LENGTH,LENGTH,LENGTH,length,length,length),
+		    DATA_TYPE *out)
+{
+  int iter, i, j, k;
+
+  DATA_TYPE out_l = 0;
+
+#pragma scop
+  for (iter = 0; iter < _PB_TSTEPS; iter++)
+    {
+      for (i = 0; i <= _PB_LENGTH - 1; i++)
+	for (j = 0; j <= _PB_LENGTH - 1; j++)
+	  c[i][j] = 0;
+
+      for (i = 0; i <= _PB_LENGTH - 2; i++)
+	{
+	  for (j = i + 1; j <= _PB_LENGTH - 1; j++)
+	    {
+	      sum_c[i][j][i] = 0;
+	      for (k = i + 1; k <= j-1; k++)
+		sum_c[i][j][k] = sum_c[i][j][k - 1] + c[i][k] + c[k][j];
+	      c[i][j] = sum_c[i][j][j-1] + W[i][j];
+	    }
+	}
+      out_l += c[0][_PB_LENGTH - 1];
+    }
+#pragma endscop
+
+  *out = out_l;
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int length = LENGTH;
+  int tsteps = TSTEPS;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE out;
+  POLYBENCH_3D_ARRAY_DECL(sum_c,DATA_TYPE,LENGTH,LENGTH,LENGTH,length,length,length);
+  POLYBENCH_2D_ARRAY_DECL(c,DATA_TYPE,LENGTH,LENGTH,length,length);
+  POLYBENCH_2D_ARRAY_DECL(W,DATA_TYPE,LENGTH,LENGTH,length,length);
+
+  /* Initialize array(s). */
+  init_array (length, POLYBENCH_ARRAY(c), POLYBENCH_ARRAY(W));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_dynprog (tsteps, length,
+		  POLYBENCH_ARRAY(c),
+		  POLYBENCH_ARRAY(W),
+		  POLYBENCH_ARRAY(sum_c),
+		  &out);
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(out));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(sum_c);
+  POLYBENCH_FREE_ARRAY(c);
+  POLYBENCH_FREE_ARRAY(W);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/dynprog/dynprog.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/dynprog/dynprog.h
new file mode 100644
index 000000000..09d702e2b
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/dynprog/dynprog.h
@@ -0,0 +1,54 @@
+/**
+ * dynprog.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef DYNPROG_H
+# define DYNPROG_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(TSTEPS) && !defined(LENGTH)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define TSTEPS 10
+#   define LENGTH 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define TSTEPS 100
+#   define LENGTH 50
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define TSTEPS 10000
+#   define LENGTH 50
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define TSTEPS 1000
+#   define LENGTH 500
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define TSTEPS 10000
+#   define LENGTH 500
+#  endif
+# endif /* !N */
+
+# define _PB_TSTEPS POLYBENCH_LOOP_BOUND(TSTEPS,tsteps)
+# define _PB_LENGTH POLYBENCH_LOOP_BOUND(LENGTH,length)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE int
+#  define DATA_PRINTF_MODIFIER "%d "
+# endif
+
+
+#endif /* !DYNPROG */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/gramschmidt/gramschmidt.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/gramschmidt/gramschmidt.c
new file mode 100644
index 000000000..0aaba9f82
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/gramschmidt/gramschmidt.c
@@ -0,0 +1,147 @@
+/**
+ * gramschmidt.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 512. */
+#include "gramschmidt.h"
+
+
+/* Array initialization. */
+static
+void init_array(int ni, int nj,
+		DATA_TYPE POLYBENCH_2D(A,NI,NJ,ni,nj),
+		DATA_TYPE POLYBENCH_2D(R,NJ,NJ,nj,nj),
+		DATA_TYPE POLYBENCH_2D(Q,NI,NJ,ni,nj))
+{
+  int i, j;
+
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nj; j++) {
+      A[i][j] = ((DATA_TYPE) i*j) / ni;
+      Q[i][j] = ((DATA_TYPE) i*(j+1)) / nj;
+    }
+  for (i = 0; i < nj; i++)
+    for (j = 0; j < nj; j++)
+      R[i][j] = ((DATA_TYPE) i*(j+2)) / nj;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int ni, int nj,
+		 DATA_TYPE POLYBENCH_2D(A,NI,NJ,ni,nj),
+		 DATA_TYPE POLYBENCH_2D(R,NJ,NJ,nj,nj),
+		 DATA_TYPE POLYBENCH_2D(Q,NI,NJ,ni,nj))
+{
+  int i, j;
+
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nj; j++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, A[i][j]);
+	if (i % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+  for (i = 0; i < nj; i++)
+    for (j = 0; j < nj; j++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, R[i][j]);
+	if (i % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+  for (i = 0; i < ni; i++)
+    for (j = 0; j < nj; j++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, Q[i][j]);
+	if (i % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_gramschmidt(int ni, int nj,
+			DATA_TYPE POLYBENCH_2D(A,NI,NJ,ni,nj),
+			DATA_TYPE POLYBENCH_2D(R,NJ,NJ,nj,nj),
+			DATA_TYPE POLYBENCH_2D(Q,NI,NJ,ni,nj))
+{
+  int i, j, k;
+
+  DATA_TYPE nrm;
+
+#pragma scop
+  for (k = 0; k < _PB_NJ; k++)
+    {
+      nrm = 0;
+      for (i = 0; i < _PB_NI; i++)
+        nrm += A[i][k] * A[i][k];
+      R[k][k] = sqrt(nrm);
+      for (i = 0; i < _PB_NI; i++)
+        Q[i][k] = A[i][k] / R[k][k];
+      for (j = k + 1; j < _PB_NJ; j++)
+	{
+	  R[k][j] = 0;
+	  for (i = 0; i < _PB_NI; i++)
+	    R[k][j] += Q[i][k] * A[i][j];
+	  for (i = 0; i < _PB_NI; i++)
+	    A[i][j] = A[i][j] - Q[i][k] * R[k][j];
+	}
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int ni = NI;
+  int nj = NJ;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NI,NJ,ni,nj);
+  POLYBENCH_2D_ARRAY_DECL(R,DATA_TYPE,NJ,NJ,nj,nj);
+  POLYBENCH_2D_ARRAY_DECL(Q,DATA_TYPE,NI,NJ,ni,nj);
+
+  /* Initialize array(s). */
+  init_array (ni, nj,
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(R),
+	      POLYBENCH_ARRAY(Q));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_gramschmidt (ni, nj,
+		      POLYBENCH_ARRAY(A),
+		      POLYBENCH_ARRAY(R),
+		      POLYBENCH_ARRAY(Q));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(ni, nj, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(R), POLYBENCH_ARRAY(Q)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(R);
+  POLYBENCH_FREE_ARRAY(Q);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/gramschmidt/gramschmidt.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/gramschmidt/gramschmidt.h
new file mode 100644
index 000000000..0731f6d38
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/gramschmidt/gramschmidt.h
@@ -0,0 +1,54 @@
+/**
+ * gramschmidt.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef GRAMSCHMIDT_H
+# define GRAMSCHMIDT_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NI) && !defined(NJ)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NI 32
+#   define NJ 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NI 128
+#   define NJ 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NI 512
+#   define NJ 512
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NI 2000
+#   define NJ 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NI 4000
+#   define NJ 4000
+#  endif
+# endif /* !N */
+
+# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni)
+# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !GRAMSCHMIDT */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/lu/lu.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/lu/lu.c
new file mode 100644
index 000000000..dd88fb72d
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/lu/lu.c
@@ -0,0 +1,104 @@
+/**
+ * lu.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 1024. */
+#include "lu.h"
+
+
+/* Array initialization. */
+static
+void init_array (int n,
+		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++)
+      A[i][j] = ((DATA_TYPE) (i+1)*(j+1)) / n;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++) {
+      fprintf (stderr, DATA_PRINTF_MODIFIER, A[i][j]);
+      if ((i * n + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_lu(int n,
+	       DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+{
+  int i, j, k;
+
+#pragma scop
+  for (k = 0; k < _PB_N; k++)
+    {
+      for (j = k + 1; j < _PB_N; j++)
+	A[k][j] = A[k][j] / A[k][k];
+      for(i = k + 1; i < _PB_N; i++)
+	for (j = k + 1; j < _PB_N; j++)
+	  A[i][j] = A[i][j] - A[i][k] * A[k][j];
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, N, N, n, n);
+
+
+  /* Initialize array(s). */
+  init_array (n, POLYBENCH_ARRAY(A));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_lu (n, POLYBENCH_ARRAY(A));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(A)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/lu/lu.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/lu/lu.h
new file mode 100644
index 000000000..fa5ea79f8
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/lu/lu.h
@@ -0,0 +1,48 @@
+/**
+ * lu.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef LU_H
+# define LU_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# ifndef N
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 4000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !LU */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/ludcmp/ludcmp.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/ludcmp/ludcmp.c
new file mode 100644
index 000000000..e32c2da87
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/ludcmp/ludcmp.c
@@ -0,0 +1,156 @@
+/**
+ * ludcmp.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 1024. */
+#include "ludcmp.h"
+
+
+/* Array initialization. */
+static
+void init_array (int n,
+		 DATA_TYPE POLYBENCH_2D(A,N+1,N+1,n+1,n+1),
+		 DATA_TYPE POLYBENCH_1D(b,N+1,n+1),
+		 DATA_TYPE POLYBENCH_1D(x,N+1,n+1),
+		 DATA_TYPE POLYBENCH_1D(y,N+1,n+1))
+{
+  int i, j;
+
+  for (i = 0; i <= n; i++)
+    {
+      x[i] = i + 1;
+      y[i] = (i+1)/n/2.0 + 1;
+      b[i] = (i+1)/n/2.0 + 42;
+      for (j = 0; j <= n; j++) {
+	A[i][j] = ((DATA_TYPE) (i+1)*(j+1)) / n;
+      }
+    }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_1D(x,N+1,n+1))
+
+{
+  int i;
+
+  for (i = 0; i <= n; i++) {
+    fprintf (stderr, DATA_PRINTF_MODIFIER, x[i]);
+    if (i % 20 == 0) fprintf (stderr, "\n");
+  }
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_ludcmp(int n,
+		   DATA_TYPE POLYBENCH_2D(A,N+1,N+1,n+1,n+1),
+		   DATA_TYPE POLYBENCH_1D(b,N+1,n+1),
+		   DATA_TYPE POLYBENCH_1D(x,N+1,n+1),
+		   DATA_TYPE POLYBENCH_1D(y,N+1,n+1))
+{
+  int i, j, k;
+
+  DATA_TYPE w;
+
+#pragma scop
+  b[0] = 1.0;
+  for (i = 0; i < _PB_N; i++)
+    {
+      for (j = i+1; j <= _PB_N; j++)
+        {
+	  w = A[j][i];
+	  for (k = 0; k < i; k++)
+	    w = w- A[j][k] * A[k][i];
+	  A[j][i] = w / A[i][i];
+        }
+      for (j = i+1; j <= _PB_N; j++)
+        {
+	  w = A[i+1][j];
+	  for (k = 0; k <= i; k++)
+	    w = w  - A[i+1][k] * A[k][j];
+	  A[i+1][j] = w;
+        }
+    }
+  y[0] = b[0];
+  for (i = 1; i <= _PB_N; i++)
+    {
+      w = b[i];
+      for (j = 0; j < i; j++)
+	w = w - A[i][j] * y[j];
+      y[i] = w;
+    }
+  x[_PB_N] = y[_PB_N] / A[_PB_N][_PB_N];
+  for (i = 0; i <= _PB_N - 1; i++)
+    {
+      w = y[_PB_N - 1 - (i)];
+      for (j = _PB_N - i; j <= _PB_N; j++)
+	w = w - A[_PB_N - 1 - i][j] * x[j];
+      x[_PB_N - 1 - i] = w / A[_PB_N - 1 - (i)][_PB_N - 1-(i)];
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, N+1, N+1, n+1, n+1);
+  POLYBENCH_1D_ARRAY_DECL(b, DATA_TYPE, N+1, n+1);
+  POLYBENCH_1D_ARRAY_DECL(x, DATA_TYPE, N+1, n+1);
+  POLYBENCH_1D_ARRAY_DECL(y, DATA_TYPE, N+1, n+1);
+
+
+  /* Initialize array(s). */
+  init_array (n,
+	      POLYBENCH_ARRAY(A),
+	      POLYBENCH_ARRAY(b),
+	      POLYBENCH_ARRAY(x),
+	      POLYBENCH_ARRAY(y));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_ludcmp (n,
+		 POLYBENCH_ARRAY(A),
+		 POLYBENCH_ARRAY(b),
+		 POLYBENCH_ARRAY(x),
+		 POLYBENCH_ARRAY(y));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(x)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(b);
+  POLYBENCH_FREE_ARRAY(x);
+  POLYBENCH_FREE_ARRAY(y);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/ludcmp/ludcmp.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/ludcmp/ludcmp.h
new file mode 100644
index 000000000..84524d9b4
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/linear-algebra/solvers/ludcmp/ludcmp.h
@@ -0,0 +1,48 @@
+/**
+ * ludcmp.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef LUDCMP_H
+# define LUDCMP_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# ifndef N
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 4000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !LUDCMP */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/floyd-warshall/floyd-warshall.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/floyd-warshall/floyd-warshall.c
new file mode 100644
index 000000000..88b52646b
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/floyd-warshall/floyd-warshall.c
@@ -0,0 +1,103 @@
+/**
+ * floyd-warshall.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 1024. */
+#include "floyd-warshall.h"
+
+
+/* Array initialization. */
+static
+void init_array (int n,
+		 DATA_TYPE POLYBENCH_2D(path,N,N,n,n))
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++)
+      path[i][j] = ((DATA_TYPE) (i+1)*(j+1)) / n;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_2D(path,N,N,n,n))
+
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++) {
+      fprintf (stderr, DATA_PRINTF_MODIFIER, path[i][j]);
+      if ((i * n + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_floyd_warshall(int n,
+			   DATA_TYPE POLYBENCH_2D(path,N,N,n,n))
+{
+  int i, j, k;
+
+#pragma scop
+  for (k = 0; k < _PB_N; k++)
+    {
+      for(i = 0; i < _PB_N; i++)
+	for (j = 0; j < _PB_N; j++)
+	  path[i][j] = path[i][j] < path[i][k] + path[k][j] ?
+	    path[i][j] : path[i][k] + path[k][j];
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(path, DATA_TYPE, N, N, n, n);
+
+
+  /* Initialize array(s). */
+  init_array (n, POLYBENCH_ARRAY(path));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_floyd_warshall (n, POLYBENCH_ARRAY(path));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(path)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(path);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/floyd-warshall/floyd-warshall.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/floyd-warshall/floyd-warshall.h
new file mode 100644
index 000000000..03b26703f
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/floyd-warshall/floyd-warshall.h
@@ -0,0 +1,48 @@
+/**
+ * floyd-warshall.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef FLOYD_WARSHALL_H
+# define FLOYD_WARSHALL_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# ifndef N
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 4000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !FLOYD_WARSHALL */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/reg_detect/reg_detect.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/reg_detect/reg_detect.c
new file mode 100644
index 000000000..be728a12a
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/reg_detect/reg_detect.c
@@ -0,0 +1,147 @@
+/**
+ * reg_detect.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is int, default size is 50. */
+#include "reg_detect.h"
+
+
+/* Array initialization. */
+static
+void init_array(int maxgrid,
+		DATA_TYPE POLYBENCH_2D(sum_tang,MAXGRID,MAXGRID,maxgrid,maxgrid),
+		DATA_TYPE POLYBENCH_2D(mean,MAXGRID,MAXGRID,maxgrid,maxgrid),
+		DATA_TYPE POLYBENCH_2D(path,MAXGRID,MAXGRID,maxgrid,maxgrid))
+{
+  int i, j;
+
+  for (i = 0; i < maxgrid; i++)
+    for (j = 0; j < maxgrid; j++) {
+      sum_tang[i][j] = (DATA_TYPE)((i+1)*(j+1));
+      mean[i][j] = ((DATA_TYPE) i-j) / maxgrid;
+      path[i][j] = ((DATA_TYPE) i*(j-1)) / maxgrid;
+    }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int maxgrid,
+		 DATA_TYPE POLYBENCH_2D(path,MAXGRID,MAXGRID,maxgrid,maxgrid))
+{
+  int i, j;
+
+  for (i = 0; i < maxgrid; i++)
+    for (j = 0; j < maxgrid; j++) {
+      fprintf (stderr, DATA_PRINTF_MODIFIER, path[i][j]);
+      if ((i * maxgrid + j) % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+/* Source (modified): http://www.cs.uic.edu/~iluican/reg_detect.c */
+static
+void kernel_reg_detect(int niter, int maxgrid, int length,
+		       DATA_TYPE POLYBENCH_2D(sum_tang,MAXGRID,MAXGRID,maxgrid,maxgrid),
+		       DATA_TYPE POLYBENCH_2D(mean,MAXGRID,MAXGRID,maxgrid,maxgrid),
+		       DATA_TYPE POLYBENCH_2D(path,MAXGRID,MAXGRID,maxgrid,maxgrid),
+		       DATA_TYPE POLYBENCH_3D(diff,MAXGRID,MAXGRID,LENGTH,maxgrid,maxgrid,length),
+		       DATA_TYPE POLYBENCH_3D(sum_diff,MAXGRID,MAXGRID,LENGTH,maxgrid,maxgrid,length))
+{
+  int t, i, j, cnt;
+
+#pragma scop
+  for (t = 0; t < _PB_NITER; t++)
+    {
+      for (j = 0; j <= _PB_MAXGRID - 1; j++)
+	for (i = j; i <= _PB_MAXGRID - 1; i++)
+	  for (cnt = 0; cnt <= _PB_LENGTH - 1; cnt++)
+	    diff[j][i][cnt] = sum_tang[j][i];
+
+      for (j = 0; j <= _PB_MAXGRID - 1; j++)
+        {
+	  for (i = j; i <= _PB_MAXGRID - 1; i++)
+            {
+	      sum_diff[j][i][0] = diff[j][i][0];
+	      for (cnt = 1; cnt <= _PB_LENGTH - 1; cnt++)
+		sum_diff[j][i][cnt] = sum_diff[j][i][cnt - 1] + diff[j][i][cnt];
+	      mean[j][i] = sum_diff[j][i][_PB_LENGTH - 1];
+            }
+        }
+
+      for (i = 0; i <= _PB_MAXGRID - 1; i++)
+	path[0][i] = mean[0][i];
+
+      for (j = 1; j <= _PB_MAXGRID - 1; j++)
+	for (i = j; i <= _PB_MAXGRID - 1; i++)
+	  path[j][i] = path[j - 1][i - 1] + mean[j][i];
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int niter = NITER;
+  int maxgrid = MAXGRID;
+  int length = LENGTH;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(sum_tang, DATA_TYPE, MAXGRID, MAXGRID, maxgrid, maxgrid);
+  POLYBENCH_2D_ARRAY_DECL(mean, DATA_TYPE, MAXGRID, MAXGRID, maxgrid, maxgrid);
+  POLYBENCH_2D_ARRAY_DECL(path, DATA_TYPE, MAXGRID, MAXGRID, maxgrid, maxgrid);
+  POLYBENCH_3D_ARRAY_DECL(diff, DATA_TYPE, MAXGRID, MAXGRID, LENGTH, maxgrid, maxgrid, length);
+  POLYBENCH_3D_ARRAY_DECL(sum_diff, DATA_TYPE, MAXGRID, MAXGRID, LENGTH, maxgrid, maxgrid, length);
+
+  /* Initialize array(s). */
+  init_array (maxgrid,
+	      POLYBENCH_ARRAY(sum_tang),
+	      POLYBENCH_ARRAY(mean),
+	      POLYBENCH_ARRAY(path));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_reg_detect (niter, maxgrid, length,
+		     POLYBENCH_ARRAY(sum_tang),
+		     POLYBENCH_ARRAY(mean),
+		     POLYBENCH_ARRAY(path),
+		     POLYBENCH_ARRAY(diff),
+		     POLYBENCH_ARRAY(sum_diff));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(maxgrid, POLYBENCH_ARRAY(path)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(sum_tang);
+  POLYBENCH_FREE_ARRAY(mean);
+  POLYBENCH_FREE_ARRAY(path);
+  POLYBENCH_FREE_ARRAY(diff);
+  POLYBENCH_FREE_ARRAY(sum_diff);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/reg_detect/reg_detect.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/reg_detect/reg_detect.h
new file mode 100644
index 000000000..2084042d2
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/medley/reg_detect/reg_detect.h
@@ -0,0 +1,60 @@
+/**
+ * reg_detect.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef REG_DETECT_H
+# define REG_DETECT_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NITER) && !defined(LENGTH) && !defined(MAXGRID)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define NITER 10
+#   define LENGTH 32
+#   define MAXGRID 2
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define NITER 100
+#   define LENGTH 50
+#   define MAXGRID 6
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define NITER 10000
+#   define LENGTH 64
+#   define MAXGRID 6
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define NITER 1000
+#   define LENGTH 500
+#   define MAXGRID 12
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define NITER 10000
+#   define LENGTH 500
+#   define MAXGRID 12
+#  endif
+# endif /* !N */
+
+# define _PB_NITER POLYBENCH_LOOP_BOUND(NITER,niter)
+# define _PB_LENGTH POLYBENCH_LOOP_BOUND(LENGTH,length)
+# define _PB_MAXGRID POLYBENCH_LOOP_BOUND(MAXGRID,maxgrid)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE int
+#  define DATA_PRINTF_MODIFIER "%d "
+# endif
+
+
+#endif /* !REG_DETECT */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/polybench.py b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/polybench.py
new file mode 100644
index 000000000..7235911b5
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/polybench.py
@@ -0,0 +1,68 @@
+import subprocess
+import os
+import csv
+import sys
+from enum import Enum
+import math
+
+
+class Benchmark(Enum):
+    TWO_MM = "2mm"
+    THREE_MM = "3mm"
+    ADI = "adi"
+    ATAX = "atax"
+    BICG = "bicg"
+    CHOLESKY = "cholesky"
+    CORRELATION = "correlation"
+    COVARIANCE = "covariance"
+    DOITGEN = "doitgen"
+    DURBIN = "durbin"
+    DYNPROG = "dynprog"
+    FDTD_2D = "fdtd-2d"
+    FDTD_APML = "fdtd-apml"
+    FLOYD_WARSHALL = "floyd-warshall"
+    GEMM = "gemm"
+    GEMVER = "gemver"
+    GESUMMV = "gesummv"
+    GRAMSCHMIDT = "gramschmidt"
+    JACOBI_1D_IMPER = "jacobi-1d-imper"
+    JACOBI_2D_IMPER = "jacobi-2d-imper"
+    LU = "lu"
+    LUDCMP = "ludcmp"
+    MVT = "mvt"
+    REG_DETECT = "reg_detect"
+    SEIDEL_2D = "seidel-2d"
+    SYMM = "symm"
+    SYR2K = "syr2k"
+    SYRK = "syrk"
+    TRISOLV = "trisolv"
+    TRMM = "trmm"
+
+class Capability(Enum):
+    NOCAP = "_nocap"
+    PURECAP = "_purecap"
+
+WARUMUP_ITERATIONS = 10
+BASE_ITERATIONS = 5
+MIN_TEST_TIME = 2
+
+os.chdir("./output")
+
+writer = csv.writer(sys.stdout)
+writer.writerow(["benchmark", "capability", "iteration", "time"])
+
+for bench in Benchmark:
+    for type in Capability:
+        warmup_execution_time = 1
+        for i in range(WARUMUP_ITERATIONS):
+            warmup_execution_time = float(
+                subprocess.run([f"./{bench.value}{type.value}"], capture_output=True, text=True).stdout
+            )
+
+        iterations = max(BASE_ITERATIONS, math.ceil(MIN_TEST_TIME / warmup_execution_time))
+
+        for i in range(iterations):
+            execution_time = float(
+                subprocess.run([f"./{bench.value}{type.value}"], capture_output=True, text=True).stdout
+            )
+            writer.writerow([bench.value, type.name, i, execution_time])
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/polybench_plot.py b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/polybench_plot.py
new file mode 100644
index 000000000..02b1e8078
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/polybench_plot.py
@@ -0,0 +1,92 @@
+import pandas as pd
+import matplotlib.pyplot as plt
+import numpy as np
+import sys
+
+# Read the CSV data
+if len(sys.argv) > 1:
+    df = pd.read_csv(sys.argv[1])
+else:
+    df = pd.read_csv(sys.stdin)
+
+# Group by benchmark and capability, then calculate mean and std for each group
+grouped_df = df.groupby(['benchmark', 'capability'])['time'].agg(['mean', 'std']).reset_index()
+
+# Create pivot tables with mean and std values
+pivot_mean = grouped_df.pivot(index='benchmark', columns='capability', values='mean')
+pivot_std = grouped_df.pivot(index='benchmark', columns='capability', values='std')
+
+# Calculate normalized values and errors
+# For NOCAP: value is 1.0, error is std/mean
+# For PURECAP: value is PURECAP/NOCAP ratio, error is propagated
+normalized_data = pd.DataFrame(index=pivot_mean.index)
+normalized_data['NOCAP_val'] = 1.0
+normalized_data['NOCAP_err'] = pivot_std['NOCAP'] / pivot_mean['NOCAP']
+normalized_data['PURECAP_val'] = pivot_mean['PURECAP'] / pivot_mean['NOCAP']
+normalized_data['PURECAP_err'] = normalized_data['PURECAP_val'] * np.sqrt(
+    (pivot_std['PURECAP'] / pivot_mean['PURECAP'])**2 +
+    (pivot_std['NOCAP'] / pivot_mean['NOCAP'])**2
+)
+
+# Sort benchmarks based on PURECAP/NOCAP ratio
+sorted_data = normalized_data.sort_values('PURECAP_val')
+
+# Create the figure and axis
+fig, ax = plt.subplots(figsize=(14, 10))
+
+# Set width of bars
+index = np.arange(len(sorted_data.index))
+bar_width = 0.35
+
+# Plot NOCAP values (always 1.0) with error bars
+nocap_bars = ax.bar(index - bar_width/2, sorted_data['NOCAP_val'],
+                   width=bar_width, color='lightblue', edgecolor='black',
+                   label='NOCAP (baseline)', alpha=0.7)
+
+# Add error bars for NOCAP
+ax.errorbar(index - bar_width/2, sorted_data['NOCAP_val'],
+           yerr=sorted_data['NOCAP_err'], fmt='none', color='black', capsize=3)
+
+# Plot PURECAP values (normalized to NOCAP) with error bars
+purecap_bars = ax.bar(index + bar_width/2, sorted_data['PURECAP_val'],
+                     width=bar_width, edgecolor='black',
+                     label='PURECAP (relative to NOCAP)', alpha=0.7)
+
+# Add error bars for PURECAP
+ax.errorbar(index + bar_width/2, sorted_data['PURECAP_val'],
+           yerr=sorted_data['PURECAP_err'], fmt='none', color='black', capsize=3)
+
+# # Add a horizontal line at y=1.0 to indicate the baseline
+# ax.axhline(y=1.0, color='black', linestyle='--', alpha=0.5)
+
+# # Add percentage labels for PURECAP bars
+# for i, ratio in enumerate(sorted_data['PURECAP_val']):
+#     pct_diff = (ratio - 1) * 100
+#     if abs(pct_diff) > 1:  # Only label if difference is more than 1%
+#         label = f"{pct_diff:.1f}%"
+#         y_pos = ratio + 0.05 if ratio > 1 else ratio - 0.1
+#         ax.text(i + bar_width/2, y_pos, label, ha='center', va='center',
+#                fontsize=8, color='black', fontweight='bold')
+
+# Customize the plot
+ax.set_xlabel('Benchmarks')
+ax.set_ylabel('Normalized Performance (NOCAP = 1.0)')
+ax.set_title('Polybench Performance: PURECAP vs NOCAP (Normalized)')
+ax.set_xticks(index)
+ax.set_xticklabels(sorted_data.index, rotation=45, ha='right')
+
+# Add legend
+ax.legend()
+
+# Set y-axis limits with some padding
+y_min = min(0.8, sorted_data['PURECAP_val'].min() * 0.9)
+y_max = max(1.2, sorted_data['PURECAP_val'].max() * 1.1)
+ax.set_ylim(y_min, y_max)
+
+# Set grid for better readability
+ax.grid(True, linestyle='--', alpha=0.3)
+
+# Tight layout to ensure labels fit
+plt.tight_layout()
+
+plt.savefig('./output/polybench_plot.svg', dpi=300, bbox_inches='tight')
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/adi/adi.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/adi/adi.c
new file mode 100644
index 000000000..08fb4fa35
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/adi/adi.c
@@ -0,0 +1,140 @@
+/**
+ * adi.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 10x1024x1024. */
+#include "adi.h"
+
+
+/* Array initialization. */
+static
+void init_array (int n,
+		 DATA_TYPE POLYBENCH_2D(X,N,N,n,n),
+		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n),
+		 DATA_TYPE POLYBENCH_2D(B,N,N,n,n))
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++)
+      {
+	X[i][j] = ((DATA_TYPE) i*(j+1) + 1) / n;
+	A[i][j] = ((DATA_TYPE) i*(j+2) + 2) / n;
+	B[i][j] = ((DATA_TYPE) i*(j+3) + 3) / n;
+      }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_2D(X,N,N,n,n))
+
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++) {
+      fprintf(stderr, DATA_PRINTF_MODIFIER, X[i][j]);
+      if ((i * N + j) % 20 == 0) fprintf(stderr, "\n");
+    }
+  fprintf(stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_adi(int tsteps,
+		int n,
+		DATA_TYPE POLYBENCH_2D(X,N,N,n,n),
+		DATA_TYPE POLYBENCH_2D(A,N,N,n,n),
+		DATA_TYPE POLYBENCH_2D(B,N,N,n,n))
+{
+  int t, i1, i2;
+
+#pragma scop
+  for (t = 0; t < _PB_TSTEPS; t++)
+    {
+      for (i1 = 0; i1 < _PB_N; i1++)
+	for (i2 = 1; i2 < _PB_N; i2++)
+	  {
+	    X[i1][i2] = X[i1][i2] - X[i1][i2-1] * A[i1][i2] / B[i1][i2-1];
+	    B[i1][i2] = B[i1][i2] - A[i1][i2] * A[i1][i2] / B[i1][i2-1];
+	  }
+
+      for (i1 = 0; i1 < _PB_N; i1++)
+	X[i1][_PB_N-1] = X[i1][_PB_N-1] / B[i1][_PB_N-1];
+
+      for (i1 = 0; i1 < _PB_N; i1++)
+	for (i2 = 0; i2 < _PB_N-2; i2++)
+	  X[i1][_PB_N-i2-2] = (X[i1][_PB_N-2-i2] - X[i1][_PB_N-2-i2-1] * A[i1][_PB_N-i2-3]) / B[i1][_PB_N-3-i2];
+
+      for (i1 = 1; i1 < _PB_N; i1++)
+	for (i2 = 0; i2 < _PB_N; i2++) {
+	  X[i1][i2] = X[i1][i2] - X[i1-1][i2] * A[i1][i2] / B[i1-1][i2];
+	  B[i1][i2] = B[i1][i2] - A[i1][i2] * A[i1][i2] / B[i1-1][i2];
+	}
+
+      for (i2 = 0; i2 < _PB_N; i2++)
+	X[_PB_N-1][i2] = X[_PB_N-1][i2] / B[_PB_N-1][i2];
+
+      for (i1 = 0; i1 < _PB_N-2; i1++)
+	for (i2 = 0; i2 < _PB_N; i2++)
+	  X[_PB_N-2-i1][i2] = (X[_PB_N-2-i1][i2] - X[_PB_N-i1-3][i2] * A[_PB_N-3-i1][i2]) / B[_PB_N-2-i1][i2];
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+  int tsteps = TSTEPS;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(X, DATA_TYPE, N, N, n, n);
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, N, N, n, n);
+  POLYBENCH_2D_ARRAY_DECL(B, DATA_TYPE, N, N, n, n);
+
+
+  /* Initialize array(s). */
+  init_array (n, POLYBENCH_ARRAY(X), POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_adi (tsteps, n, POLYBENCH_ARRAY(X),
+	      POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(X)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(X);
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(B);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/adi/adi.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/adi/adi.h
new file mode 100644
index 000000000..a4511ace1
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/adi/adi.h
@@ -0,0 +1,54 @@
+/**
+ * adi.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef ADI_H
+# define ADI_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(TSTEPS) && ! defined(N)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define TSTEPS 2
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define TSTEPS 10
+#   define N 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define TSTEPS 50
+#   define N 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define TSTEPS 50
+#   define N 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define TSTEPS 100
+#   define N 4000
+#  endif
+# endif /* !N */
+
+# define _PB_TSTEPS POLYBENCH_LOOP_BOUND(TSTEPS,tsteps)
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !ADI */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-2d/fdtd-2d.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-2d/fdtd-2d.c
new file mode 100644
index 000000000..9f13e8866
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-2d/fdtd-2d.c
@@ -0,0 +1,150 @@
+/**
+ * fdtd-2d.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 50x1000x1000. */
+#include "fdtd-2d.h"
+
+
+/* Array initialization. */
+static
+void init_array (int tmax,
+		 int nx,
+		 int ny,
+		 DATA_TYPE POLYBENCH_2D(ex,NX,NY,nx,ny),
+		 DATA_TYPE POLYBENCH_2D(ey,NX,NY,nx,ny),
+		 DATA_TYPE POLYBENCH_2D(hz,NX,NY,nx,ny),
+		 DATA_TYPE POLYBENCH_1D(_fict_,TMAX,tmax))
+{
+  int i, j;
+
+  for (i = 0; i < tmax; i++)
+    _fict_[i] = (DATA_TYPE) i;
+  for (i = 0; i < nx; i++)
+    for (j = 0; j < ny; j++)
+      {
+	ex[i][j] = ((DATA_TYPE) i*(j+1)) / nx;
+	ey[i][j] = ((DATA_TYPE) i*(j+2)) / ny;
+	hz[i][j] = ((DATA_TYPE) i*(j+3)) / nx;
+      }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int nx,
+		 int ny,
+		 DATA_TYPE POLYBENCH_2D(ex,NX,NY,nx,ny),
+		 DATA_TYPE POLYBENCH_2D(ey,NX,NY,nx,ny),
+		 DATA_TYPE POLYBENCH_2D(hz,NX,NY,nx,ny))
+{
+  int i, j;
+
+  for (i = 0; i < nx; i++)
+    for (j = 0; j < ny; j++) {
+      fprintf(stderr, DATA_PRINTF_MODIFIER, ex[i][j]);
+      fprintf(stderr, DATA_PRINTF_MODIFIER, ey[i][j]);
+      fprintf(stderr, DATA_PRINTF_MODIFIER, hz[i][j]);
+      if ((i * nx + j) % 20 == 0) fprintf(stderr, "\n");
+    }
+  fprintf(stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_fdtd_2d(int tmax,
+		    int nx,
+		    int ny,
+		    DATA_TYPE POLYBENCH_2D(ex,NX,NY,nx,ny),
+		    DATA_TYPE POLYBENCH_2D(ey,NX,NY,nx,ny),
+		    DATA_TYPE POLYBENCH_2D(hz,NX,NY,nx,ny),
+		    DATA_TYPE POLYBENCH_1D(_fict_,TMAX,tmax))
+{
+  int t, i, j;
+
+#pragma scop
+
+  for(t = 0; t < _PB_TMAX; t++)
+    {
+      for (j = 0; j < _PB_NY; j++)
+	ey[0][j] = _fict_[t];
+      for (i = 1; i < _PB_NX; i++)
+	for (j = 0; j < _PB_NY; j++)
+	  ey[i][j] = ey[i][j] - 0.5*(hz[i][j]-hz[i-1][j]);
+      for (i = 0; i < _PB_NX; i++)
+	for (j = 1; j < _PB_NY; j++)
+	  ex[i][j] = ex[i][j] - 0.5*(hz[i][j]-hz[i][j-1]);
+      for (i = 0; i < _PB_NX - 1; i++)
+	for (j = 0; j < _PB_NY - 1; j++)
+	  hz[i][j] = hz[i][j] - 0.7*  (ex[i][j+1] - ex[i][j] +
+				       ey[i+1][j] - ey[i][j]);
+    }
+
+#pragma endscop
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int tmax = TMAX;
+  int nx = NX;
+  int ny = NY;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(ex,DATA_TYPE,NX,NY,nx,ny);
+  POLYBENCH_2D_ARRAY_DECL(ey,DATA_TYPE,NX,NY,nx,ny);
+  POLYBENCH_2D_ARRAY_DECL(hz,DATA_TYPE,NX,NY,nx,ny);
+  POLYBENCH_1D_ARRAY_DECL(_fict_,DATA_TYPE,TMAX,tmax);
+
+  /* Initialize array(s). */
+  init_array (tmax, nx, ny,
+	      POLYBENCH_ARRAY(ex),
+	      POLYBENCH_ARRAY(ey),
+	      POLYBENCH_ARRAY(hz),
+	      POLYBENCH_ARRAY(_fict_));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_fdtd_2d (tmax, nx, ny,
+		  POLYBENCH_ARRAY(ex),
+		  POLYBENCH_ARRAY(ey),
+		  POLYBENCH_ARRAY(hz),
+		  POLYBENCH_ARRAY(_fict_));
+
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(nx, ny, POLYBENCH_ARRAY(ex),
+				    POLYBENCH_ARRAY(ey),
+				    POLYBENCH_ARRAY(hz)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(ex);
+  POLYBENCH_FREE_ARRAY(ey);
+  POLYBENCH_FREE_ARRAY(hz);
+  POLYBENCH_FREE_ARRAY(_fict_);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-2d/fdtd-2d.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-2d/fdtd-2d.h
new file mode 100644
index 000000000..edcafb3bf
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-2d/fdtd-2d.h
@@ -0,0 +1,60 @@
+/**
+ * fdtd-2d.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef FDTD_2D_H
+# define FDTD_2D_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(NX) && ! defined(NY) && !defined(TMAX)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define TMAX 2
+#   define NX 32
+#   define NY 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define TMAX 10
+#   define NX 500
+#   define NY 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define TMAX 50
+#   define NX 1000
+#   define NY 1000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define TMAX 50
+#   define NX 2000
+#   define NY 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define TMAX 100
+#   define NX 4000
+#   define NY 4000
+#  endif
+# endif /* !N */
+
+# define _PB_TMAX POLYBENCH_LOOP_BOUND(TMAX,tmax)
+# define _PB_NX POLYBENCH_LOOP_BOUND(NX,nx)
+# define _PB_NY POLYBENCH_LOOP_BOUND(NY,ny)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !FDTD_2D */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-apml/fdtd-apml.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-apml/fdtd-apml.c
new file mode 100644
index 000000000..ff104647d
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-apml/fdtd-apml.c
@@ -0,0 +1,256 @@
+/**
+ * fdtd-apml.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 256x256x256. */
+#include "fdtd-apml.h"
+
+
+/* Array initialization. */
+static
+void init_array (int cz,
+		 int cxm,
+		 int cym,
+		 DATA_TYPE *mui,
+		 DATA_TYPE *ch,
+		 DATA_TYPE POLYBENCH_2D(Ax,CZ+1,CYM+1,cz+1,cym+1),
+		 DATA_TYPE POLYBENCH_2D(Ry,CZ+1,CYM+1,cz+1,cym+1),
+		 DATA_TYPE POLYBENCH_3D(Ex,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1),
+		 DATA_TYPE POLYBENCH_3D(Ey,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1),
+		 DATA_TYPE POLYBENCH_3D(Hz,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1),
+		 DATA_TYPE POLYBENCH_1D(czm,CZ+1,cz+1),
+		 DATA_TYPE POLYBENCH_1D(czp,CZ+1,cz+1),
+		 DATA_TYPE POLYBENCH_1D(cxmh,CXM+1,cxm+1),
+		 DATA_TYPE POLYBENCH_1D(cxph,CXM+1,cxm+1),
+		 DATA_TYPE POLYBENCH_1D(cymh,CYM+1,cym+1),
+		 DATA_TYPE POLYBENCH_1D(cyph,CYM+1,cym+1))
+{
+  int i, j, k;
+  *mui = 2341;
+  *ch = 42;
+  for (i = 0; i <= cz; i++)
+    {
+      czm[i] = ((DATA_TYPE) i + 1) / cxm;
+      czp[i] = ((DATA_TYPE) i + 2) / cxm;
+    }
+  for (i = 0; i <= cxm; i++)
+    {
+      cxmh[i] = ((DATA_TYPE) i + 3) / cxm;
+      cxph[i] = ((DATA_TYPE) i + 4) / cxm;
+    }
+  for (i = 0; i <= cym; i++)
+    {
+      cymh[i] = ((DATA_TYPE) i + 5) / cxm;
+      cyph[i] = ((DATA_TYPE) i + 6) / cxm;
+    }
+
+  for (i = 0; i <= cz; i++)
+    for (j = 0; j <= cym; j++)
+      {
+	Ry[i][j] = ((DATA_TYPE) i*(j+1) + 10) / cym;
+	Ax[i][j] = ((DATA_TYPE) i*(j+2) + 11) / cym;
+	for (k = 0; k <= cxm; k++)
+	  {
+	    Ex[i][j][k] = ((DATA_TYPE) i*(j+3) + k + 1) / cxm;
+	    Ey[i][j][k] = ((DATA_TYPE) i*(j+4) + k + 2) / cym;
+	    Hz[i][j][k] = ((DATA_TYPE) i*(j+5) + k + 3) / cz;
+	  }
+      }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int cz,
+		 int cxm,
+		 int cym,
+		 DATA_TYPE POLYBENCH_3D(Bza,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1),
+		 DATA_TYPE POLYBENCH_3D(Ex,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1),
+		 DATA_TYPE POLYBENCH_3D(Ey,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1),
+		 DATA_TYPE POLYBENCH_3D(Hz,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1))
+{
+  int i, j, k;
+
+  for (i = 0; i <= cz; i++)
+    for (j = 0; j <= cym; j++)
+      for (k = 0; k <= cxm; k++) {
+	fprintf(stderr, DATA_PRINTF_MODIFIER, Bza[i][j][k]);
+	fprintf(stderr, DATA_PRINTF_MODIFIER, Ex[i][j][k]);
+	fprintf(stderr, DATA_PRINTF_MODIFIER, Ey[i][j][k]);
+	fprintf(stderr, DATA_PRINTF_MODIFIER, Hz[i][j][k]);
+	if ((i * cxm + j) % 20 == 0) fprintf(stderr, "\n");
+      }
+  fprintf(stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_fdtd_apml(int cz,
+		      int cxm,
+		      int cym,
+		      DATA_TYPE mui,
+		      DATA_TYPE ch,
+		      DATA_TYPE POLYBENCH_2D(Ax,CZ+1,CYM+1,cz+1,cym+1),
+		      DATA_TYPE POLYBENCH_2D(Ry,CZ+1,CYM+1,cz+1,cym+1),
+		      DATA_TYPE POLYBENCH_2D(clf,CYM+1,CXM+1,cym+1,cxm+1),
+		      DATA_TYPE POLYBENCH_2D(tmp,CYM+1,CXM+1,cym+1,cxm+1),
+		      DATA_TYPE POLYBENCH_3D(Bza,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1),
+		      DATA_TYPE POLYBENCH_3D(Ex,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1),
+		      DATA_TYPE POLYBENCH_3D(Ey,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1),
+		      DATA_TYPE POLYBENCH_3D(Hz,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1),
+		      DATA_TYPE POLYBENCH_1D(czm,CZ+1,cz+1),
+		      DATA_TYPE POLYBENCH_1D(czp,CZ+1,cz+1),
+		      DATA_TYPE POLYBENCH_1D(cxmh,CXM+1,cxm+1),
+		      DATA_TYPE POLYBENCH_1D(cxph,CXM+1,cxm+1),
+		      DATA_TYPE POLYBENCH_1D(cymh,CYM+1,cym+1),
+		      DATA_TYPE POLYBENCH_1D(cyph,CYM+1,cym+1))
+{
+  int iz, iy, ix;
+
+#pragma scop
+  for (iz = 0; iz < _PB_CZ; iz++)
+    {
+      for (iy = 0; iy < _PB_CYM; iy++)
+	{
+	  for (ix = 0; ix < _PB_CXM; ix++)
+	    {
+	      clf[iz][iy] = Ex[iz][iy][ix] - Ex[iz][iy+1][ix] + Ey[iz][iy][ix+1] - Ey[iz][iy][ix];
+	      tmp[iz][iy] = (cymh[iy] / cyph[iy]) * Bza[iz][iy][ix] - (ch / cyph[iy]) * clf[iz][iy];
+	      Hz[iz][iy][ix] = (cxmh[ix] /cxph[ix]) * Hz[iz][iy][ix]
+		+ (mui * czp[iz] / cxph[ix]) * tmp[iz][iy]
+		- (mui * czm[iz] / cxph[ix]) * Bza[iz][iy][ix];
+	      Bza[iz][iy][ix] = tmp[iz][iy];
+	    }
+	  clf[iz][iy] = Ex[iz][iy][_PB_CXM] - Ex[iz][iy+1][_PB_CXM] + Ry[iz][iy] - Ey[iz][iy][_PB_CXM];
+	  tmp[iz][iy] = (cymh[iy] / cyph[iy]) * Bza[iz][iy][_PB_CXM] - (ch / cyph[iy]) * clf[iz][iy];
+	  Hz[iz][iy][_PB_CXM]=(cxmh[_PB_CXM] / cxph[_PB_CXM]) * Hz[iz][iy][_PB_CXM]
+	    + (mui * czp[iz] / cxph[_PB_CXM]) * tmp[iz][iy]
+	    - (mui * czm[iz] / cxph[_PB_CXM]) * Bza[iz][iy][_PB_CXM];
+	  Bza[iz][iy][_PB_CXM] = tmp[iz][iy];
+	  for (ix = 0; ix < _PB_CXM; ix++)
+	    {
+	      clf[iz][iy] = Ex[iz][_PB_CYM][ix] - Ax[iz][ix] + Ey[iz][_PB_CYM][ix+1] - Ey[iz][_PB_CYM][ix];
+	      tmp[iz][iy] = (cymh[_PB_CYM] / cyph[iy]) * Bza[iz][iy][ix] - (ch / cyph[iy]) * clf[iz][iy];
+	      Hz[iz][_PB_CYM][ix] = (cxmh[ix] / cxph[ix]) * Hz[iz][_PB_CYM][ix]
+		+ (mui * czp[iz] / cxph[ix]) * tmp[iz][iy]
+		- (mui * czm[iz] / cxph[ix]) * Bza[iz][_PB_CYM][ix];
+	      Bza[iz][_PB_CYM][ix] = tmp[iz][iy];
+	    }
+	  clf[iz][iy] = Ex[iz][_PB_CYM][_PB_CXM] - Ax[iz][_PB_CXM] + Ry[iz][_PB_CYM] - Ey[iz][_PB_CYM][_PB_CXM];
+	  tmp[iz][iy] = (cymh[_PB_CYM] / cyph[_PB_CYM]) * Bza[iz][_PB_CYM][_PB_CXM] - (ch / cyph[_PB_CYM]) * clf[iz][iy];
+	  Hz[iz][_PB_CYM][_PB_CXM] = (cxmh[_PB_CXM] / cxph[_PB_CXM]) * Hz[iz][_PB_CYM][_PB_CXM]
+	    + (mui * czp[iz] / cxph[_PB_CXM]) * tmp[iz][iy]
+	    - (mui * czm[iz] / cxph[_PB_CXM]) * Bza[iz][_PB_CYM][_PB_CXM];
+	  Bza[iz][_PB_CYM][_PB_CXM] = tmp[iz][iy];
+	}
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int cz = CZ;
+  int cym = CYM;
+  int cxm = CXM;
+
+  /* Variable declaration/allocation. */
+  DATA_TYPE mui;
+  DATA_TYPE ch;
+  POLYBENCH_2D_ARRAY_DECL(Ax,DATA_TYPE,CZ+1,CYM+1,cz+1,cym+1);
+  POLYBENCH_2D_ARRAY_DECL(Ry,DATA_TYPE,CZ+1,CYM+1,cz+1,cym+1);
+  POLYBENCH_2D_ARRAY_DECL(clf,DATA_TYPE,CYM+1,CXM+1,cym+1,cxm+1);
+  POLYBENCH_2D_ARRAY_DECL(tmp,DATA_TYPE,CYM+1,CXM+1,cym+1,cxm+1);
+  POLYBENCH_3D_ARRAY_DECL(Bza,DATA_TYPE,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1);
+  POLYBENCH_3D_ARRAY_DECL(Ex,DATA_TYPE,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1);
+  POLYBENCH_3D_ARRAY_DECL(Ey,DATA_TYPE,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1);
+  POLYBENCH_3D_ARRAY_DECL(Hz,DATA_TYPE,CZ+1,CYM+1,CXM+1,cz+1,cym+1,cxm+1);
+  POLYBENCH_1D_ARRAY_DECL(czm,DATA_TYPE,CZ+1,cz+1);
+  POLYBENCH_1D_ARRAY_DECL(czp,DATA_TYPE,CZ+1,cz+1);
+  POLYBENCH_1D_ARRAY_DECL(cxmh,DATA_TYPE,CXM+1,cxm+1);
+  POLYBENCH_1D_ARRAY_DECL(cxph,DATA_TYPE,CXM+1,cxm+1);
+  POLYBENCH_1D_ARRAY_DECL(cymh,DATA_TYPE,CYM+1,cym+1);
+  POLYBENCH_1D_ARRAY_DECL(cyph,DATA_TYPE,CYM+1,cym+1);
+
+  /* Initialize array(s). */
+  init_array (cz, cxm, cym, &mui, &ch,
+  	      POLYBENCH_ARRAY(Ax),
+  	      POLYBENCH_ARRAY(Ry),
+  	      POLYBENCH_ARRAY(Ex),
+  	      POLYBENCH_ARRAY(Ey),
+  	      POLYBENCH_ARRAY(Hz),
+  	      POLYBENCH_ARRAY(czm),
+  	      POLYBENCH_ARRAY(czp),
+  	      POLYBENCH_ARRAY(cxmh),
+  	      POLYBENCH_ARRAY(cxph),
+  	      POLYBENCH_ARRAY(cymh),
+  	      POLYBENCH_ARRAY(cyph));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_fdtd_apml (cz, cxm, cym, mui, ch,
+  		    POLYBENCH_ARRAY(Ax),
+  		    POLYBENCH_ARRAY(Ry),
+  		    POLYBENCH_ARRAY(clf),
+  		    POLYBENCH_ARRAY(tmp),
+  		    POLYBENCH_ARRAY(Bza),
+  		    POLYBENCH_ARRAY(Ex),
+  		    POLYBENCH_ARRAY(Ey),
+  		    POLYBENCH_ARRAY(Hz),
+  		    POLYBENCH_ARRAY(czm),
+  		    POLYBENCH_ARRAY(czp),
+  		    POLYBENCH_ARRAY(cxmh),
+  		    POLYBENCH_ARRAY(cxph),
+  		    POLYBENCH_ARRAY(cymh),
+  		    POLYBENCH_ARRAY(cyph));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(cz, cxm, cym,
+  				    POLYBENCH_ARRAY(Bza),
+  				    POLYBENCH_ARRAY(Ex),
+  				    POLYBENCH_ARRAY(Ey),
+  				    POLYBENCH_ARRAY(Hz)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(Ax);
+  POLYBENCH_FREE_ARRAY(Ry);
+  POLYBENCH_FREE_ARRAY(clf);
+  POLYBENCH_FREE_ARRAY(tmp);
+  POLYBENCH_FREE_ARRAY(Bza);
+  POLYBENCH_FREE_ARRAY(Ex);
+  POLYBENCH_FREE_ARRAY(Ey);
+  POLYBENCH_FREE_ARRAY(Hz);
+  POLYBENCH_FREE_ARRAY(czm);
+  POLYBENCH_FREE_ARRAY(czp);
+  POLYBENCH_FREE_ARRAY(cxmh);
+  POLYBENCH_FREE_ARRAY(cxph);
+  POLYBENCH_FREE_ARRAY(cymh);
+  POLYBENCH_FREE_ARRAY(cyph);
+
+  return 0;
+}
+
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-apml/fdtd-apml.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-apml/fdtd-apml.h
new file mode 100644
index 000000000..c2f9eb200
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/fdtd-apml/fdtd-apml.h
@@ -0,0 +1,60 @@
+/**
+ * fdtd-apml.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef FDTD_APML_H
+# define FDTD_AMPL_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(CZ) && ! defined(CYM) && !defined(CXM)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define CZ 32
+#   define CYM 32
+#   define CXM 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define CZ 64
+#   define CYM 64
+#   define CXM 64
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define CZ 256
+#   define CYM 256
+#   define CXM 256
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define CZ 512
+#   define CYM 512
+#   define CXM 512
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define CZ 1000
+#   define CYM 1000
+#   define CXM 1000
+#  endif
+# endif /* !N */
+
+# define _PB_CZ POLYBENCH_LOOP_BOUND(CZ,cz)
+# define _PB_CYM POLYBENCH_LOOP_BOUND(CYM,cym)
+# define _PB_CXM POLYBENCH_LOOP_BOUND(CXM,cxm)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !FDTD_APML */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-1d-imper/jacobi-1d-imper.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-1d-imper/jacobi-1d-imper.c
new file mode 100644
index 000000000..ed955d0e0
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-1d-imper/jacobi-1d-imper.c
@@ -0,0 +1,111 @@
+/**
+ * jacobi-1d-imper.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 100x10000. */
+#include "jacobi-1d-imper.h"
+
+
+/* Array initialization. */
+static
+void init_array (int n,
+		 DATA_TYPE POLYBENCH_1D(A,N,n),
+		 DATA_TYPE POLYBENCH_1D(B,N,n))
+{
+  int i;
+
+  for (i = 0; i < n; i++)
+      {
+	A[i] = ((DATA_TYPE) i+ 2) / n;
+	B[i] = ((DATA_TYPE) i+ 3) / n;
+      }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_1D(A,N,n))
+
+{
+  int i;
+
+  for (i = 0; i < n; i++)
+    {
+      fprintf(stderr, DATA_PRINTF_MODIFIER, A[i]);
+      if (i % 20 == 0) fprintf(stderr, "\n");
+    }
+  fprintf(stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_jacobi_1d_imper(int tsteps,
+			    int n,
+			    DATA_TYPE POLYBENCH_1D(A,N,n),
+			    DATA_TYPE POLYBENCH_1D(B,N,n))
+{
+  int t, i, j;
+
+#pragma scop
+  for (t = 0; t < _PB_TSTEPS; t++)
+    {
+      for (i = 1; i < _PB_N - 1; i++)
+	B[i] = 0.33333 * (A[i-1] + A[i] + A[i + 1]);
+      for (j = 1; j < _PB_N - 1; j++)
+	A[j] = B[j];
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+  int tsteps = TSTEPS;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_1D_ARRAY_DECL(A, DATA_TYPE, N, n);
+  POLYBENCH_1D_ARRAY_DECL(B, DATA_TYPE, N, n);
+
+
+  /* Initialize array(s). */
+  init_array (n, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_jacobi_1d_imper (tsteps, n, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(A)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(B);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-1d-imper/jacobi-1d-imper.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-1d-imper/jacobi-1d-imper.h
new file mode 100644
index 000000000..5ae01f503
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-1d-imper/jacobi-1d-imper.h
@@ -0,0 +1,54 @@
+/**
+ * jacobi-1d-imper.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef JACOBI_1D_IMPER_H
+# define JACOBI_1D_IMPER_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(TSTEPS) && ! defined(N)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define TSTEPS 2
+#   define N 500
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define TSTEPS 10
+#   define N 1000
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define TSTEPS 100
+#   define N 10000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define TSTEPS 1000
+#   define N 100000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define TSTEPS 1000
+#   define N 1000000
+#  endif
+# endif /* !N */
+
+# define _PB_TSTEPS POLYBENCH_LOOP_BOUND(TSTEPS,tsteps)
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !JACOBI_1D_IMPER */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-2d-imper/jacobi-2d-imper.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-2d-imper/jacobi-2d-imper.c
new file mode 100644
index 000000000..32ab9e7f2
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-2d-imper/jacobi-2d-imper.c
@@ -0,0 +1,114 @@
+/**
+ * jacobi-2d-imper.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 20x1000. */
+#include "jacobi-2d-imper.h"
+
+
+/* Array initialization. */
+static
+void init_array (int n,
+		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n),
+		 DATA_TYPE POLYBENCH_2D(B,N,N,n,n))
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++)
+      {
+	A[i][j] = ((DATA_TYPE) i*(j+2) + 2) / n;
+	B[i][j] = ((DATA_TYPE) i*(j+3) + 3) / n;
+      }
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++) {
+      fprintf(stderr, DATA_PRINTF_MODIFIER, A[i][j]);
+      if ((i * n + j) % 20 == 0) fprintf(stderr, "\n");
+    }
+  fprintf(stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_jacobi_2d_imper(int tsteps,
+			    int n,
+			    DATA_TYPE POLYBENCH_2D(A,N,N,n,n),
+			    DATA_TYPE POLYBENCH_2D(B,N,N,n,n))
+{
+  int t, i, j;
+
+#pragma scop
+  for (t = 0; t < _PB_TSTEPS; t++)
+    {
+      for (i = 1; i < _PB_N - 1; i++)
+	for (j = 1; j < _PB_N - 1; j++)
+	  B[i][j] = 0.2 * (A[i][j] + A[i][j-1] + A[i][1+j] + A[1+i][j] + A[i-1][j]);
+      for (i = 1; i < _PB_N-1; i++)
+	for (j = 1; j < _PB_N-1; j++)
+	  A[i][j] = B[i][j];
+    }
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+  int tsteps = TSTEPS;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, N, N, n, n);
+  POLYBENCH_2D_ARRAY_DECL(B, DATA_TYPE, N, N, n, n);
+
+
+  /* Initialize array(s). */
+  init_array (n, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_jacobi_2d_imper (tsteps, n, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(A)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+  POLYBENCH_FREE_ARRAY(B);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-2d-imper/jacobi-2d-imper.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-2d-imper/jacobi-2d-imper.h
new file mode 100644
index 000000000..186d88f4d
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/jacobi-2d-imper/jacobi-2d-imper.h
@@ -0,0 +1,54 @@
+/**
+ * jacobi-2d-imper.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef JACOBI_2D_IMPER_H
+# define JACOBI_2D_IMPER_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(TSTEPS) && ! defined(N)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define TSTEPS 2
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define TSTEPS 10
+#   define N 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define TSTEPS 20
+#   define N 1000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define TSTEPS 20
+#   define N 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define TSTEPS 100
+#   define N 4000
+#  endif
+# endif /* !N */
+
+# define _PB_TSTEPS POLYBENCH_LOOP_BOUND(TSTEPS,tsteps)
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !JACOBI_2D_IMPER */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/seidel-2d/seidel-2d.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/seidel-2d/seidel-2d.c
new file mode 100644
index 000000000..aef1a6bf9
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/seidel-2d/seidel-2d.c
@@ -0,0 +1,104 @@
+/**
+ * seidel-2d.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is 20x1000. */
+#include "seidel-2d.h"
+
+
+/* Array initialization. */
+static
+void init_array (int n,
+		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++)
+      A[i][j] = ((DATA_TYPE) i*(j+2) + 2) / n;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n,
+		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++) {
+      fprintf(stderr, DATA_PRINTF_MODIFIER, A[i][j]);
+      if ((i * n + j) % 20 == 0) fprintf(stderr, "\n");
+    }
+  fprintf(stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_seidel_2d(int tsteps,
+		      int n,
+		      DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
+{
+  int t, i, j;
+
+#pragma scop
+  for (t = 0; t <= _PB_TSTEPS - 1; t++)
+    for (i = 1; i<= _PB_N - 2; i++)
+      for (j = 1; j <= _PB_N - 2; j++)
+	A[i][j] = (A[i-1][j-1] + A[i-1][j] + A[i-1][j+1]
+		   + A[i][j-1] + A[i][j] + A[i][j+1]
+		   + A[i+1][j-1] + A[i+1][j] + A[i+1][j+1])/9.0;
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+  int tsteps = TSTEPS;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, N, N, n, n);
+
+
+  /* Initialize array(s). */
+  init_array (n, POLYBENCH_ARRAY(A));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_seidel_2d (tsteps, n, POLYBENCH_ARRAY(A));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(A)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(A);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/seidel-2d/seidel-2d.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/seidel-2d/seidel-2d.h
new file mode 100644
index 000000000..b2a7ed1d1
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/seidel-2d/seidel-2d.h
@@ -0,0 +1,54 @@
+/**
+ * seidel-2d.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef SEIDEL_2D_H
+# define SEIDEL_2D_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(TSTEPS) && ! defined(N)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define TSTEPS 2
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define TSTEPS 10
+#   define N 500
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define TSTEPS 20
+#   define N 1000
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define TSTEPS 20
+#   define N 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define TSTEPS 100
+#   define N 4000
+#  endif
+# endif /* !N */
+
+# define _PB_TSTEPS POLYBENCH_LOOP_BOUND(TSTEPS,tsteps)
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !SEIDEL_2D */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/trisolv b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/trisolv
new file mode 100755
index 000000000..ae4815534
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/stencils/trisolv
Binary files differdiff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/benchmark_list b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/benchmark_list
new file mode 100644
index 000000000..8f5bbfb1f
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/benchmark_list
@@ -0,0 +1,30 @@
+./datamining/correlation/correlation.c
+./datamining/covariance/covariance.c
+./linear-algebra/kernels/2mm/2mm.c
+./linear-algebra/kernels/3mm/3mm.c
+./linear-algebra/kernels/atax/atax.c
+./linear-algebra/kernels/bicg/bicg.c
+./linear-algebra/kernels/cholesky/cholesky.c
+./linear-algebra/kernels/doitgen/doitgen.c
+./linear-algebra/kernels/gemm/gemm.c
+./linear-algebra/kernels/gemver/gemver.c
+./linear-algebra/kernels/gesummv/gesummv.c
+./linear-algebra/kernels/mvt/mvt.c
+./linear-algebra/kernels/symm/symm.c
+./linear-algebra/kernels/syr2k/syr2k.c
+./linear-algebra/kernels/syrk/syrk.c
+./linear-algebra/kernels/trisolv/trisolv.c
+./linear-algebra/kernels/trmm/trmm.c
+./linear-algebra/solvers/durbin/durbin.c
+./linear-algebra/solvers/dynprog/dynprog.c
+./linear-algebra/solvers/gramschmidt/gramschmidt.c
+./linear-algebra/solvers/lu/lu.c
+./linear-algebra/solvers/ludcmp/ludcmp.c
+./medley/floyd-warshall/floyd-warshall.c
+./medley/reg_detect/reg_detect.c
+./stencils/adi/adi.c
+./stencils/fdtd-2d/fdtd-2d.c
+./stencils/fdtd-apml/fdtd-apml.c
+./stencils/jacobi-1d-imper/jacobi-1d-imper.c
+./stencils/jacobi-2d-imper/jacobi-2d-imper.c
+./stencils/seidel-2d/seidel-2d.c
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/create_cpped_version.sh b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/create_cpped_version.sh
new file mode 100755
index 000000000..6818de89c
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/create_cpped_version.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+## create_cpped_version.sh for  in /Users/pouchet
+##
+## Made by Louis-Noel Pouchet
+## Contact: <pouchet@cse.ohio-state.edu>
+##
+## Started on  Mon Oct 31 16:20:01 2011 Louis-Noel Pouchet
+## Last update Mon Oct 31 20:42:35 2011 Louis-Noel Pouchet
+##
+
+if [ $# -lt 1 ]; then
+    echo "Usage: create_cpped_version.sh <file.c> [gcc -E flags]";
+    exit 1;
+fi;
+args="$2";
+file="$1";
+head -n 12 $file > .__poly_top.c;
+tail -n +12 $file > .__poly_bottom.c;
+filename=`echo "$file" | sed -e "s/\(.*\).c/\1/1"`;
+filenameorig=`basename $file`;
+benchdir=`dirname "$file"`;
+gcc -E .__poly_bottom.c -I $benchdir $args 2>/dev/null > .__tmp_poly.c
+sed -e "/^[ ]*;[ ]*$/d" .__tmp_poly.c | sed -e "s~.__poly_bottom.c~$filenameorig~g" > .__poly_bottom.c;
+cat .__poly_top.c > $filename.preproc.c;
+echo "#include <polybench.h>\n" >> $filename.preproc.c;
+cat .__poly_bottom.c >> $filename.preproc.c;
+rm -f .__tmp_poly.c .__poly_bottom.c .__poly_top.c;
+
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/papi_counters.list b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/papi_counters.list
new file mode 100644
index 000000000..d8879cbe5
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/papi_counters.list
@@ -0,0 +1,5 @@
+// Counters must be delimited with ',' including the last one.
+// C/C++ comments are allowed.
+// Both native and standard PAPI events are supported.
+"PAPI_TOT_CYC",
+"L1D:REPL",
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/polybench.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/polybench.c
new file mode 100644
index 000000000..bb0d17a86
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/polybench.c
@@ -0,0 +1,402 @@
+/**
+ * polybench.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <assert.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sched.h>
+#include <math.h>
+#ifdef _OPENMP
+# include <omp.h>
+#endif
+
+/* By default, collect PAPI counters on thread 0. */
+#ifndef POLYBENCH_THREAD_MONITOR
+# define POLYBENCH_THREAD_MONITOR 0
+#endif
+
+/* Total LLC cache size. By default 32+MB.. */
+#ifndef POLYBENCH_CACHE_SIZE_KB
+# define POLYBENCH_CACHE_SIZE_KB 32770
+#endif
+
+
+int polybench_papi_counters_threadid = POLYBENCH_THREAD_MONITOR;
+double polybench_program_total_flops = 0;
+
+#ifdef POLYBENCH_PAPI
+# include <papi.h>
+# define POLYBENCH_MAX_NB_PAPI_COUNTERS 96
+  char* _polybench_papi_eventlist[] = {
+#include "papi_counters.list"
+    NULL
+  };
+  int polybench_papi_eventset;
+  int polybench_papi_eventlist[POLYBENCH_MAX_NB_PAPI_COUNTERS];
+  long_long polybench_papi_values[POLYBENCH_MAX_NB_PAPI_COUNTERS];
+
+#endif
+
+
+/* Timer code (gettimeofday). */
+double polybench_t_start, polybench_t_end;
+/* Timer code (RDTSC). */
+unsigned long long int polybench_c_start, polybench_c_end;
+
+static
+double rtclock()
+{
+#ifdef POLYBENCH_TIME
+    struct timeval Tp;
+    int stat;
+    stat = gettimeofday (&Tp, NULL);
+    if (stat != 0)
+      printf ("Error return from gettimeofday: %d", stat);
+    return (Tp.tv_sec + Tp.tv_usec * 1.0e-6);
+#else
+    return 0;
+#endif
+}
+
+
+#ifdef POLYBENCH_CYCLE_ACCURATE_TIMER
+static
+unsigned long long int rdtsc()
+{
+  unsigned long long int ret = 0;
+  unsigned int cycles_lo;
+  unsigned int cycles_hi;
+  __asm__ volatile ("RDTSC" : "=a" (cycles_lo), "=d" (cycles_hi));
+  ret = (unsigned long long int)cycles_hi << 32 | cycles_lo;
+
+  return ret;
+}
+#endif
+
+void polybench_flush_cache()
+{
+  int cs = POLYBENCH_CACHE_SIZE_KB * 1024 / sizeof(double);
+  double* flush = (double*) calloc (cs, sizeof(double));
+  int i;
+  double tmp = 0.0;
+#ifdef _OPENMP
+#pragma omp parallel for
+#endif
+  for (i = 0; i < cs; i++)
+    tmp += flush[i];
+  assert (tmp <= 10.0);
+  free (flush);
+}
+
+
+#ifdef POLYBENCH_LINUX_FIFO_SCHEDULER
+void polybench_linux_fifo_scheduler()
+{
+  /* Use FIFO scheduler to limit OS interference. Program must be run
+     as root, and this works only for Linux kernels. */
+  struct sched_param schedParam;
+  schedParam.sched_priority = sched_get_priority_max (SCHED_FIFO);
+  sched_setscheduler (0, SCHED_FIFO, &schedParam);
+}
+
+
+void polybench_linux_standard_scheduler()
+{
+  /* Restore to standard scheduler policy. */
+  struct sched_param schedParam;
+  schedParam.sched_priority = sched_get_priority_max (SCHED_OTHER);
+  sched_setscheduler (0, SCHED_OTHER, &schedParam);
+}
+#endif
+
+#ifdef POLYBENCH_PAPI
+
+static
+void test_fail(char *file, int line, char *call, int retval)
+{
+  char buf[128];
+
+  memset(buf, '\0', sizeof(buf));
+  if (retval != 0)
+    fprintf (stdout,"%-40s FAILED\nLine # %d\n", file, line);
+  else
+    {
+      fprintf (stdout,"%-40s SKIPPED\n", file);
+      fprintf (stdout,"Line # %d\n", line);
+    }
+  if (retval == PAPI_ESYS)
+    {
+      sprintf (buf, "System error in %s", call);
+      perror (buf);
+    }
+  else if (retval > 0)
+    fprintf (stdout,"Error: %s\n", call);
+  else if (retval == 0)
+    fprintf (stdout,"Error: %s\n", call);
+  else
+    {
+      char errstring[PAPI_MAX_STR_LEN];
+      PAPI_perror (retval, errstring, PAPI_MAX_STR_LEN);
+      fprintf (stdout,"Error in %s: %s\n", call, errstring);
+    }
+  fprintf (stdout,"\n");
+  if (PAPI_is_initialized ())
+    PAPI_shutdown ();
+  exit (1);
+}
+
+
+void polybench_papi_init()
+{
+# ifdef _OPENMP
+#pragma omp parallel
+  {
+#pragma omp master
+    {
+      if (omp_get_max_threads () < polybench_papi_counters_threadid)
+	polybench_papi_counters_threadid = omp_get_max_threads () - 1;
+    }
+#pragma omp barrier
+
+    if (omp_get_thread_num () == polybench_papi_counters_threadid)
+      {
+# endif
+	int retval;
+	polybench_papi_eventset = PAPI_NULL;
+	if ((retval = PAPI_library_init (PAPI_VER_CURRENT)) != PAPI_VER_CURRENT)
+	  test_fail (__FILE__, __LINE__, "PAPI_library_init", retval);
+	if ((retval = PAPI_create_eventset (&polybench_papi_eventset))
+	    != PAPI_OK)
+	  test_fail (__FILE__, __LINE__, "PAPI_create_eventset", retval);
+	int k;
+	for (k = 0; _polybench_papi_eventlist[k]; ++k)
+	  {
+	    if ((retval =
+		 PAPI_event_name_to_code (_polybench_papi_eventlist[k],
+					  &(polybench_papi_eventlist[k])))
+		!= PAPI_OK)
+	      test_fail (__FILE__, __LINE__, "PAPI_event_name_to_code", retval);
+	  }
+	polybench_papi_eventlist[k] = 0;
+
+
+# ifdef _OPENMP
+      }
+  }
+#pragma omp barrier
+# endif
+}
+
+
+void polybench_papi_close()
+{
+# ifdef _OPENMP
+#pragma omp parallel
+  {
+    if (omp_get_thread_num () == polybench_papi_counters_threadid)
+      {
+# endif
+	int retval;
+	if ((retval = PAPI_destroy_eventset (&polybench_papi_eventset))
+	    != PAPI_OK)
+	  test_fail (__FILE__, __LINE__, "PAPI_destroy_eventset", retval);
+	if (PAPI_is_initialized ())
+	  PAPI_shutdown ();
+# ifdef _OPENMP
+      }
+  }
+#pragma omp barrier
+# endif
+}
+
+int polybench_papi_start_counter(int evid)
+{
+# ifndef POLYBENCH_NO_FLUSH_CACHE
+    polybench_flush_cache();
+# endif
+
+# ifdef _OPENMP
+# pragma omp parallel
+  {
+    if (omp_get_thread_num () == polybench_papi_counters_threadid)
+      {
+# endif
+
+	int retval = 1;
+	char descr[PAPI_MAX_STR_LEN];
+	PAPI_event_info_t evinfo;
+	PAPI_event_code_to_name (polybench_papi_eventlist[evid], descr);
+	if (PAPI_add_event (polybench_papi_eventset,
+			    polybench_papi_eventlist[evid]) != PAPI_OK)
+	  test_fail (__FILE__, __LINE__, "PAPI_add_event", 1);
+	if (PAPI_get_event_info (polybench_papi_eventlist[evid], &evinfo)
+	    != PAPI_OK)
+	  test_fail (__FILE__, __LINE__, "PAPI_get_event_info", retval);
+	if ((retval = PAPI_start (polybench_papi_eventset)) != PAPI_OK)
+	  test_fail (__FILE__, __LINE__, "PAPI_start", retval);
+# ifdef _OPENMP
+      }
+  }
+#pragma omp barrier
+# endif
+  return 0;
+}
+
+
+void polybench_papi_stop_counter(int evid)
+{
+# ifdef _OPENMP
+# pragma omp parallel
+  {
+    if (omp_get_thread_num () == polybench_papi_counters_threadid)
+      {
+# endif
+	int retval;
+	long_long values[1];
+	values[0] = 0;
+	if ((retval = PAPI_read (polybench_papi_eventset, &values[0]))
+	    != PAPI_OK)
+	  test_fail (__FILE__, __LINE__, "PAPI_read", retval);
+
+	if ((retval = PAPI_stop (polybench_papi_eventset, NULL)) != PAPI_OK)
+	  test_fail (__FILE__, __LINE__, "PAPI_stop", retval);
+
+	polybench_papi_values[evid] = values[0];
+
+	if ((retval = PAPI_remove_event
+	     (polybench_papi_eventset,
+	      polybench_papi_eventlist[evid])) != PAPI_OK)
+	  test_fail (__FILE__, __LINE__, "PAPI_remove_event", retval);
+# ifdef _OPENMP
+      }
+  }
+#pragma omp barrier
+# endif
+}
+
+
+void polybench_papi_print()
+{
+  int verbose = 0;
+# ifdef _OPENMP
+# pragma omp parallel
+  {
+    if (omp_get_thread_num() == polybench_papi_counters_threadid)
+      {
+#ifdef POLYBENCH_PAPI_VERBOSE
+	verbose = 1;
+#endif
+	if (verbose)
+	  printf ("On thread %d:\n", polybench_papi_counters_threadid);
+#endif
+	int evid;
+	for (evid = 0; polybench_papi_eventlist[evid] != 0; ++evid)
+	  {
+	    if (verbose)
+	      printf ("%s=", _polybench_papi_eventlist[evid]);
+	    printf ("%llu ", polybench_papi_values[evid]);
+	    if (verbose)
+	      printf ("\n");
+	  }
+	printf ("\n");
+# ifdef _OPENMP
+      }
+  }
+#pragma omp barrier
+# endif
+}
+
+#endif
+/* ! POLYBENCH_PAPI */
+
+void polybench_prepare_instruments()
+{
+#ifndef POLYBENCH_NO_FLUSH_CACHE
+  polybench_flush_cache ();
+#endif
+#ifdef POLYBENCH_LINUX_FIFO_SCHEDULER
+  polybench_linux_fifo_scheduler ();
+#endif
+}
+
+
+void polybench_timer_start()
+{
+  polybench_prepare_instruments ();
+#ifndef POLYBENCH_CYCLE_ACCURATE_TIMER
+  polybench_t_start = rtclock ();
+#else
+  polybench_c_start = rdtsc ();
+#endif
+}
+
+
+void polybench_timer_stop()
+{
+#ifndef POLYBENCH_CYCLE_ACCURATE_TIMER
+  polybench_t_end = rtclock ();
+#else
+  polybench_c_end = rdtsc ();
+#endif
+#ifdef POLYBENCH_LINUX_FIFO_SCHEDULER
+  polybench_linux_standard_scheduler ();
+#endif
+}
+
+
+void polybench_timer_print()
+{
+#ifdef POLYBENCH_GFLOPS
+      if  (__polybench_program_total_flops == 0)
+	{
+	  printf ("[PolyBench][WARNING] Program flops not defined, use polybench_set_program_flops(value)\n");
+	  printf ("%0.6lf\n", polybench_t_end - polybench_t_start);
+	}
+      else
+	printf ("%0.2lf\n",
+		(__polybench_program_total_flops /
+		 (double)(polybench_t_end - polybench_t_start)) / 1000000000);
+#else
+# ifndef POLYBENCH_CYCLE_ACCURATE_TIMER
+      printf ("%0.6f\n", polybench_t_end - polybench_t_start);
+# else
+      printf ("%Ld\n", polybench_c_end - polybench_c_start);
+# endif
+#endif
+}
+
+
+
+static
+void *
+xmalloc (size_t num)
+{
+  void* new = NULL;
+  int ret = posix_memalign (&new, 32, num);
+  if (! new || ret)
+    {
+      fprintf (stderr, "[PolyBench] posix_memalign: cannot allocate memory");
+      exit (1);
+    }
+  return new;
+}
+
+
+void* polybench_alloc_data(unsigned long long int n, int elt_size)
+{
+  /// FIXME: detect overflow!
+  size_t val = n;
+  val *= elt_size;
+  void* ret = xmalloc (val);
+
+  return ret;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/polybench.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/polybench.h
new file mode 100644
index 000000000..7d092e45d
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/polybench.h
@@ -0,0 +1,202 @@
+/**
+ * polybench.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+/*
+ * Polybench header for instrumentation.
+ *
+ * Programs must be compiled with `-I utilities utilities/polybench.c'
+ *
+ * Optionally, one can define:
+ *
+ * -DPOLYBENCH_TIME, to report the execution time,
+ *   OR (exclusive):
+ * -DPOLYBENCH_PAPI, to use PAPI H/W counters (defined in polybench.c)
+ *
+ *
+ * See README or utilities/polybench.c for additional options.
+ *
+ */
+#ifndef POLYBENCH_H
+# define POLYBENCH_H
+
+# include <stdlib.h>
+
+/* Array padding. By default, none is used. */
+# ifndef POLYBENCH_PADDING_FACTOR
+/* default: */
+#  define POLYBENCH_PADDING_FACTOR 0
+# endif
+
+
+/* C99 arrays in function prototype. By default, do not use. */
+# ifdef POLYBENCH_USE_C99_PROTO
+#  define POLYBENCH_C99_SELECT(x,y) y
+# else
+/* default: */
+#  define POLYBENCH_C99_SELECT(x,y) x
+# endif
+
+
+/* Scalar loop bounds in SCoPs. By default, use parametric loop bounds. */
+# ifdef POLYBENCH_USE_SCALAR_LB
+#  define POLYBENCH_LOOP_BOUND(x,y) x
+# else
+/* default: */
+#  define POLYBENCH_LOOP_BOUND(x,y) y
+# endif
+
+
+/* Macros to reference an array. Generic for heap and stack arrays
+   (C99).  Each array dimensionality has his own macro, to be used at
+   declaration or as a function argument.
+   Example:
+   int b[x] => POLYBENCH_1D_ARRAY(b, x)
+   int A[N][N] => POLYBENCH_2D_ARRAY(A, N, N)
+*/
+# ifndef POLYBENCH_STACK_ARRAYS
+#  define POLYBENCH_ARRAY(x) *x
+#  define POLYBENCH_FREE_ARRAY(x) free((void*)x);
+#  define POLYBENCH_DECL_VAR(x) (*x)
+# else
+#  define POLYBENCH_ARRAY(x) x
+#  define POLYBENCH_FREE_ARRAY(x)
+#  define POLYBENCH_DECL_VAR(x) x
+# endif
+/* Macros for using arrays in the function prototypes. */
+# define POLYBENCH_1D(var, dim1,ddim1) var[POLYBENCH_C99_SELECT(dim1,ddim1) + POLYBENCH_PADDING_FACTOR]
+# define POLYBENCH_2D(var, dim1, dim2, ddim1, ddim2) var[POLYBENCH_C99_SELECT(dim1,ddim1) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim2,ddim2) + POLYBENCH_PADDING_FACTOR]
+# define POLYBENCH_3D(var, dim1, dim2, dim3, ddim1, ddim2, ddim3) var[POLYBENCH_C99_SELECT(dim1,ddim1) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim2,ddim2) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim3,ddim3) + POLYBENCH_PADDING_FACTOR]
+# define POLYBENCH_4D(var, dim1, dim2, dim3, dim4, ddim1, ddim2, ddim3, ddim4) var[POLYBENCH_C99_SELECT(dim1,ddim1) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim2,ddim2) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim3,ddim3) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim4,ddim4) + POLYBENCH_PADDING_FACTOR]
+# define POLYBENCH_5D(var, dim1, dim2, dim3, dim4, dim5, ddim1, ddim2, ddim3, ddim4, ddim5) var[POLYBENCH_C99_SELECT(dim1,ddim1) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim2,ddim2) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim3,ddim3) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim4,ddim4) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim5,ddim5) + POLYBENCH_PADDING_FACTOR]
+
+
+/* Macros to allocate heap arrays.
+   Example:
+   polybench_alloc_2d_array(N, M, double) => allocates N x M x sizeof(double)
+					  and returns a pointer to the 2d array
+ */
+# define POLYBENCH_ALLOC_1D_ARRAY(n1, type)	\
+  (type(*)[n1 + POLYBENCH_PADDING_FACTOR])polybench_alloc_data (n1 + POLYBENCH_PADDING_FACTOR, sizeof(type))
+# define POLYBENCH_ALLOC_2D_ARRAY(n1, n2, type)		\
+  (type(*)[n1 + POLYBENCH_PADDING_FACTOR][n2 + POLYBENCH_PADDING_FACTOR])polybench_alloc_data ((n1 + POLYBENCH_PADDING_FACTOR) * (n2 + POLYBENCH_PADDING_FACTOR), sizeof(type))
+# define POLYBENCH_ALLOC_3D_ARRAY(n1, n2, n3, type)		\
+  (type(*)[n1 + POLYBENCH_PADDING_FACTOR][n2 + POLYBENCH_PADDING_FACTOR][n3 + POLYBENCH_PADDING_FACTOR])polybench_alloc_data ((n1 + POLYBENCH_PADDING_FACTOR) * (n2 + POLYBENCH_PADDING_FACTOR) * (n3 + POLYBENCH_PADDING_FACTOR), sizeof(type))
+# define POLYBENCH_ALLOC_4D_ARRAY(n1, n2, n3, n4, type)			\
+  (type(*)[n1 + POLYBENCH_PADDING_FACTOR][n2 + POLYBENCH_PADDING_FACTOR][n3 + POLYBENCH_PADDING_FACTOR][n4 + POLYBENCH_PADDING_FACTOR])polybench_alloc_data ((n1 + POLYBENCH_PADDING_FACTOR) * (n2 + POLYBENCH_PADDING_FACTOR) * (n3 + POLYBENCH_PADDING_FACTOR) * (n4 + POLYBENCH_PADDING_FACTOR), sizeof(type))
+# define POLYBENCH_ALLOC_5D_ARRAY(n1, n2, n3, n4, n5, type)		\
+  (type(*)[n1 + POLYBENCH_PADDING_FACTOR][n2 + POLYBENCH_PADDING_FACTOR][n3 + POLYBENCH_PADDING_FACTOR][n4 + POLYBENCH_PADDING_FACTOR][n5 + POLYBENCH_PADDING_FACTOR])polybench_alloc_data ((n1 + POLYBENCH_PADDING_FACTOR) * (n2 + POLYBENCH_PADDING_FACTOR) * (n3 + POLYBENCH_PADDING_FACTOR) * (n4 + POLYBENCH_PADDING_FACTOR) * (n5 + POLYBENCH_PADDING_FACTOR), sizeof(type))
+
+/* Macros for array declaration. */
+# ifndef POLYBENCH_STACK_ARRAYS
+#  define POLYBENCH_1D_ARRAY_DECL(var, type, dim1, ddim1)		\
+  type POLYBENCH_1D(POLYBENCH_DECL_VAR(var), dim1, ddim1); \
+  var = POLYBENCH_ALLOC_1D_ARRAY(POLYBENCH_C99_SELECT(dim1, ddim1), type);
+#  define POLYBENCH_2D_ARRAY_DECL(var, type, dim1, dim2, ddim1, ddim2)	\
+  type POLYBENCH_2D(POLYBENCH_DECL_VAR(var), dim1, dim2, ddim1, ddim2); \
+  var = POLYBENCH_ALLOC_2D_ARRAY(POLYBENCH_C99_SELECT(dim1, ddim1), POLYBENCH_C99_SELECT(dim2, ddim2), type);
+#  define POLYBENCH_3D_ARRAY_DECL(var, type, dim1, dim2, dim3, ddim1, ddim2, ddim3) \
+  type POLYBENCH_3D(POLYBENCH_DECL_VAR(var), dim1, dim2, dim3, ddim1, ddim2, ddim3); \
+  var = POLYBENCH_ALLOC_3D_ARRAY(POLYBENCH_C99_SELECT(dim1, ddim1), POLYBENCH_C99_SELECT(dim2, ddim2), POLYBENCH_C99_SELECT(dim3, ddim3), type);
+#  define POLYBENCH_4D_ARRAY_DECL(var, type, dim1, dim2, dim3, dim4, ddim1, ddim2, ddim3, ddim4) \
+  type POLYBENCH_4D(POLYBENCH_DECL_VAR(var), dim1, dim2, ,dim3, dim4, ddim1, ddim2, ddim3, ddim4); \
+  var = POLYBENCH_ALLOC_4D_ARRAY(POLYBENCH_C99_SELECT(dim1, ddim1), POLYBENCH_C99_SELECT(dim2, ddim2), POLYBENCH_C99_SELECT(dim3, ddim3), POLYBENCH_C99_SELECT(dim4, ddim4), type);
+#  define POLYBENCH_5D_ARRAY_DECL(var, type, dim1, dim2, dim3, dim4, dim5, ddim1, ddim2, ddim3, ddim4, ddim5) \
+  type POLYBENCH_5D(POLYBENCH_DECL_VAR(var), dim1, dim2, dim3, dim4, dim5, ddim1, ddim2, ddim3, ddim4, ddim5); \
+  var = POLYBENCH_ALLOC_5D_ARRAY(POLYBENCH_C99_SELECT(dim1, ddim1), POLYBENCH_C99_SELECT(dim2, ddim2), POLYBENCH_C99_SELECT(dim3, ddim3), POLYBENCH_C99_SELECT(dim4, ddim4), POLYBENCH_C99_SELECT(dim5, ddim5), type);
+# else
+#  define POLYBENCH_1D_ARRAY_DECL(var, type, dim1, ddim1)		\
+  type POLYBENCH_1D(POLYBENCH_DECL_VAR(var), dim1, ddim1);
+#  define POLYBENCH_2D_ARRAY_DECL(var, type, dim1, dim2, ddim1, ddim2)	\
+  type POLYBENCH_2D(POLYBENCH_DECL_VAR(var), dim1, dim2, ddim1, ddim2);
+#  define POLYBENCH_3D_ARRAY_DECL(var, type, dim1, dim2, dim3, ddim1, ddim2, ddim3) \
+  type POLYBENCH_3D(POLYBENCH_DECL_VAR(var), dim1, dim2, dim3, ddim1, ddim2, ddim3);
+#  define POLYBENCH_4D_ARRAY_DECL(var, type, dim1, dim2, dim3, dim4, ddim1, ddim2, ddim3, ddim4) \
+  type POLYBENCH_4D(POLYBENCH_DECL_VAR(var), dim1, dim2, dim3, dim4, ddim1, ddim2, ddim3, ddim4);
+#  define POLYBENCH_5D_ARRAY_DECL(var, type, dim1, dim2, dim3, dim4, dim5, ddim1, ddim2, ddim3, ddim4, ddim5) \
+  type POLYBENCH_5D(POLYBENCH_DECL_VAR(var), dim1, dim2, dim3, dim4, dim5, ddim1, ddim2, ddim3, ddim4, ddim5);
+# endif
+
+
+/* Dead-code elimination macros. Use argc/argv for the run-time check. */
+# ifndef POLYBENCH_DUMP_ARRAYS
+#  define POLYBENCH_DCE_ONLY_CODE    if (argc > 42 && ! strcmp(argv[0], ""))
+# else
+#  define POLYBENCH_DCE_ONLY_CODE
+# endif
+
+# define polybench_prevent_dce(func)		\
+  POLYBENCH_DCE_ONLY_CODE			\
+  func
+
+
+/* Performance-related instrumentation. See polybench.c */
+# define polybench_start_instruments
+# define polybench_stop_instruments
+# define polybench_print_instruments
+
+
+/* PAPI support. */
+# ifdef POLYBENCH_PAPI
+extern const unsigned int polybench_papi_eventlist[];
+#  undef polybench_start_instruments
+#  undef polybench_stop_instruments
+#  undef polybench_print_instruments
+#  define polybench_set_papi_thread_report(x)	\
+   polybench_papi_counters_threadid = x;
+#  define polybench_start_instruments				\
+  polybench_prepare_instruments();				\
+  polybench_papi_init();					\
+  int evid;							\
+  for (evid = 0; polybench_papi_eventlist[evid] != 0; evid++)	\
+    {								\
+      if (polybench_papi_start_counter(evid))			\
+	continue;						\
+
+#  define polybench_stop_instruments		\
+      polybench_papi_stop_counter(evid);	\
+    }						\
+  polybench_papi_close();			\
+
+#  define polybench_print_instruments polybench_papi_print();
+# endif
+
+
+/* Timing support. */
+# if defined(POLYBENCH_TIME) || defined(POLYBENCH_GFLOPS)
+#  undef polybench_start_instruments
+#  undef polybench_stop_instruments
+#  undef polybench_print_instruments
+#  define polybench_start_instruments polybench_timer_start();
+#  define polybench_stop_instruments polybench_timer_stop();
+#  define polybench_print_instruments polybench_timer_print();
+extern double polybench_program_total_flops;
+extern void polybench_timer_start();
+extern void polybench_timer_stop();
+extern void polybench_timer_print();
+# endif
+
+/* Function declaration. */
+# ifdef POLYBENCH_TIME
+extern void polybench_timer_start();
+extern void polybench_timer_stop();
+extern void polybench_timer_print();
+# endif
+
+# ifdef POLYBENCH_PAPI
+extern void polybench_prepare_instruments();
+extern int polybench_papi_start_counter(int evid);
+extern void polybench_papi_stop_counter(int evid);
+extern void polybench_papi_init();
+extern void polybench_papi_close();
+extern void polybench_papi_print();
+# endif
+
+/* Function prototypes. */
+extern void* polybench_alloc_data(unsigned long long int n, int elt_size);
+
+
+#endif /* !POLYBENCH_H */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/template-for-new-benchmark.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/template-for-new-benchmark.c
new file mode 100644
index 000000000..76670e2b2
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/template-for-new-benchmark.c
@@ -0,0 +1,94 @@
+/**
+ * template.c: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+/* Include polybench common header. */
+#include <polybench.h>
+
+/* Include benchmark-specific header. */
+/* Default data type is double, default size is N=1024. */
+#include "template-for-new-benchmark.h"
+
+
+/* Array initialization. */
+static
+void init_array(int n, DATA_TYPE POLYBENCH_2D(C,N,N,n,n))
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++)
+      C[i][j] = 42;
+}
+
+
+/* DCE code. Must scan the entire live-out data.
+   Can be used also to check the correctness of the output. */
+static
+void print_array(int n, DATA_TYPE POLYBENCH_2D(C,N,N,n,n))
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++) {
+	fprintf (stderr, DATA_PRINTF_MODIFIER, C[i][j]);
+	if (i % 20 == 0) fprintf (stderr, "\n");
+    }
+  fprintf (stderr, "\n");
+}
+
+
+/* Main computational kernel. The whole function will be timed,
+   including the call and return. */
+static
+void kernel_template(int n, DATA_TYPE POLYBENCH_2D(C,N,N,n,n))
+{
+  int i, j;
+
+#pragma scop
+  for (i = 0; i < _PB_N; i++)
+    for (j = 0; j < _PB_N; j++)
+      C[i][j] += 42;
+#pragma endscop
+
+}
+
+
+int main(int argc, char** argv)
+{
+  /* Retrieve problem size. */
+  int n = N;
+
+  /* Variable declaration/allocation. */
+  POLYBENCH_2D_ARRAY_DECL(C,DATA_TYPE,N,N,n,n);
+
+  /* Initialize array(s). */
+  init_array (n, POLYBENCH_ARRAY(C));
+
+  /* Start timer. */
+  polybench_start_instruments;
+
+  /* Run kernel. */
+  kernel_template (n, POLYBENCH_ARRAY(C));
+
+  /* Stop and print timer. */
+  polybench_stop_instruments;
+  polybench_print_instruments;
+
+  /* Prevent dead-code elimination. All live-out data must be printed
+     by the function call in argument. */
+  polybench_prevent_dce(print_array(n,  POLYBENCH_ARRAY(C)));
+
+  /* Be clean. */
+  POLYBENCH_FREE_ARRAY(C);
+
+  return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/template-for-new-benchmark.h b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/template-for-new-benchmark.h
new file mode 100644
index 000000000..5a1ed2ae7
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/template-for-new-benchmark.h
@@ -0,0 +1,48 @@
+/**
+ * template.h: This file is part of the PolyBench/C 3.2 test suite.
+ *
+ *
+ * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
+ * Web address: http://polybench.sourceforge.net
+ */
+#ifndef TEMPLATE_H
+# define TEMPLATE_H
+
+/* Default to STANDARD_DATASET. */
+# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET)
+#  define STANDARD_DATASET
+# endif
+
+/* Do not define anything if the user manually defines the size. */
+# if !defined(N)
+/* Define the possible dataset sizes. */
+#  ifdef MINI_DATASET
+#   define N 32
+#  endif
+
+#  ifdef SMALL_DATASET
+#   define N 128
+#  endif
+
+#  ifdef STANDARD_DATASET /* Default if unspecified. */
+#   define N 1024
+#  endif
+
+#  ifdef LARGE_DATASET
+#   define N 2000
+#  endif
+
+#  ifdef EXTRALARGE_DATASET
+#   define N 4000
+#  endif
+# endif /* !N */
+
+# define _PB_N POLYBENCH_LOOP_BOUND(N,n)
+
+# ifndef DATA_TYPE
+#  define DATA_TYPE double
+#  define DATA_PRINTF_MODIFIER "%0.2lf "
+# endif
+
+
+#endif /* !TEMPLATE */
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/time_benchmark.sh b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/time_benchmark.sh
new file mode 100755
index 000000000..35c0104b2
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/applications/polybench/utilities/time_benchmark.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+## time_benchmark.sh for  in /Users/pouchet
+##
+## Made by Louis-Noel Pouchet
+## Contact: <pouchet@cse.ohio-state.edu>
+##
+## Started on  Sat Oct 29 00:03:48 2011 Louis-Noel Pouchet
+## Last update Sat Oct 29 01:16:34 2011 Louis-Noel Pouchet
+##
+
+## Maximal variance accepted between the 3 median runs for performance results.
+## Here 5%
+VARIANCE_ACCEPTED=5;
+
+if [ $# -ne 1 ]; then
+    echo "Usage: ./time_benchmarh.sh <binary_name>";
+    echo "Example: ./time_benchmarh.sh \"./a.out\"";
+    echo "Note: the file must be a Polybench program compiled with -DPOLYBENCH_TIME";
+    exit 1;
+fi;
+
+
+compute_mean_exec_time()
+{
+    file="$1";
+    benchcomputed="$2";
+    cat "$file" | grep "[0-9]\+" | sort -n | head -n 4 | tail -n 3 > avg.out;
+    expr="(0";
+    while read n; do
+	expr="$expr+$n";
+    done < avg.out;
+    time=`echo "scale=8;$expr)/3" | bc`;
+    tmp=`echo "$time" | cut -d '.' -f 1`;
+    if [ -z "$tmp" ]; then
+	time="0$time";
+    fi;
+    val1=`cat avg.out | head -n 1`;
+    val2=`cat avg.out | head -n 2 | tail -n 1`;
+    val3=`cat avg.out | head -n 3 | tail -n 1`;
+    val11=`echo "a=$val1 - $time;if(0>a)a*=-1;a" | bc 2>&1`;
+    test_err=`echo "$val11" | grep error`;
+    if ! [ -z "$test_err" ]; then
+	echo "[ERROR] Program output does not match expected single-line with time.";
+	echo "[ERROR] The program must be a PolyBench, compiled with -DPOLYBENCH_TIME";
+	exit 1;
+    fi;
+    val12=`echo "a=$val2 - $time;if(0>a)a*=-1;a" | bc`;
+    val13=`echo "a=$val3 - $time;if(0>a)a*=-1;a" | bc`;
+    myvar=`echo "$val11 $val12 $val13" | awk '{ if ($1 > $2) { if ($1 > $3) print $1; else print $3; } else { if ($2 > $3) print $2; else print $3; } }'`;
+    variance=`echo "scale=5;($myvar/$time)*100" | bc`;
+    tmp=`echo "$variance" | cut -d '.' -f 1`;
+    if [ -z "$tmp" ]; then
+	variance="0$variance";
+    fi;
+    compvar=`echo "$variance $VARIANCE_ACCEPTED" | awk '{ if ($1 < $2) print "ok"; else print "error"; }'`;
+    if [ "$compvar" = "error" ]; then
+	$ECHO_CMD "\033[31m[WARNING]\033[0m Variance is above thresold, unsafe performance measurement";
+	$ECHO_CMD "        => max deviation=$variance%, tolerance=$VARIANCE_ACCEPTED%";
+	WARNING_VARIANCE="$WARNING_VARIANCE\n$benchcomputed: max deviation=$variance%, tolerance=$VARIANCE_ACCEPTED%";
+    else
+	echo "[INFO] Maximal deviation from arithmetic mean of 3 average runs: $variance%";
+    fi;
+    PROCESSED_TIME="$time";
+    rm -f avg.out;
+}
+
+echo "[INFO] Running 5 times $1..."
+echo "[INFO] Maximal variance authorized on 3 average runs: $VARIANCE_ACCEPTED%)...";
+
+$1 > ____tempfile.data.polybench;
+$1 >> ____tempfile.data.polybench;
+$1 >> ____tempfile.data.polybench;
+$1 >> ____tempfile.data.polybench;
+$1 >> ____tempfile.data.polybench;
+
+compute_mean_exec_time "____tempfile.data.polybench" "$1";
+echo "[INFO] Normalized time: $PROCESSED_TIME";
+rm -f ____tempfile.data.polybench;
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/flake.lock b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/flake.lock
new file mode 100644
index 000000000..714221367
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/flake.lock
@@ -0,0 +1,336 @@
+{
+  "nodes": {
+    "buildbot-nix": {
+      "inputs": {
+        "flake-parts": [
+          "doctor-cluster",
+          "flake-parts"
+        ],
+        "hercules-ci-effects": "hercules-ci-effects",
+        "nixpkgs": [
+          "doctor-cluster",
+          "nixpkgs"
+        ],
+        "treefmt-nix": [
+          "doctor-cluster",
+          "treefmt-nix"
+        ]
+      },
+      "locked": {
+        "lastModified": 1732788902,
+        "narHash": "sha256-8czKpLb/y2h7fr6VxIShtUSoLdo5MTMzZSztwIPPhts=",
+        "owner": "nix-community",
+        "repo": "buildbot-nix",
+        "rev": "2695e33353d7bffb2073dc6a1789502dd9e7b9fd",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "buildbot-nix",
+        "type": "github"
+      }
+    },
+    "disko": {
+      "inputs": {
+        "nixpkgs": [
+          "doctor-cluster",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1732919362,
+        "narHash": "sha256-3SxlMD3nSI90+pHOF27SuLEt3+wew8xl+sUJaJMeHOI=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "b71e3faca99b40fb801f03fd950fbefbbba691a4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "doctor-cluster": {
+      "inputs": {
+        "buildbot-nix": "buildbot-nix",
+        "disko": "disko",
+        "flake-parts": "flake-parts",
+        "flake-registry": "flake-registry",
+        "home-manager": "home-manager",
+        "nix-index-database": "nix-index-database",
+        "nixos-generators": "nixos-generators",
+        "nixos-hardware": "nixos-hardware",
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "retiolum": "retiolum",
+        "sops-nix": "sops-nix",
+        "srvos": "srvos",
+        "treefmt-nix": "treefmt-nix"
+      },
+      "locked": {
+        "lastModified": 1734700921,
+        "narHash": "sha256-7adXKMawYb2oWxK0DMhLnlUY5wJMS6BFh15JNGxdwZI=",
+        "owner": "TUM-DSE",
+        "repo": "doctor-cluster-config",
+        "rev": "5f0eee4a3fa20ce636f9ff045118ee455c79ee8c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "TUM-DSE",
+        "repo": "doctor-cluster-config",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": [
+          "doctor-cluster",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1730504689,
+        "narHash": "sha256-hgmguH29K2fvs9szpq2r3pz2/8cJd2LPS+b4tfNFCwE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "506278e768c2a08bec68eb62932193e341f55c90",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-registry": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1717415742,
+        "narHash": "sha256-HKvoLGZUsBpjkxWkdtctGYj6RH0bl6vcw0OjTOqyzJk=",
+        "owner": "NixOS",
+        "repo": "flake-registry",
+        "rev": "895a65f8d5acf848136ee8fe8e8f736f0d27df96",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "flake-registry",
+        "type": "github"
+      }
+    },
+    "hercules-ci-effects": {
+      "inputs": {
+        "flake-parts": [
+          "doctor-cluster",
+          "buildbot-nix",
+          "flake-parts"
+        ],
+        "nixpkgs": [
+          "doctor-cluster",
+          "buildbot-nix",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1730903510,
+        "narHash": "sha256-mnynlrPeiW0nUQ8KGZHb3WyxAxA3Ye/BH8gMjdoKP6E=",
+        "owner": "hercules-ci",
+        "repo": "hercules-ci-effects",
+        "rev": "b89ac4d66d618b915b1f0a408e2775fe3821d141",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "hercules-ci-effects",
+        "type": "github"
+      }
+    },
+    "home-manager": {
+      "inputs": {
+        "nixpkgs": [
+          "doctor-cluster",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1732466619,
+        "narHash": "sha256-T1e5oceypZu3Q8vzICjv1X/sGs9XfJRMW5OuXHgpB3c=",
+        "owner": "nix-community",
+        "repo": "home-manager",
+        "rev": "f3111f62a23451114433888902a55cf0692b408d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "ref": "release-24.11",
+        "repo": "home-manager",
+        "type": "github"
+      }
+    },
+    "nix-index-database": {
+      "inputs": {
+        "nixpkgs": [
+          "doctor-cluster",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1732519917,
+        "narHash": "sha256-AGXhwHdJV0q/WNgqwrR2zriubLr785b02FphaBtyt1Q=",
+        "owner": "Mic92",
+        "repo": "nix-index-database",
+        "rev": "f4a5ca5771ba9ca31ad24a62c8d511a405303436",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Mic92",
+        "repo": "nix-index-database",
+        "type": "github"
+      }
+    },
+    "nixos-generators": {
+      "inputs": {
+        "nixlib": [
+          "doctor-cluster",
+          "nixpkgs"
+        ],
+        "nixpkgs": [
+          "doctor-cluster",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1732496924,
+        "narHash": "sha256-/MNhZLR0eh9z/d3l+ammq+F5XxHln0RHgO4Bhtjr0IM=",
+        "owner": "nix-community",
+        "repo": "nixos-generators",
+        "rev": "098e8b6ff72c86944a8d54b64ddd7b7e6635830a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-generators",
+        "type": "github"
+      }
+    },
+    "nixos-hardware": {
+      "locked": {
+        "lastModified": 1732483221,
+        "narHash": "sha256-kF6rDeCshoCgmQz+7uiuPdREVFuzhIorGOoPXMalL2U=",
+        "owner": "NixOS",
+        "repo": "nixos-hardware",
+        "rev": "45348ad6fb8ac0e8415f6e5e96efe47dd7f39405",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixos-hardware",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1735834308,
+        "narHash": "sha256-dklw3AXr3OGO4/XT1Tu3Xz9n/we8GctZZ75ZWVqAVhk=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "6df24922a1400241dae323af55f30e4318a6ca65",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "retiolum": {
+      "locked": {
+        "lastModified": 1731340814,
+        "narHash": "sha256-2SiSp+UV9c45FPeDUUtjiIOMgyOKYAbpO0IEEjkgb54=",
+        "owner": "Mic92",
+        "repo": "retiolum",
+        "rev": "30c7f45de25bd35641ba09bd7bbde084804f2b61",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Mic92",
+        "repo": "retiolum",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "doctor-cluster": "doctor-cluster",
+        "nixpkgs": "nixpkgs"
+      }
+    },
+    "sops-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "doctor-cluster",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1732575825,
+        "narHash": "sha256-xtt95+c7OUMoqZf4OvA/7AemiH3aVuWHQbErYQoPwFk=",
+        "owner": "Mic92",
+        "repo": "sops-nix",
+        "rev": "3433ea14fbd9e6671d0ff0dd45ed15ee4c156ffa",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Mic92",
+        "repo": "sops-nix",
+        "type": "github"
+      }
+    },
+    "srvos": {
+      "inputs": {
+        "nixpkgs": [
+          "doctor-cluster",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1732791727,
+        "narHash": "sha256-E3ki8879tKii42pjibenRpJSDVW0mJFfSWHbci5Ck0s=",
+        "owner": "numtide",
+        "repo": "srvos",
+        "rev": "ce61f7168038e4077ed6e27a4aa9f2c3c3500099",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "srvos",
+        "type": "github"
+      }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "doctor-cluster",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1732894027,
+        "narHash": "sha256-2qbdorpq0TXHBWbVXaTqKoikN4bqAtAplTwGuII+oAc=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "6209c381904cab55796c5d7350e89681d3b2a8ef",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/flake.nix b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/flake.nix
new file mode 100644
index 000000000..57271bb01
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/flake.nix
@@ -0,0 +1,49 @@
+{
+  description = "cheri-microanalysis dev shell";
+
+  inputs = {
+    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
+    doctor-cluster.url = "github:TUM-DSE/doctor-cluster-config";
+    doctor-cluster.inputs.nixpkgs.follows = "nixpkgs";
+  };
+
+  outputs =
+    { nixpkgs, doctor-cluster, ... }:
+    let
+      system = "aarch64-linux";
+      pkgs = nixpkgs.legacyPackages.${system};
+      doctorPackages = doctor-cluster.packages.${system};
+      python = pkgs.python3;
+      pythonPackages = python.pkgs;
+    in
+    {
+      devShells.${system}.default = pkgs.mkShell {
+        nativeBuildInputs = [
+          doctorPackages.clang-morello
+          doctorPackages.llvm-morello-purecap
+          doctorPackages.musl-morello-purecap
+        ];
+        buildInputs = [
+          pkgs.valgrind
+          pkgs.just
+          pkgs.bc
+          pkgs.hwloc
+          python
+          pythonPackages.pandas
+          pythonPackages.matplotlib
+          pythonPackages.numpy
+          pythonPackages.jinja2
+        ];
+
+        CLANG_HYBRID_PATH = "${doctorPackages.clang-morello}/bin/clang";
+        CLANG_PURECAP_PATH = "${doctorPackages.llvm-morello-purecap}/bin/clang";
+        MUSL_PATH = "${doctorPackages.musl-morello-purecap}";
+        LLVM_PATH = "${doctorPackages.llvm-morello-purecap}";
+
+        shellHook = ''
+          alias clang-hybrid="$CLANG_HYBRID_PATH"
+          alias clang-purecap="$CLANG_PURECAP_PATH"
+        '';
+      };
+    };
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/instruction_latency_weird.png b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/instruction_latency_weird.png
new file mode 100644
index 000000000..bddb2af1a
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/instruction_latency_weird.png
Binary files differdiff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/instructions.png b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/instructions.png
new file mode 100644
index 000000000..ffda5fd3b
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/instructions.png
Binary files differdiff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/memory_latency_plot.svg b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/memory_latency_plot.svg
new file mode 100644
index 000000000..bd9795837
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/images/memory_latency_plot.svg
@@ -0,0 +1,1719 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>1980-01-01T00:00:00+00:00</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.9.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 345.6 
+L 460.8 345.6 
+L 460.8 0 
+L 0 0 
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 57.6 307.584 
+L 414.72 307.584 
+L 414.72 41.472 
+L 57.6 41.472 
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <path d="M 113.507701 307.584 
+L 113.507701 41.472 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_2">
+      <defs>
+       <path id="me141eae672" d="M 0 0 
+L 0 3.5 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#me141eae672" x="113.507701" y="307.584" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- $\mathdefault{10^{1}}$ -->
+      <g transform="translate(104.707701 322.182437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531 
+L 1825 531 
+L 1825 4091 
+L 703 3866 
+L 703 4441 
+L 1819 4666 
+L 2450 4666 
+L 2450 531 
+L 3481 531 
+L 3481 0 
+L 794 0 
+L 794 531 
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-30" d="M 2034 4250 
+Q 1547 4250 1301 3770 
+Q 1056 3291 1056 2328 
+Q 1056 1369 1301 889 
+Q 1547 409 2034 409 
+Q 2525 409 2770 889 
+Q 3016 1369 3016 2328 
+Q 3016 3291 2770 3770 
+Q 2525 4250 2034 4250 
+z
+M 2034 4750 
+Q 2819 4750 3233 4129 
+Q 3647 3509 3647 2328 
+Q 3647 1150 3233 529 
+Q 2819 -91 2034 -91 
+Q 1250 -91 836 529 
+Q 422 1150 422 2328 
+Q 422 3509 836 4129 
+Q 1250 4750 2034 4750 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.684375)"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.684375)"/>
+       <use xlink:href="#DejaVuSans-31" transform="translate(128.203125 38.965625) scale(0.7)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_3">
+      <path d="M 170.269757 307.584 
+L 170.269757 41.472 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#me141eae672" x="170.269757" y="307.584" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- $\mathdefault{10^{2}}$ -->
+      <g transform="translate(161.469757 322.182437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-32" d="M 1228 531 
+L 3431 531 
+L 3431 0 
+L 469 0 
+L 469 531 
+Q 828 903 1448 1529 
+Q 2069 2156 2228 2338 
+Q 2531 2678 2651 2914 
+Q 2772 3150 2772 3378 
+Q 2772 3750 2511 3984 
+Q 2250 4219 1831 4219 
+Q 1534 4219 1204 4116 
+Q 875 4013 500 3803 
+L 500 4441 
+Q 881 4594 1212 4672 
+Q 1544 4750 1819 4750 
+Q 2544 4750 2975 4387 
+Q 3406 4025 3406 3419 
+Q 3406 3131 3298 2873 
+Q 3191 2616 2906 2266 
+Q 2828 2175 2409 1742 
+Q 1991 1309 1228 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.765625)"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.765625)"/>
+       <use xlink:href="#DejaVuSans-32" transform="translate(128.203125 39.046875) scale(0.7)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_5">
+      <path d="M 227.031813 307.584 
+L 227.031813 41.472 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#me141eae672" x="227.031813" y="307.584" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- $\mathdefault{10^{3}}$ -->
+      <g transform="translate(218.231813 322.182437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-33" d="M 2597 2516 
+Q 3050 2419 3304 2112 
+Q 3559 1806 3559 1356 
+Q 3559 666 3084 287 
+Q 2609 -91 1734 -91 
+Q 1441 -91 1130 -33 
+Q 819 25 488 141 
+L 488 750 
+Q 750 597 1062 519 
+Q 1375 441 1716 441 
+Q 2309 441 2620 675 
+Q 2931 909 2931 1356 
+Q 2931 1769 2642 2001 
+Q 2353 2234 1838 2234 
+L 1294 2234 
+L 1294 2753 
+L 1863 2753 
+Q 2328 2753 2575 2939 
+Q 2822 3125 2822 3475 
+Q 2822 3834 2567 4026 
+Q 2313 4219 1838 4219 
+Q 1578 4219 1281 4162 
+Q 984 4106 628 3988 
+L 628 4550 
+Q 988 4650 1302 4700 
+Q 1616 4750 1894 4750 
+Q 2613 4750 3031 4423 
+Q 3450 4097 3450 3541 
+Q 3450 3153 3228 2886 
+Q 3006 2619 2597 2516 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.765625)"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.765625)"/>
+       <use xlink:href="#DejaVuSans-33" transform="translate(128.203125 39.046875) scale(0.7)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_7">
+      <path d="M 283.793868 307.584 
+L 283.793868 41.472 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#me141eae672" x="283.793868" y="307.584" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- $\mathdefault{10^{4}}$ -->
+      <g transform="translate(274.993868 322.182437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116 
+L 825 1625 
+L 2419 1625 
+L 2419 4116 
+z
+M 2253 4666 
+L 3047 4666 
+L 3047 1625 
+L 3713 1625 
+L 3713 1100 
+L 3047 1100 
+L 3047 0 
+L 2419 0 
+L 2419 1100 
+L 313 1100 
+L 313 1709 
+L 2253 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.684375)"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.684375)"/>
+       <use xlink:href="#DejaVuSans-34" transform="translate(128.203125 38.965625) scale(0.7)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_9">
+      <path d="M 340.555924 307.584 
+L 340.555924 41.472 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#me141eae672" x="340.555924" y="307.584" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- $\mathdefault{10^{5}}$ -->
+      <g transform="translate(331.755924 322.182437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666 
+L 3169 4666 
+L 3169 4134 
+L 1269 4134 
+L 1269 2991 
+Q 1406 3038 1543 3061 
+Q 1681 3084 1819 3084 
+Q 2600 3084 3056 2656 
+Q 3513 2228 3513 1497 
+Q 3513 744 3044 326 
+Q 2575 -91 1722 -91 
+Q 1428 -91 1123 -41 
+Q 819 9 494 109 
+L 494 744 
+Q 775 591 1075 516 
+Q 1375 441 1709 441 
+Q 2250 441 2565 725 
+Q 2881 1009 2881 1497 
+Q 2881 1984 2565 2268 
+Q 2250 2553 1709 2553 
+Q 1456 2553 1204 2497 
+Q 953 2441 691 2322 
+L 691 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.684375)"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.684375)"/>
+       <use xlink:href="#DejaVuSans-35" transform="translate(128.203125 38.965625) scale(0.7)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_11">
+      <path d="M 397.317979 307.584 
+L 397.317979 41.472 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#me141eae672" x="397.317979" y="307.584" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- $\mathdefault{10^{6}}$ -->
+      <g transform="translate(388.517979 322.182437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-36" d="M 2113 2584 
+Q 1688 2584 1439 2293 
+Q 1191 2003 1191 1497 
+Q 1191 994 1439 701 
+Q 1688 409 2113 409 
+Q 2538 409 2786 701 
+Q 3034 994 3034 1497 
+Q 3034 2003 2786 2293 
+Q 2538 2584 2113 2584 
+z
+M 3366 4563 
+L 3366 3988 
+Q 3128 4100 2886 4159 
+Q 2644 4219 2406 4219 
+Q 1781 4219 1451 3797 
+Q 1122 3375 1075 2522 
+Q 1259 2794 1537 2939 
+Q 1816 3084 2150 3084 
+Q 2853 3084 3261 2657 
+Q 3669 2231 3669 1497 
+Q 3669 778 3244 343 
+Q 2819 -91 2113 -91 
+Q 1303 -91 875 529 
+Q 447 1150 447 2328 
+Q 447 3434 972 4092 
+Q 1497 4750 2381 4750 
+Q 2619 4750 2861 4703 
+Q 3103 4656 3366 4563 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.765625)"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.765625)"/>
+       <use xlink:href="#DejaVuSans-36" transform="translate(128.203125 39.046875) scale(0.7)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_13">
+      <defs>
+       <path id="mcf332b0532" d="M 0 0 
+L 0 2 
+" style="stroke: #000000; stroke-width: 0.6"/>
+      </defs>
+      <g>
+       <use xlink:href="#mcf332b0532" x="73.832727" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_8">
+     <g id="line2d_14">
+      <g>
+       <use xlink:href="#mcf332b0532" x="83.828029" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_9">
+     <g id="line2d_15">
+      <g>
+       <use xlink:href="#mcf332b0532" x="90.919809" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_10">
+     <g id="line2d_16">
+      <g>
+       <use xlink:href="#mcf332b0532" x="96.42062" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_11">
+     <g id="line2d_17">
+      <g>
+       <use xlink:href="#mcf332b0532" x="100.91511" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_12">
+     <g id="line2d_18">
+      <g>
+       <use xlink:href="#mcf332b0532" x="104.715148" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_13">
+     <g id="line2d_19">
+      <g>
+       <use xlink:href="#mcf332b0532" x="108.00689" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_14">
+     <g id="line2d_20">
+      <g>
+       <use xlink:href="#mcf332b0532" x="110.910412" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_15">
+     <g id="line2d_21">
+      <g>
+       <use xlink:href="#mcf332b0532" x="130.594783" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_16">
+     <g id="line2d_22">
+      <g>
+       <use xlink:href="#mcf332b0532" x="140.590085" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_17">
+     <g id="line2d_23">
+      <g>
+       <use xlink:href="#mcf332b0532" x="147.681864" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_18">
+     <g id="line2d_24">
+      <g>
+       <use xlink:href="#mcf332b0532" x="153.182676" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_19">
+     <g id="line2d_25">
+      <g>
+       <use xlink:href="#mcf332b0532" x="157.677166" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_20">
+     <g id="line2d_26">
+      <g>
+       <use xlink:href="#mcf332b0532" x="161.477203" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_21">
+     <g id="line2d_27">
+      <g>
+       <use xlink:href="#mcf332b0532" x="164.768946" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_22">
+     <g id="line2d_28">
+      <g>
+       <use xlink:href="#mcf332b0532" x="167.672468" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_23">
+     <g id="line2d_29">
+      <g>
+       <use xlink:href="#mcf332b0532" x="187.356838" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_24">
+     <g id="line2d_30">
+      <g>
+       <use xlink:href="#mcf332b0532" x="197.35214" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_25">
+     <g id="line2d_31">
+      <g>
+       <use xlink:href="#mcf332b0532" x="204.44392" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_26">
+     <g id="line2d_32">
+      <g>
+       <use xlink:href="#mcf332b0532" x="209.944731" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_27">
+     <g id="line2d_33">
+      <g>
+       <use xlink:href="#mcf332b0532" x="214.439222" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_28">
+     <g id="line2d_34">
+      <g>
+       <use xlink:href="#mcf332b0532" x="218.239259" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_29">
+     <g id="line2d_35">
+      <g>
+       <use xlink:href="#mcf332b0532" x="221.531001" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_30">
+     <g id="line2d_36">
+      <g>
+       <use xlink:href="#mcf332b0532" x="224.434523" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_31">
+     <g id="line2d_37">
+      <g>
+       <use xlink:href="#mcf332b0532" x="244.118894" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_32">
+     <g id="line2d_38">
+      <g>
+       <use xlink:href="#mcf332b0532" x="254.114196" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_33">
+     <g id="line2d_39">
+      <g>
+       <use xlink:href="#mcf332b0532" x="261.205975" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_34">
+     <g id="line2d_40">
+      <g>
+       <use xlink:href="#mcf332b0532" x="266.706787" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_35">
+     <g id="line2d_41">
+      <g>
+       <use xlink:href="#mcf332b0532" x="271.201277" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_36">
+     <g id="line2d_42">
+      <g>
+       <use xlink:href="#mcf332b0532" x="275.001315" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_37">
+     <g id="line2d_43">
+      <g>
+       <use xlink:href="#mcf332b0532" x="278.293057" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_38">
+     <g id="line2d_44">
+      <g>
+       <use xlink:href="#mcf332b0532" x="281.196579" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_39">
+     <g id="line2d_45">
+      <g>
+       <use xlink:href="#mcf332b0532" x="300.88095" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_40">
+     <g id="line2d_46">
+      <g>
+       <use xlink:href="#mcf332b0532" x="310.876251" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_41">
+     <g id="line2d_47">
+      <g>
+       <use xlink:href="#mcf332b0532" x="317.968031" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_42">
+     <g id="line2d_48">
+      <g>
+       <use xlink:href="#mcf332b0532" x="323.468842" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_43">
+     <g id="line2d_49">
+      <g>
+       <use xlink:href="#mcf332b0532" x="327.963333" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_44">
+     <g id="line2d_50">
+      <g>
+       <use xlink:href="#mcf332b0532" x="331.76337" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_45">
+     <g id="line2d_51">
+      <g>
+       <use xlink:href="#mcf332b0532" x="335.055112" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_46">
+     <g id="line2d_52">
+      <g>
+       <use xlink:href="#mcf332b0532" x="337.958635" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_47">
+     <g id="line2d_53">
+      <g>
+       <use xlink:href="#mcf332b0532" x="357.643005" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_48">
+     <g id="line2d_54">
+      <g>
+       <use xlink:href="#mcf332b0532" x="367.638307" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_49">
+     <g id="line2d_55">
+      <g>
+       <use xlink:href="#mcf332b0532" x="374.730086" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_50">
+     <g id="line2d_56">
+      <g>
+       <use xlink:href="#mcf332b0532" x="380.230898" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_51">
+     <g id="line2d_57">
+      <g>
+       <use xlink:href="#mcf332b0532" x="384.725388" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_52">
+     <g id="line2d_58">
+      <g>
+       <use xlink:href="#mcf332b0532" x="388.525426" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_53">
+     <g id="line2d_59">
+      <g>
+       <use xlink:href="#mcf332b0532" x="391.817168" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_54">
+     <g id="line2d_60">
+      <g>
+       <use xlink:href="#mcf332b0532" x="394.72069" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_55">
+     <g id="line2d_61">
+      <g>
+       <use xlink:href="#mcf332b0532" x="414.405061" y="307.584" style="stroke: #000000; stroke-width: 0.6"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_7">
+     <!-- size (kB) -->
+     <g transform="translate(214.649062 335.860562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-73" d="M 2834 3397 
+L 2834 2853 
+Q 2591 2978 2328 3040 
+Q 2066 3103 1784 3103 
+Q 1356 3103 1142 2972 
+Q 928 2841 928 2578 
+Q 928 2378 1081 2264 
+Q 1234 2150 1697 2047 
+L 1894 2003 
+Q 2506 1872 2764 1633 
+Q 3022 1394 3022 966 
+Q 3022 478 2636 193 
+Q 2250 -91 1575 -91 
+Q 1294 -91 989 -36 
+Q 684 19 347 128 
+L 347 722 
+Q 666 556 975 473 
+Q 1284 391 1588 391 
+Q 1994 391 2212 530 
+Q 2431 669 2431 922 
+Q 2431 1156 2273 1281 
+Q 2116 1406 1581 1522 
+L 1381 1569 
+Q 847 1681 609 1914 
+Q 372 2147 372 2553 
+Q 372 3047 722 3315 
+Q 1072 3584 1716 3584 
+Q 2034 3584 2315 3537 
+Q 2597 3491 2834 3397 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500 
+L 1178 3500 
+L 1178 0 
+L 603 0 
+L 603 3500 
+z
+M 603 4863 
+L 1178 4863 
+L 1178 4134 
+L 603 4134 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-7a" d="M 353 3500 
+L 3084 3500 
+L 3084 2975 
+L 922 459 
+L 3084 459 
+L 3084 0 
+L 275 0 
+L 275 525 
+L 2438 3041 
+L 353 3041 
+L 353 3500 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894 
+L 3597 1613 
+L 953 1613 
+Q 991 1019 1311 708 
+Q 1631 397 2203 397 
+Q 2534 397 2845 478 
+Q 3156 559 3463 722 
+L 3463 178 
+Q 3153 47 2828 -22 
+Q 2503 -91 2169 -91 
+Q 1331 -91 842 396 
+Q 353 884 353 1716 
+Q 353 2575 817 3079 
+Q 1281 3584 2069 3584 
+Q 2775 3584 3186 3129 
+Q 3597 2675 3597 1894 
+z
+M 3022 2063 
+Q 3016 2534 2758 2815 
+Q 2500 3097 2075 3097 
+Q 1594 3097 1305 2825 
+Q 1016 2553 972 2059 
+L 3022 2063 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856 
+Q 1566 4138 1362 3434 
+Q 1159 2731 1159 2009 
+Q 1159 1288 1364 580 
+Q 1569 -128 1984 -844 
+L 1484 -844 
+Q 1016 -109 783 600 
+Q 550 1309 550 2009 
+Q 550 2706 781 3412 
+Q 1013 4119 1484 4856 
+L 1984 4856 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6b" d="M 581 4863 
+L 1159 4863 
+L 1159 1991 
+L 2875 3500 
+L 3609 3500 
+L 1753 1863 
+L 3688 0 
+L 2938 0 
+L 1159 1709 
+L 1159 0 
+L 581 0 
+L 581 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-42" d="M 1259 2228 
+L 1259 519 
+L 2272 519 
+Q 2781 519 3026 730 
+Q 3272 941 3272 1375 
+Q 3272 1813 3026 2020 
+Q 2781 2228 2272 2228 
+L 1259 2228 
+z
+M 1259 4147 
+L 1259 2741 
+L 2194 2741 
+Q 2656 2741 2882 2914 
+Q 3109 3088 3109 3444 
+Q 3109 3797 2882 3972 
+Q 2656 4147 2194 4147 
+L 1259 4147 
+z
+M 628 4666 
+L 2241 4666 
+Q 2963 4666 3353 4366 
+Q 3744 4066 3744 3513 
+Q 3744 3084 3544 2831 
+Q 3344 2578 2956 2516 
+Q 3422 2416 3680 2098 
+Q 3938 1781 3938 1306 
+Q 3938 681 3513 340 
+Q 3088 0 2303 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856 
+L 1013 4856 
+Q 1481 4119 1714 3412 
+Q 1947 2706 1947 2009 
+Q 1947 1309 1714 600 
+Q 1481 -109 1013 -844 
+L 513 -844 
+Q 928 -128 1133 580 
+Q 1338 1288 1338 2009 
+Q 1338 2731 1133 3434 
+Q 928 4138 513 4856 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-73"/>
+      <use xlink:href="#DejaVuSans-69" x="52.099609"/>
+      <use xlink:href="#DejaVuSans-7a" x="79.882812"/>
+      <use xlink:href="#DejaVuSans-65" x="132.373047"/>
+      <use xlink:href="#DejaVuSans-20" x="193.896484"/>
+      <use xlink:href="#DejaVuSans-28" x="225.683594"/>
+      <use xlink:href="#DejaVuSans-6b" x="264.697266"/>
+      <use xlink:href="#DejaVuSans-42" x="322.607422"/>
+      <use xlink:href="#DejaVuSans-29" x="391.210938"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_62">
+      <path d="M 57.6 297.860717 
+L 414.72 297.860717 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_63">
+      <defs>
+       <path id="mbb662c6e75" d="M 0 0 
+L -3.5 0 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#mbb662c6e75" x="57.6" y="297.860717" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 0 -->
+      <g transform="translate(44.2375 301.659936) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_64">
+      <path d="M 57.6 268.203417 
+L 414.72 268.203417 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_65">
+      <g>
+       <use xlink:href="#mbb662c6e75" x="57.6" y="268.203417" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 20 -->
+      <g transform="translate(37.875 272.002636) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_66">
+      <path d="M 57.6 238.546117 
+L 414.72 238.546117 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_67">
+      <g>
+       <use xlink:href="#mbb662c6e75" x="57.6" y="238.546117" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 40 -->
+      <g transform="translate(37.875 242.345336) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_68">
+      <path d="M 57.6 208.888817 
+L 414.72 208.888817 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_69">
+      <g>
+       <use xlink:href="#mbb662c6e75" x="57.6" y="208.888817" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 60 -->
+      <g transform="translate(37.875 212.688036) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_70">
+      <path d="M 57.6 179.231517 
+L 414.72 179.231517 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_71">
+      <g>
+       <use xlink:href="#mbb662c6e75" x="57.6" y="179.231517" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 80 -->
+      <g transform="translate(37.875 183.030735) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-38" d="M 2034 2216 
+Q 1584 2216 1326 1975 
+Q 1069 1734 1069 1313 
+Q 1069 891 1326 650 
+Q 1584 409 2034 409 
+Q 2484 409 2743 651 
+Q 3003 894 3003 1313 
+Q 3003 1734 2745 1975 
+Q 2488 2216 2034 2216 
+z
+M 1403 2484 
+Q 997 2584 770 2862 
+Q 544 3141 544 3541 
+Q 544 4100 942 4425 
+Q 1341 4750 2034 4750 
+Q 2731 4750 3128 4425 
+Q 3525 4100 3525 3541 
+Q 3525 3141 3298 2862 
+Q 3072 2584 2669 2484 
+Q 3125 2378 3379 2068 
+Q 3634 1759 3634 1313 
+Q 3634 634 3220 271 
+Q 2806 -91 2034 -91 
+Q 1263 -91 848 271 
+Q 434 634 434 1313 
+Q 434 1759 690 2068 
+Q 947 2378 1403 2484 
+z
+M 1172 3481 
+Q 1172 3119 1398 2916 
+Q 1625 2713 2034 2713 
+Q 2441 2713 2670 2916 
+Q 2900 3119 2900 3481 
+Q 2900 3844 2670 4047 
+Q 2441 4250 2034 4250 
+Q 1625 4250 1398 4047 
+Q 1172 3844 1172 3481 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-38"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_72">
+      <path d="M 57.6 149.574216 
+L 414.72 149.574216 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_73">
+      <g>
+       <use xlink:href="#mbb662c6e75" x="57.6" y="149.574216" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 100 -->
+      <g transform="translate(31.5125 153.373435) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_7">
+     <g id="line2d_74">
+      <path d="M 57.6 119.916916 
+L 414.72 119.916916 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_75">
+      <g>
+       <use xlink:href="#mbb662c6e75" x="57.6" y="119.916916" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 120 -->
+      <g transform="translate(31.5125 123.716135) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_8">
+     <g id="line2d_76">
+      <path d="M 57.6 90.259616 
+L 414.72 90.259616 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_77">
+      <g>
+       <use xlink:href="#mbb662c6e75" x="57.6" y="90.259616" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 140 -->
+      <g transform="translate(31.5125 94.058835) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-34" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_9">
+     <g id="line2d_78">
+      <path d="M 57.6 60.602316 
+L 414.72 60.602316 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_79">
+      <g>
+       <use xlink:href="#mbb662c6e75" x="57.6" y="60.602316" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_16">
+      <!-- 160 -->
+      <g transform="translate(31.5125 64.401534) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-36" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_17">
+     <!-- time (ns) -->
+     <g transform="translate(25.432812 197.088156) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-74" d="M 1172 4494 
+L 1172 3500 
+L 2356 3500 
+L 2356 3053 
+L 1172 3053 
+L 1172 1153 
+Q 1172 725 1289 603 
+Q 1406 481 1766 481 
+L 2356 481 
+L 2356 0 
+L 1766 0 
+Q 1100 0 847 248 
+Q 594 497 594 1153 
+L 594 3053 
+L 172 3053 
+L 172 3500 
+L 594 3500 
+L 594 4494 
+L 1172 4494 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828 
+Q 3544 3216 3844 3400 
+Q 4144 3584 4550 3584 
+Q 5097 3584 5394 3201 
+Q 5691 2819 5691 2113 
+L 5691 0 
+L 5113 0 
+L 5113 2094 
+Q 5113 2597 4934 2840 
+Q 4756 3084 4391 3084 
+Q 3944 3084 3684 2787 
+Q 3425 2491 3425 1978 
+L 3425 0 
+L 2847 0 
+L 2847 2094 
+Q 2847 2600 2669 2842 
+Q 2491 3084 2119 3084 
+Q 1678 3084 1418 2786 
+Q 1159 2488 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1356 3278 1631 3431 
+Q 1906 3584 2284 3584 
+Q 2666 3584 2933 3390 
+Q 3200 3197 3328 2828 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-74"/>
+      <use xlink:href="#DejaVuSans-69" x="39.208984"/>
+      <use xlink:href="#DejaVuSans-6d" x="66.992188"/>
+      <use xlink:href="#DejaVuSans-65" x="164.404297"/>
+      <use xlink:href="#DejaVuSans-20" x="225.927734"/>
+      <use xlink:href="#DejaVuSans-28" x="257.714844"/>
+      <use xlink:href="#DejaVuSans-6e" x="296.728516"/>
+      <use xlink:href="#DejaVuSans-73" x="360.107422"/>
+      <use xlink:href="#DejaVuSans-29" x="412.207031"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_80">
+    <path d="M 73.832727 295.465133 
+L 90.919809 295.487969 
+L 108.00689 295.475335 
+L 118.002192 295.487969 
+L 125.093971 295.488 
+L 135.089273 295.483967 
+L 142.181053 295.488 
+L 152.176354 295.482571 
+L 159.268134 295.487346 
+L 169.263436 289.83848 
+L 176.355215 289.738857 
+L 186.350517 289.786905 
+L 193.442297 289.391049 
+L 203.437598 288.97058 
+L 210.529378 285.9621 
+L 214.439222 284.151798 
+L 220.52468 281.564827 
+L 227.616459 272.256887 
+L 237.611761 257.652189 
+L 244.703541 248.10894 
+L 254.698843 242.525588 
+L 261.790622 233.09946 
+L 267.291434 216.457989 
+L 271.785924 195.686079 
+L 278.877703 164.426174 
+L 284.378515 149.120466 
+L 288.873005 141.024051 
+L 295.964785 134.302196 
+L 305.951057 130.386667 
+L 313.051866 129.055054 
+L 330.138947 125.545642 
+L 340.134249 123.103996 
+L 347.226029 119.179065 
+L 364.31311 106.948243 
+L 374.308412 95.558122 
+L 381.400191 86.543357 
+L 398.487273 59.314504 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_81">
+    <path d="M 73.832727 295.480644 
+L 90.919809 295.487969 
+L 108.00689 295.474979 
+L 118.002192 295.487999 
+L 125.093971 295.482721 
+L 135.089273 295.48797 
+L 142.181053 295.48797 
+L 152.176354 295.483313 
+L 159.268134 295.487227 
+L 169.263436 289.84717 
+L 176.355215 289.848445 
+L 186.350517 289.849097 
+L 193.442297 289.433848 
+L 203.437598 289.070857 
+L 210.529378 288.712937 
+L 214.439222 288.625382 
+L 220.52468 287.094733 
+L 227.616459 275.292891 
+L 237.611761 248.833293 
+L 244.703541 227.534261 
+L 254.698843 229.034245 
+L 261.790622 230.266205 
+L 267.291434 213.496516 
+L 271.785924 192.233698 
+L 278.877703 160.509281 
+L 284.378515 144.280151 
+L 288.873005 136.520513 
+L 295.964785 129.551185 
+L 305.951057 125.493116 
+L 313.051866 124.248492 
+L 330.138947 120.123721 
+L 340.134249 118.245887 
+L 347.226029 113.865399 
+L 364.31311 101.550702 
+L 374.308412 90.593625 
+L 381.400191 80.89633 
+L 398.487273 53.968541 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #ff7f0e; stroke-width: 1.5"/>
+   </g>
+   <g id="line2d_82">
+    <path d="M 73.832727 295.487941 
+L 90.919809 295.269178 
+L 108.00689 295.488 
+L 118.002192 295.488 
+L 125.093971 295.482899 
+L 135.089273 295.487969 
+L 142.181053 295.483313 
+L 152.176354 295.487939 
+L 159.268134 295.235812 
+L 169.263436 289.771985 
+L 176.355215 289.855919 
+L 186.350517 289.757748 
+L 193.442297 289.354334 
+L 203.437598 289.039951 
+L 210.529378 288.900111 
+L 214.439222 288.786103 
+L 220.52468 288.520392 
+L 227.616459 282.205631 
+L 237.611761 254.284515 
+L 244.703541 245.619752 
+L 254.698843 244.185313 
+L 261.790622 238.986694 
+L 267.291434 221.603874 
+L 271.785924 194.800828 
+L 278.877703 160.298381 
+L 284.378515 144.236733 
+L 288.873005 136.50936 
+L 295.964785 129.560644 
+L 305.951057 125.64817 
+L 313.051866 124.003572 
+L 330.138947 120.957454 
+L 340.134249 117.73386 
+L 347.226029 114.331308 
+L 364.31311 101.80532 
+L 374.308412 91.054461 
+L 381.400191 81.342812 
+L 398.487273 53.568 
+" clip-path="url(#p5b6486b67a)" style="fill: none; stroke-dasharray: 9.6,2.4,1.5,2.4; stroke-dashoffset: 0; stroke: #2ca02c; stroke-width: 1.5"/>
+   </g>
+   <g id="patch_3">
+    <path d="M 57.6 307.584 
+L 57.6 41.472 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 414.72 307.584 
+L 414.72 41.472 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 57.6 307.584 
+L 414.72 307.584 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 57.6 41.472 
+L 414.72 41.472 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 64.6 94.34075 
+L 252.16875 94.34075 
+Q 254.16875 94.34075 254.16875 92.34075 
+L 254.16875 48.472 
+Q 254.16875 46.472 252.16875 46.472 
+L 64.6 46.472 
+Q 62.6 46.472 62.6 48.472 
+L 62.6 92.34075 
+Q 62.6 94.34075 64.6 94.34075 
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+    </g>
+    <g id="line2d_83">
+     <path d="M 66.6 54.570438 
+L 76.6 54.570438 
+L 86.6 54.570438 
+" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_18">
+     <!-- ./memory_latency_nocap.csv -->
+     <g transform="translate(94.6 58.070438) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-2e" d="M 684 794 
+L 1344 794 
+L 1344 0 
+L 684 0 
+L 684 794 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2f" d="M 1625 4666 
+L 2156 4666 
+L 531 -594 
+L 0 -594 
+L 1625 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097 
+Q 1497 3097 1228 2736 
+Q 959 2375 959 1747 
+Q 959 1119 1226 758 
+Q 1494 397 1959 397 
+Q 2419 397 2687 759 
+Q 2956 1122 2956 1747 
+Q 2956 2369 2687 2733 
+Q 2419 3097 1959 3097 
+z
+M 1959 3584 
+Q 2709 3584 3137 3096 
+Q 3566 2609 3566 1747 
+Q 3566 888 3137 398 
+Q 2709 -91 1959 -91 
+Q 1206 -91 779 398 
+Q 353 888 353 1747 
+Q 353 2609 779 3096 
+Q 1206 3584 1959 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-72" d="M 2631 2963 
+Q 2534 3019 2420 3045 
+Q 2306 3072 2169 3072 
+Q 1681 3072 1420 2755 
+Q 1159 2438 1159 1844 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1341 3275 1631 3429 
+Q 1922 3584 2338 3584 
+Q 2397 3584 2469 3576 
+Q 2541 3569 2628 3553 
+L 2631 2963 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-79" d="M 2059 -325 
+Q 1816 -950 1584 -1140 
+Q 1353 -1331 966 -1331 
+L 506 -1331 
+L 506 -850 
+L 844 -850 
+Q 1081 -850 1212 -737 
+Q 1344 -625 1503 -206 
+L 1606 56 
+L 191 3500 
+L 800 3500 
+L 1894 763 
+L 2988 3500 
+L 3597 3500 
+L 2059 -325 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-5f" d="M 3263 -1063 
+L 3263 -1509 
+L -63 -1509 
+L -63 -1063 
+L 3263 -1063 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863 
+L 1178 4863 
+L 1178 0 
+L 603 0 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759 
+Q 1497 1759 1228 1600 
+Q 959 1441 959 1056 
+Q 959 750 1161 570 
+Q 1363 391 1709 391 
+Q 2188 391 2477 730 
+Q 2766 1069 2766 1631 
+L 2766 1759 
+L 2194 1759 
+z
+M 3341 1997 
+L 3341 0 
+L 2766 0 
+L 2766 531 
+Q 2569 213 2275 61 
+Q 1981 -91 1556 -91 
+Q 1019 -91 701 211 
+Q 384 513 384 1019 
+Q 384 1609 779 1909 
+Q 1175 2209 1959 2209 
+L 2766 2209 
+L 2766 2266 
+Q 2766 2663 2505 2880 
+Q 2244 3097 1772 3097 
+Q 1472 3097 1187 3025 
+Q 903 2953 641 2809 
+L 641 3341 
+Q 956 3463 1253 3523 
+Q 1550 3584 1831 3584 
+Q 2591 3584 2966 3190 
+Q 3341 2797 3341 1997 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366 
+L 3122 2828 
+Q 2878 2963 2633 3030 
+Q 2388 3097 2138 3097 
+Q 1578 3097 1268 2742 
+Q 959 2388 959 1747 
+Q 959 1106 1268 751 
+Q 1578 397 2138 397 
+Q 2388 397 2633 464 
+Q 2878 531 3122 666 
+L 3122 134 
+Q 2881 22 2623 -34 
+Q 2366 -91 2075 -91 
+Q 1284 -91 818 406 
+Q 353 903 353 1747 
+Q 353 2603 823 3093 
+Q 1294 3584 2113 3584 
+Q 2378 3584 2631 3529 
+Q 2884 3475 3122 3366 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-70" d="M 1159 525 
+L 1159 -1331 
+L 581 -1331 
+L 581 3500 
+L 1159 3500 
+L 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+z
+M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-76" d="M 191 3500 
+L 800 3500 
+L 1894 563 
+L 2988 3500 
+L 3597 3500 
+L 2284 0 
+L 1503 0 
+L 191 3500 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-2e"/>
+      <use xlink:href="#DejaVuSans-2f" x="31.787109"/>
+      <use xlink:href="#DejaVuSans-6d" x="65.478516"/>
+      <use xlink:href="#DejaVuSans-65" x="162.890625"/>
+      <use xlink:href="#DejaVuSans-6d" x="224.414062"/>
+      <use xlink:href="#DejaVuSans-6f" x="321.826172"/>
+      <use xlink:href="#DejaVuSans-72" x="383.007812"/>
+      <use xlink:href="#DejaVuSans-79" x="424.121094"/>
+      <use xlink:href="#DejaVuSans-5f" x="483.300781"/>
+      <use xlink:href="#DejaVuSans-6c" x="533.300781"/>
+      <use xlink:href="#DejaVuSans-61" x="561.083984"/>
+      <use xlink:href="#DejaVuSans-74" x="622.363281"/>
+      <use xlink:href="#DejaVuSans-65" x="661.572266"/>
+      <use xlink:href="#DejaVuSans-6e" x="723.095703"/>
+      <use xlink:href="#DejaVuSans-63" x="786.474609"/>
+      <use xlink:href="#DejaVuSans-79" x="841.455078"/>
+      <use xlink:href="#DejaVuSans-5f" x="900.634766"/>
+      <use xlink:href="#DejaVuSans-6e" x="950.634766"/>
+      <use xlink:href="#DejaVuSans-6f" x="1014.013672"/>
+      <use xlink:href="#DejaVuSans-63" x="1075.195312"/>
+      <use xlink:href="#DejaVuSans-61" x="1130.175781"/>
+      <use xlink:href="#DejaVuSans-70" x="1191.455078"/>
+      <use xlink:href="#DejaVuSans-2e" x="1254.931641"/>
+      <use xlink:href="#DejaVuSans-63" x="1286.71875"/>
+      <use xlink:href="#DejaVuSans-73" x="1341.699219"/>
+      <use xlink:href="#DejaVuSans-76" x="1393.798828"/>
+     </g>
+    </g>
+    <g id="line2d_84">
+     <path d="M 66.6 69.526688 
+L 76.6 69.526688 
+L 86.6 69.526688 
+" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #ff7f0e; stroke-width: 1.5"/>
+    </g>
+    <g id="text_19">
+     <!-- ./memory_latency_hybrid.csv -->
+     <g transform="translate(94.6 73.026688) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-68" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 4863 
+L 1159 4863 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-62" d="M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+M 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+L 1159 0 
+L 581 0 
+L 581 4863 
+L 1159 4863 
+L 1159 2969 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-64" d="M 2906 2969 
+L 2906 4863 
+L 3481 4863 
+L 3481 0 
+L 2906 0 
+L 2906 525 
+Q 2725 213 2448 61 
+Q 2172 -91 1784 -91 
+Q 1150 -91 751 415 
+Q 353 922 353 1747 
+Q 353 2572 751 3078 
+Q 1150 3584 1784 3584 
+Q 2172 3584 2448 3432 
+Q 2725 3281 2906 2969 
+z
+M 947 1747 
+Q 947 1113 1208 752 
+Q 1469 391 1925 391 
+Q 2381 391 2643 752 
+Q 2906 1113 2906 1747 
+Q 2906 2381 2643 2742 
+Q 2381 3103 1925 3103 
+Q 1469 3103 1208 2742 
+Q 947 2381 947 1747 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-2e"/>
+      <use xlink:href="#DejaVuSans-2f" x="31.787109"/>
+      <use xlink:href="#DejaVuSans-6d" x="65.478516"/>
+      <use xlink:href="#DejaVuSans-65" x="162.890625"/>
+      <use xlink:href="#DejaVuSans-6d" x="224.414062"/>
+      <use xlink:href="#DejaVuSans-6f" x="321.826172"/>
+      <use xlink:href="#DejaVuSans-72" x="383.007812"/>
+      <use xlink:href="#DejaVuSans-79" x="424.121094"/>
+      <use xlink:href="#DejaVuSans-5f" x="483.300781"/>
+      <use xlink:href="#DejaVuSans-6c" x="533.300781"/>
+      <use xlink:href="#DejaVuSans-61" x="561.083984"/>
+      <use xlink:href="#DejaVuSans-74" x="622.363281"/>
+      <use xlink:href="#DejaVuSans-65" x="661.572266"/>
+      <use xlink:href="#DejaVuSans-6e" x="723.095703"/>
+      <use xlink:href="#DejaVuSans-63" x="786.474609"/>
+      <use xlink:href="#DejaVuSans-79" x="841.455078"/>
+      <use xlink:href="#DejaVuSans-5f" x="900.634766"/>
+      <use xlink:href="#DejaVuSans-68" x="950.634766"/>
+      <use xlink:href="#DejaVuSans-79" x="1014.013672"/>
+      <use xlink:href="#DejaVuSans-62" x="1073.193359"/>
+      <use xlink:href="#DejaVuSans-72" x="1136.669922"/>
+      <use xlink:href="#DejaVuSans-69" x="1177.783203"/>
+      <use xlink:href="#DejaVuSans-64" x="1205.566406"/>
+      <use xlink:href="#DejaVuSans-2e" x="1269.042969"/>
+      <use xlink:href="#DejaVuSans-63" x="1300.830078"/>
+      <use xlink:href="#DejaVuSans-73" x="1355.810547"/>
+      <use xlink:href="#DejaVuSans-76" x="1407.910156"/>
+     </g>
+    </g>
+    <g id="line2d_85">
+     <path d="M 66.6 84.482938 
+L 76.6 84.482938 
+L 86.6 84.482938 
+" style="fill: none; stroke-dasharray: 9.6,2.4,1.5,2.4; stroke-dashoffset: 0; stroke: #2ca02c; stroke-width: 1.5"/>
+    </g>
+    <g id="text_20">
+     <!-- ./memory_latency_purecap.csv -->
+     <g transform="translate(94.6 87.982938) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-75" d="M 544 1381 
+L 544 3500 
+L 1119 3500 
+L 1119 1403 
+Q 1119 906 1312 657 
+Q 1506 409 1894 409 
+Q 2359 409 2629 706 
+Q 2900 1003 2900 1516 
+L 2900 3500 
+L 3475 3500 
+L 3475 0 
+L 2900 0 
+L 2900 538 
+Q 2691 219 2414 64 
+Q 2138 -91 1772 -91 
+Q 1169 -91 856 284 
+Q 544 659 544 1381 
+z
+M 1991 3584 
+L 1991 3584 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-2e"/>
+      <use xlink:href="#DejaVuSans-2f" x="31.787109"/>
+      <use xlink:href="#DejaVuSans-6d" x="65.478516"/>
+      <use xlink:href="#DejaVuSans-65" x="162.890625"/>
+      <use xlink:href="#DejaVuSans-6d" x="224.414062"/>
+      <use xlink:href="#DejaVuSans-6f" x="321.826172"/>
+      <use xlink:href="#DejaVuSans-72" x="383.007812"/>
+      <use xlink:href="#DejaVuSans-79" x="424.121094"/>
+      <use xlink:href="#DejaVuSans-5f" x="483.300781"/>
+      <use xlink:href="#DejaVuSans-6c" x="533.300781"/>
+      <use xlink:href="#DejaVuSans-61" x="561.083984"/>
+      <use xlink:href="#DejaVuSans-74" x="622.363281"/>
+      <use xlink:href="#DejaVuSans-65" x="661.572266"/>
+      <use xlink:href="#DejaVuSans-6e" x="723.095703"/>
+      <use xlink:href="#DejaVuSans-63" x="786.474609"/>
+      <use xlink:href="#DejaVuSans-79" x="841.455078"/>
+      <use xlink:href="#DejaVuSans-5f" x="900.634766"/>
+      <use xlink:href="#DejaVuSans-70" x="950.634766"/>
+      <use xlink:href="#DejaVuSans-75" x="1014.111328"/>
+      <use xlink:href="#DejaVuSans-72" x="1077.490234"/>
+      <use xlink:href="#DejaVuSans-65" x="1116.353516"/>
+      <use xlink:href="#DejaVuSans-63" x="1177.876953"/>
+      <use xlink:href="#DejaVuSans-61" x="1232.857422"/>
+      <use xlink:href="#DejaVuSans-70" x="1294.136719"/>
+      <use xlink:href="#DejaVuSans-2e" x="1357.613281"/>
+      <use xlink:href="#DejaVuSans-63" x="1389.400391"/>
+      <use xlink:href="#DejaVuSans-73" x="1444.380859"/>
+      <use xlink:href="#DejaVuSans-76" x="1496.480469"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="p5b6486b67a">
+   <rect x="57.6" y="41.472" width="357.12" height="266.112"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions.py b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions.py
new file mode 100644
index 000000000..a46cb64ef
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions.py
@@ -0,0 +1,211 @@
+import subprocess
+import statistics
+import pandas as pd
+import sys
+from enum import Enum
+
+# Defines all testable instructions.
+# Values correspond to CLI arguments passed to the test binaries.
+class Instruction(Enum):
+    LDR = 0
+    LDR_CAP = 1
+    STR = 2
+    STR_CAP = 3
+    LDAR = 4
+    STLR = 5
+    LDP = 6
+    LDP_CAP = 7
+    STP = 8
+    STP_CAP = 9
+    CVTD_TOCAP = 10
+    CFHI = 11
+    CTHI = 12
+    CVTD_TOPTR = 13
+    CVTP_TOCAP = 14
+    CVTP_TOPTR = 15
+    CVT_TOCAP = 16
+    CVT_TOPTR = 17
+    STR_INPLACE = 18
+    STR_CAP_INPLACE = 19
+    STP_INPLACE = 20
+    STP_CAP_INPLACE = 21
+
+
+class BinaryType(Enum):
+    PURECAP = "instructions_purecap.out"
+    NOCAP = "instructions_nocap.out"
+
+class Metric(Enum):
+    LATENCY = 0
+    THROUGHPUT = 1
+
+WARMUP_RUNS = 100
+TEST_RUNS = 10
+TEST_ITERATIONS = 1000000
+
+# Defines all permutations of binary type, instruction and metric that will be benchmarked.
+config = {
+    BinaryType.PURECAP: [
+        (Instruction.LDR, Metric.LATENCY),
+        (Instruction.LDR_CAP, Metric.LATENCY),
+        (Instruction.LDR, Metric.THROUGHPUT),
+        (Instruction.LDR_CAP, Metric.THROUGHPUT),
+        (Instruction.STR, Metric.THROUGHPUT),
+        (Instruction.STR_CAP, Metric.THROUGHPUT),
+        (Instruction.LDAR, Metric.THROUGHPUT),
+        (Instruction.STLR, Metric.THROUGHPUT),
+        (Instruction.LDP_CAP, Metric.LATENCY),
+        (Instruction.LDP, Metric.THROUGHPUT),
+        (Instruction.LDP_CAP, Metric.THROUGHPUT),
+        (Instruction.STP, Metric.THROUGHPUT),
+        (Instruction.STP_CAP, Metric.THROUGHPUT),
+        (Instruction.CVTD_TOCAP, Metric.LATENCY),
+        (Instruction.CVTD_TOCAP, Metric.THROUGHPUT),
+        (Instruction.CFHI, Metric.LATENCY),
+        (Instruction.CFHI, Metric.THROUGHPUT),
+        (Instruction.CTHI, Metric.LATENCY),
+        (Instruction.CTHI, Metric.THROUGHPUT),
+        (Instruction.CVTD_TOPTR, Metric.LATENCY),
+        (Instruction.CVTD_TOPTR, Metric.THROUGHPUT),
+        (Instruction.CVTP_TOCAP, Metric.LATENCY),
+        (Instruction.CVTP_TOCAP, Metric.THROUGHPUT),
+        (Instruction.CVTP_TOPTR, Metric.LATENCY),
+        (Instruction.CVTP_TOPTR, Metric.THROUGHPUT),
+        (Instruction.CVT_TOCAP, Metric.LATENCY),
+        (Instruction.CVT_TOCAP, Metric.THROUGHPUT),
+        (Instruction.CVT_TOPTR, Metric.LATENCY),
+        (Instruction.CVT_TOPTR, Metric.THROUGHPUT),
+        (Instruction.STR_INPLACE, Metric.THROUGHPUT),
+        (Instruction.STR_CAP_INPLACE, Metric.THROUGHPUT),
+        (Instruction.STP_INPLACE, Metric.THROUGHPUT),
+        (Instruction.STP_CAP_INPLACE, Metric.THROUGHPUT),
+    ],
+    BinaryType.NOCAP: [
+        (Instruction.LDR, Metric.LATENCY),
+        (Instruction.LDR, Metric.THROUGHPUT),
+        (Instruction.STR, Metric.THROUGHPUT),
+        (Instruction.LDAR, Metric.THROUGHPUT),
+        (Instruction.STLR, Metric.THROUGHPUT),
+        (Instruction.LDP, Metric.LATENCY),
+        (Instruction.LDP, Metric.THROUGHPUT),
+        (Instruction.STP, Metric.THROUGHPUT),
+        (Instruction.STR_INPLACE, Metric.THROUGHPUT),
+        (Instruction.STP_INPLACE, Metric.THROUGHPUT),
+    ]
+}
+
+def check_program_runs(binary_path, instruction, metric):
+    # Run with a single iteration to check if program works without errors
+    cmd = [binary_path, str(instruction.value), str(metric.value), "10"]
+    try:
+        result = subprocess.run(cmd, capture_output=True, timeout=1)  # Short timeout
+        return result.returncode == 0
+    except:
+        return False
+
+def perf_stat_executable(binary_path, instruction, metric, iterations):
+    command = ["perf", "stat", "-x,", "-e", "cycles",
+               binary_path, str(instruction.value), str(metric.value), str(iterations)]
+    return subprocess.run(command, capture_output=True, text=True)
+
+def parse_cycles(output):
+    for line in output.splitlines():
+        if "cycles" in line:
+            # With -x, format, the first field is the counter value
+            fields = line.split(',')
+            if len(fields) > 0:
+                return int(fields[0])
+    raise ValueError("cycles not found in perf output!")
+
+
+def collect_cycles(binary_path, instruction, metric, iterations, runs):
+    cycles_list = []
+
+    for _ in range(runs):
+        result = perf_stat_executable(binary_path, instruction, metric, iterations)
+        cycles = parse_cycles(result.stderr)
+        if result.stdout:
+            print(result.stdout)
+        cycles_list.append(cycles)
+
+    return cycles_list
+
+def main():
+    # Create a list to store results
+    results = []
+
+    for binary_type, tests in config.items():
+        binary_path = f"./{binary_type.value}"
+        for instruction, metric in tests:
+            # First check if the program runs without error for this configuration
+            if not check_program_runs(binary_path, instruction, metric):
+                results.append({
+                    "Instruction": instruction.name,
+                    "Mode": binary_type.name,
+                    "Metric": metric.name,
+                    "Value": "error"
+                })
+                continue
+
+            # Collect data for this test
+            warmup_cycles = collect_cycles(binary_path, instruction, metric, 0, WARMUP_RUNS)
+
+            test_cycles = collect_cycles(binary_path, instruction, metric, TEST_ITERATIONS, TEST_RUNS)
+
+            avg_warmup_cycles = statistics.mean(warmup_cycles)
+            avg_test_cycles = statistics.mean(test_cycles)
+
+            cycles_per_instruction = (avg_test_cycles - avg_warmup_cycles) / (TEST_ITERATIONS * 16)
+
+            if metric == Metric.THROUGHPUT:
+                # For throughput tests, we report instructions per cycle
+                value = round(1 / cycles_per_instruction, 3)
+            else:  # LATENCY
+                # For latency tests, we report cycles per instruction
+                value = round(cycles_per_instruction, 3)
+
+            results.append({
+                "Instruction": instruction.name,
+                "Mode": binary_type.name,
+                "Metric": metric.name,
+                "Value": value
+            })
+
+    # Convert results to DataFrame
+    df = pd.DataFrame(results)
+
+    # Pivot to get the final format
+    pivot_df = df.pivot_table(
+        index=["Instruction", "Mode"],
+        columns="Metric",
+        values="Value",
+        aggfunc='first'  # Take the first value in case of duplicates
+    ).reset_index()
+
+    # Reorder
+    pivot_df = pivot_df[["Instruction", "Mode", "THROUGHPUT", "LATENCY"]]
+
+    # Rename columns to match requirements
+    pivot_df = pivot_df.rename(columns={"THROUGHPUT": "Throughput", "LATENCY": "Latency"})
+
+    pivot_df = pivot_df.fillna("-")
+
+    instructions_purecap_file = open("./instructions_purecap.tex", "w")
+    instructions_nocap_file = open("./instructions_nocap.tex", "w")
+
+    pivot_df[pivot_df['Mode'] == 'PURECAP'].drop(columns=['Mode']).to_latex(
+        instructions_purecap_file,
+        index=False,
+        formatters={"Instruction": lambda x: f"\\verb|{x}|"},
+        float_format="{:.3f}".format
+    )
+
+    pivot_df[pivot_df['Mode'] == 'NOCAP'].drop(columns=['Mode']).to_latex(
+        instructions_nocap_file,
+        index=False,
+        formatters={"Instruction": lambda x: f"\\verb|{x}|"},
+        float_format="{:.3f}".format
+    )
+
+if __name__ == "__main__":
+    main()
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_nocap.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_nocap.c
new file mode 100644
index 000000000..8f4a0ce3a
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_nocap.c
@@ -0,0 +1,90 @@
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+// External declarations for instruction measurement functions
+extern void ldr_throughput_loop(long iterations, long* tmp);
+extern void str_throughput_loop(long iterations, long* tmp);
+extern void ldar_throughput_loop(long iterations, long* tmp);
+extern void stlr_throughput_loop(long iterations, long* tmp);
+extern void ldp_throughput_loop(long iterations, long* tmp);
+extern void stp_throughput_loop(long iterations, long* tmp);
+extern void str_inplace_throughput_loop(long iterations, long* tmp);
+extern void stp_inplace_throughput_loop(long iterations, long* tmp);
+
+extern void ldr_latency_loop(long iterations, long* tmp);
+extern void ldp_latency_loop(long iterations, long* tmp);
+
+// Instruction types to measure, with gaps (_N) to match Python enum values
+enum Instruction {
+    LDR,
+    _1,
+    STR,
+    _3,
+    LDAR,
+    STLR,
+    LDP,
+    _7,
+    STP,
+    _9,
+    _10,
+    _11,
+    _12,
+    _13,
+    _14,
+    _15,
+    _16,
+    _17,
+    STR_INPLACE,
+    _19,
+    STP_INPLACE
+};
+enum Metric { LATENCY, THROUGHPUT };
+
+// Arg 1: Instruction: Which instruction should be executed?
+// Arg 2: Metric: Is the Latency or Throughput being measured?
+// Arg 2: Iterations / 16: How many times (* 16) should the instruction should
+// be executed?
+int main(int argc, char* argv[]) {
+    if (argc != 4) {
+        goto cli_failure;
+    }
+    enum Instruction instruction = atoi(argv[1]);
+    enum Metric metric = atoi(argv[2]);
+    long iterations = atoi(argv[3]);
+    // Temporary array used by measurement functions
+    long tmp[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+    // Execute appropriate measurement function based on instruction type and
+    // metric
+    if (instruction == LDR && metric == LATENCY) {
+        ldr_latency_loop(iterations, (long*)tmp);
+    } else if (instruction == LDR && metric == THROUGHPUT) {
+        ldr_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == STR && metric == THROUGHPUT) {
+        str_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == LDAR && metric == THROUGHPUT) {
+        ldar_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == STLR && metric == THROUGHPUT) {
+        stlr_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == LDP && metric == LATENCY) {
+        long ldp_tmp[] = {0, 0};
+        ldp_tmp[0] = (long)&ldp_tmp[0];
+        ldp_latency_loop(iterations, (long*)ldp_tmp);
+    } else if (instruction == LDP && metric == THROUGHPUT) {
+        ldp_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == STP && metric == THROUGHPUT) {
+        stp_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == STR_INPLACE && metric == THROUGHPUT) {
+        str_inplace_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == STP_INPLACE && metric == THROUGHPUT) {
+        stp_inplace_throughput_loop(iterations, (long*)tmp);
+    } else {
+        goto cli_failure;
+    }
+    return 0;
+
+cli_failure:
+    fprintf(stderr, "Invalid/Unimplemented command line arguments\n");
+    exit(EXIT_FAILURE);
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_nocap.s b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_nocap.s
new file mode 100644
index 000000000..399cf40ca
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_nocap.s
@@ -0,0 +1,257 @@
+.global ldr_throughput_loop
+.global ldr_latency_loop
+.global str_throughput_loop
+.global str_inplace_throughput_loop
+.global ldar_throughput_loop
+.global stlr_throughput_loop
+.global ldp_throughput_loop
+.global ldp_latency_loop
+.global stp_throughput_loop
+.global stp_inplace_throughput_loop
+
+stp_inplace_throughput_loop:
+    cbz x0, stpit_end
+        sub x0, x0, #1
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+        stp x1, x2, [x1]
+    b stp_inplace_throughput_loop
+
+    stpit_end:
+        ret
+
+stp_throughput_loop:
+    cbz x0, stpt_end
+        sub x0, x0, #1
+        stp x1, x2, [x1, #0]
+        stp x1, x2, [x1, #16]
+        stp x1, x2, [x1, #32]
+        stp x1, x2, [x1, #48]
+        stp x1, x2, [x1, #64]
+        stp x1, x2, [x1, #80]
+        stp x1, x2, [x1, #96]
+        stp x1, x2, [x1, #112]
+        stp x1, x2, [x1, #0]
+        stp x1, x2, [x1, #16]
+        stp x1, x2, [x1, #32]
+        stp x1, x2, [x1, #48]
+        stp x1, x2, [x1, #64]
+        stp x1, x2, [x1, #80]
+        stp x1, x2, [x1, #96]
+        stp x1, x2, [x1, #112]
+    b stp_throughput_loop
+
+    stpt_end:
+        ret
+
+ldp_latency_loop:
+    cbz x0, ldpl_end
+        sub x0, x0, #1
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+        ldp x1, x2, [x1]
+    b ldp_latency_loop
+
+    ldpl_end:
+        ret
+
+ldp_throughput_loop:
+    cbz x0, ldpt_end
+        sub x0, x0, #1
+        ldp x10, x11, [x1]
+        ldp x12, x13, [x1]
+        ldp x14, x15, [x1]
+        ldp x9, x10, [x1]
+        ldp x11, x12, [x1]
+        ldp x13, x14, [x1]
+        ldp x15, x9, [x1]
+        ldp x10, x11, [x1]
+        ldp x12, x13, [x1]
+        ldp x14, x15, [x1]
+        ldp x9, x10, [x1]
+        ldp x11, x12, [x1]
+        ldp x13, x14, [x1]
+        ldp x15, x9, [x1]
+        ldp x10, x11, [x1]
+        ldp x12, x13, [x1]
+    b ldp_throughput_loop
+
+    ldpt_end:
+        ret
+
+ldr_throughput_loop:
+    cbz x0, ldrt_end
+        sub x0, x0, #1
+        ldr x10, [x1]
+        ldr x13, [x1]
+        ldr x14, [x1]
+        ldr x9, [x1]
+        ldr x12, [x1]
+        ldr x11, [x1]
+        ldr x15, [x1]
+        ldr x9, [x1]
+        ldr x12, [x1]
+        ldr x11, [x1]
+        ldr x13, [x1]
+        ldr x10, [x1]
+        ldr x14, [x1]
+        ldr x15, [x1]
+        ldr x9, [x1]
+        ldr x10, [x1]
+    b ldr_throughput_loop
+
+    ldrt_end:
+        ret
+
+ldr_latency_loop:
+    mov x9, #0
+    ldrl_loop:
+    cbz x0, ldrl_end
+        sub x0, x0, #1
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+        ldr x9, [x1, x9]
+    b ldrl_loop
+    ldrl_end:
+        ret
+
+str_inplace_throughput_loop:
+    mov x9, #0
+    strit_loop:
+    cbz x0, strit_end
+        sub x0, x0, #1
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+        str x9, [x1]
+    b strit_loop
+
+    strit_end:
+        ret
+
+str_throughput_loop:
+    mov x9, #0
+    strt_loop:
+    cbz x0, strt_end
+        sub x0, x0, #1
+        str x9, [x1, #0]
+        str x9, [x1, #8]
+        str x9, [x1, #16]
+        str x9, [x1, #24]
+        str x9, [x1, #32]
+        str x9, [x1, #40]
+        str x9, [x1, #48]
+        str x9, [x1, #56]
+        str x9, [x1, #64]
+        str x9, [x1, #72]
+        str x9, [x1, #80]
+        str x9, [x1, #88]
+        str x9, [x1, #96]
+        str x9, [x1, #104]
+        str x9, [x1, #112]
+        str x9, [x1, #120]
+    b strt_loop
+
+    strt_end:
+        ret
+
+ldar_throughput_loop:
+    cbz x0, ldart_end
+        sub x0, x0, #1
+        ldar x10, [x1]
+        ldar x13, [x1]
+        ldar x14, [x1]
+        ldar x9, [x1]
+        ldar x12, [x1]
+        ldar x11, [x1]
+        ldar x15, [x1]
+        ldar x9, [x1]
+        ldar x12, [x1]
+        ldar x11, [x1]
+        ldar x13, [x1]
+        ldar x10, [x1]
+        ldar x14, [x1]
+        ldar x15, [x1]
+        ldar x9, [x1]
+        ldar x10, [x1]
+    b ldar_throughput_loop
+
+    ldart_end:
+        ret
+
+stlr_throughput_loop:
+    mov x9, #42
+    stlrt_loop:
+    cbz x0, stlrt_end
+        sub x0, x0, #1
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+        stlr x9, [x1]
+    b stlrt_loop
+
+    stlrt_end:
+        ret
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_purecap.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_purecap.c
new file mode 100644
index 000000000..df9a37b9b
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_purecap.c
@@ -0,0 +1,171 @@
+#include <cheriintrin.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+// External declarations for instruction measurement functions
+// Throughput measurement functions
+extern void ldr_throughput_loop(long iterations, long* tmp);
+extern void str_throughput_loop(long iterations, long* tmp);
+extern void ldar_throughput_loop(long iterations, long* tmp);
+extern void stlr_throughput_loop(long iterations, long* tmp);
+extern void ldr_cap_throughput_loop(long iterations, uintptr_t* tmp_cap);
+extern void str_cap_throughput_loop(long iterations, uintptr_t* tmp_cap);
+extern void ldp_throughput_loop(long iterations, uintptr_t* tmp_cap);
+extern void ldp_cap_throughput_loop(long iterations, uintptr_t* tmp_cap);
+extern void stp_throughput_loop(long iterations, uintptr_t* tmp_cap);
+extern void stp_cap_throughput_loop(long iterations, uintptr_t* tmp_cap,
+                                    uintptr_t* tmp1_cap);
+extern void cvtd_tocap_throughput_loop(long iterations, long tmp);
+extern void cfhi_throughput_loop(long iterations, uintptr_t* tmp);
+extern void cthi_throughput_loop(long iterations, uintptr_t* tmp);
+extern void cvtd_toptr_throughput_loop(long iterations, long tmp);
+extern void cvtp_tocap_throughput_loop(long iterations, long tmp);
+extern void cvtp_toptr_throughput_loop(long iterations, long tmp);
+extern void cvt_tocap_throughput_loop(long iterations, long tmp);
+extern void cvt_toptr_throughput_loop(long iterations, long tmp);
+extern void str_inplace_throughput_loop(long iterations, long* tmp);
+extern void str_cap_inplace_throughput_loop(long iterations, uintptr_t* tmp_cap);
+extern void stp_inplace_throughput_loop(long iterations, uintptr_t* tmp_cap);
+extern void stp_cap_inplace_throughput_loop(long iterations, uintptr_t* tmp_cap,
+                                          uintptr_t* tmp1_cap);
+
+// Latency measurement functions
+extern void ldr_latency_loop(long iterations, long* tmp);
+extern void ldr_cap_latency_loop(long iterations, intptr_t* tmp);
+extern void ldp_cap_latency_loop(long iterations, intptr_t* tmp);
+extern void cvtd_tocap_latency_loop(long iterations, long tmp);
+extern void cfhi_latency_loop(long iterations, uintptr_t* tmp);
+extern void cthi_latency_loop(long iterations, uintptr_t* tmp);
+extern void cvtd_toptr_latency_loop(long iterations, long tmp);
+extern void cvtp_tocap_latency_loop(long iterations, long tmp);
+extern void cvtp_toptr_latency_loop(long iterations, long tmp);
+extern void cvt_tocap_latency_loop(long iterations, long tmp);
+extern void cvt_toptr_latency_loop(long iterations, long tmp);
+
+// Instruction types to measure
+enum Instruction {
+    LDR,
+    LDR_CAP,
+    STR,
+    STR_CAP,
+    LDAR,
+    STLR,
+    LDP,
+    LDP_CAP,
+    STP,
+    STP_CAP,
+    CVTD_TOCAP,
+    CFHI,
+    CTHI,
+    CVTD_TOPTR,
+    CVTP_TOCAP,
+    CVTP_TOPTR,
+    CVT_TOCAP,
+    CVT_TOPTR,
+    STR_INPLACE,
+    STR_CAP_INPLACE,
+    STP_INPLACE,
+    STP_CAP_INPLACE
+};
+enum Metric { LATENCY, THROUGHPUT };
+
+// Arg 1: Instruction: Which instruction should be executed?
+// Arg 2: Metric: Is the Latency or Throughput being measured?
+// Arg 2: Iterations / 16: How many times (* 16) should the instruction should
+// be executed?
+int main(int argc, char* argv[]) {
+    if (argc != 4) {
+        goto cli_failure;
+    }
+    enum Instruction instruction = atoi(argv[1]);
+    enum Metric metric = atoi(argv[2]);
+    long iterations = atoi(argv[3]);
+    // Temporary arrays used by measurement functions
+    long tmp[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    uintptr_t tmp_cap[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+    // Execute appropriate measurement function based on instruction type and metric
+    if (instruction == LDR && metric == LATENCY) {
+        ldr_latency_loop(iterations, (long*)tmp);
+    } else if (instruction == LDR && metric == THROUGHPUT) {
+        ldr_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == STR && metric == THROUGHPUT) {
+        str_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == STR_CAP && metric == THROUGHPUT) {
+        str_cap_throughput_loop(iterations, (uintptr_t*)tmp_cap);
+    } else if (instruction == LDAR && metric == THROUGHPUT) {
+        ldar_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == STLR && metric == THROUGHPUT) {
+        stlr_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == LDR_CAP && metric == LATENCY) {
+        intptr_t address;
+        address = (intptr_t)&address;
+        ldr_cap_latency_loop(iterations, &address);
+    } else if (instruction == LDR_CAP && metric == THROUGHPUT) {
+        ldr_cap_throughput_loop(iterations, &tmp_cap[0]);
+    } else if (instruction == LDP && metric == THROUGHPUT) {
+        ldp_throughput_loop(iterations, &tmp_cap[0]);
+    } else if (instruction == LDP_CAP && metric == LATENCY) {
+        intptr_t tmp[] = {0, 0};
+        tmp[0] = (intptr_t)&tmp[0];
+        ldp_cap_latency_loop(iterations, &tmp[0]);
+    } else if (instruction == LDP_CAP && metric == THROUGHPUT) {
+        ldp_cap_throughput_loop(iterations, &tmp_cap[0]);
+    } else if (instruction == STP && metric == THROUGHPUT) {
+        stp_throughput_loop(iterations, (uintptr_t*)tmp_cap);
+    } else if (instruction == STP_CAP && metric == THROUGHPUT) {
+        stp_cap_throughput_loop(iterations, &tmp_cap[0], &tmp_cap[1]);
+    } else if (instruction == CVTD_TOCAP && metric == LATENCY) {
+        cvtd_tocap_latency_loop(iterations, tmp[0]);
+    } else if (instruction == CVTD_TOCAP && metric == THROUGHPUT) {
+        cvtd_tocap_throughput_loop(iterations, tmp[0]);
+    } else if (instruction == CFHI && metric == LATENCY) {
+        cfhi_latency_loop(iterations, &tmp_cap[0]);
+    } else if (instruction == CFHI && metric == THROUGHPUT) {
+        cfhi_throughput_loop(iterations, &tmp_cap[0]);
+    } else if (instruction == CTHI && metric == LATENCY) {
+        cthi_latency_loop(iterations, &tmp_cap[0]);
+    } else if (instruction == CTHI && metric == THROUGHPUT) {
+        cthi_throughput_loop(iterations, &tmp_cap[0]);
+    } else if (instruction == CVTD_TOPTR && metric == LATENCY) {
+        cvtd_toptr_latency_loop(iterations, tmp[0]);
+    } else if (instruction == CVTD_TOPTR && metric == THROUGHPUT) {
+        cvtd_toptr_throughput_loop(iterations, tmp[0]);
+    } else if (instruction == CVTP_TOCAP && metric == LATENCY) {
+        cvtp_tocap_latency_loop(iterations, tmp[0]);
+    } else if (instruction == CVTP_TOCAP && metric == THROUGHPUT) {
+        cvtp_tocap_throughput_loop(iterations, tmp[0]);
+    } else if (instruction == CVTP_TOPTR && metric == LATENCY) {
+        cvtp_tocap_latency_loop(iterations, tmp[0]);
+    } else if (instruction == CVTP_TOPTR && metric == THROUGHPUT) {
+        cvtp_tocap_throughput_loop(iterations, tmp[0]);
+    } else if (instruction == CVTD_TOPTR && metric == THROUGHPUT) {
+        cvtd_toptr_throughput_loop(iterations, tmp[0]);
+    } else if (instruction == CVT_TOCAP && metric == LATENCY) {
+        cvt_tocap_latency_loop(iterations, tmp[0]);
+    } else if (instruction == CVT_TOCAP && metric == THROUGHPUT) {
+        cvt_tocap_throughput_loop(iterations, tmp[0]);
+    } else if (instruction == CVT_TOPTR && metric == LATENCY) {
+        cvt_tocap_latency_loop(iterations, tmp[0]);
+    } else if (instruction == CVT_TOPTR && metric == THROUGHPUT) {
+        cvt_tocap_throughput_loop(iterations, tmp[0]);
+    } else if (instruction == STR_INPLACE && metric == THROUGHPUT) {
+        str_inplace_throughput_loop(iterations, (long*)tmp);
+    } else if (instruction == STR_CAP_INPLACE && metric == THROUGHPUT) {
+        str_cap_inplace_throughput_loop(iterations, (uintptr_t*)tmp_cap);
+    } else if (instruction == STP_INPLACE && metric == THROUGHPUT) {
+        stp_inplace_throughput_loop(iterations, (uintptr_t*)tmp_cap);
+    } else if (instruction == STP_CAP_INPLACE && metric == THROUGHPUT) {
+        stp_cap_inplace_throughput_loop(iterations, &tmp_cap[0], &tmp_cap[1]);
+    }
+    else {
+        goto cli_failure;
+    }
+    return 0;
+
+cli_failure:
+    fprintf(stderr, "Invalid/Unimplemented command line arguments\n");
+    exit(EXIT_FAILURE);
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_purecap.s b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_purecap.s
new file mode 100644
index 000000000..5cd124815
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/instructions/instructions_purecap.s
@@ -0,0 +1,857 @@
+.global ldr_throughput_loop
+.global ldr_latency_loop
+.global str_throughput_loop
+.global str_cap_throughput_loop
+.global ldar_throughput_loop
+.global stlr_throughput_loop
+.global ldr_cap_throughput_loop
+.global ldp_throughput_loop
+.global ldp_cap_throughput_loop
+.global stp_throughput_loop
+.global stp_cap_throughput_loop
+.global ldr_cap_latency_loop
+.global ldp_latency_loop
+.global ldp_cap_latency_loop
+.global cvtd_tocap_throughput_loop
+.global cvtd_tocap_latency_loop
+.global cfhi_throughput_loop
+.global cfhi_latency_loop
+.global cthi_throughput_loop
+.global cthi_latency_loop
+.global cvtd_toptr_throughput_loop
+.global cvtd_toptr_latency_loop
+.global cvtp_tocap_throughput_loop
+.global cvtp_tocap_latency_loop
+.global cvtp_toptr_throughput_loop
+.global cvtp_toptr_latency_loop
+.global cvt_tocap_throughput_loop
+.global cvt_tocap_latency_loop
+.global cvt_toptr_throughput_loop
+.global cvt_toptr_latency_loop
+.global str_inplace_throughput_loop
+.global str_cap_inplace_throughput_loop
+.global stp_inplace_throughput_loop
+.global stp_cap_inplace_throughput_loop
+
+cvt_toptr_latency_loop:
+    cbz x0, cvttpl_end
+    sub x0, x0, #1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+        cvt x1, c1, c1
+    b cvt_toptr_latency_loop
+
+    cvttpl_end:
+        ret
+
+cvt_toptr_throughput_loop:
+    cbz x0, cvttpt_end
+    sub x0, x0, #1
+        cvt x9, c1, c1
+        cvt x10, c1, c1
+        cvt x11, c1, c1
+        cvt x12, c1, c1
+        cvt x13, c1, c1
+        cvt x14, c1, c1
+        cvt x15, c1, c1
+        cvt x9, c1, c1
+        cvt x10, c1, c1
+        cvt x11, c1, c1
+        cvt x12, c1, c1
+        cvt x13, c1, c1
+        cvt x14, c1, c1
+        cvt x15, c1, c1
+        cvt x9, c1, c1
+        cvt x10, c1, c1
+    b cvt_toptr_throughput_loop
+
+    cvttpt_end:
+        ret
+
+
+cvt_tocap_latency_loop:
+    cbz x0, cvttcl_end
+    sub x0, x0, #1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+        cvt c1, c1, x1
+    b cvt_tocap_latency_loop
+
+    cvttcl_end:
+        ret
+
+cvt_tocap_throughput_loop:
+    cbz x0, cvttct_end
+    sub x0, x0, #1
+        cvt c9, c1, x1
+        cvt c10, c1, x1
+        cvt c11, c1, x1
+        cvt c12, c1, x1
+        cvt c13, c1, x1
+        cvt c14, c1, x1
+        cvt c15, c1, x1
+        cvt c9, c1, x1
+        cvt c10, c1, x1
+        cvt c11, c1, x1
+        cvt c12, c1, x1
+        cvt c13, c1, x1
+        cvt c14, c1, x1
+        cvt c15, c1, x1
+        cvt c9, c1, x1
+        cvt c10,c1, x1
+    b cvt_tocap_throughput_loop
+
+    cvttct_end:
+        ret
+
+cvtp_toptr_latency_loop:
+    cbz x0, cvtptpl_end
+    sub x0, x0, #1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+        cvtp x1, c1
+    b cvtp_toptr_latency_loop
+
+    cvtptpl_end:
+        ret
+
+cvtp_toptr_throughput_loop:
+    cbz x0, cvtptpt_end
+    sub x0, x0, #1
+        cvtp x9, c1
+        cvtp x10, c1
+        cvtp x11, c1
+        cvtp x12, c1
+        cvtp x13, c1
+        cvtp x14, c1
+        cvtp x15, c1
+        cvtp x9, c1
+        cvtp x10, c1
+        cvtp x11, c1
+        cvtp x12, c1
+        cvtp x13, c1
+        cvtp x14, c1
+        cvtp x15, c1
+        cvtp x9, c1
+        cvtp x10, c1
+    b cvtp_toptr_throughput_loop
+
+    cvtptpt_end:
+        ret
+
+
+cvtp_tocap_latency_loop:
+    cbz x0, cvtptcl_end
+    sub x0, x0, #1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+        cvtp c1, x1
+    b cvtp_tocap_latency_loop
+
+    cvtptcl_end:
+        ret
+
+cvtp_tocap_throughput_loop:
+    cbz x0, cvtptct_end
+    sub x0, x0, #1
+        cvtp c9, x1
+        cvtp c10, x1
+        cvtp c11, x1
+        cvtp c12, x1
+        cvtp c13, x1
+        cvtp c14, x1
+        cvtp c15, x1
+        cvtp c9, x1
+        cvtp c10, x1
+        cvtp c11, x1
+        cvtp c12, x1
+        cvtp c13, x1
+        cvtp c14, x1
+        cvtp c15, x1
+        cvtp c9, x1
+        cvtp c10, x1
+    b cvtp_tocap_throughput_loop
+
+    cvtptct_end:
+        ret
+
+cvtd_toptr_latency_loop:
+    cbz x0, cvtdtpl_end
+    sub x0, x0, #1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+        cvtd x1, c1
+    b cvtd_toptr_latency_loop
+
+    cvtdtpl_end:
+        ret
+
+cvtd_toptr_throughput_loop:
+    cbz x0, cvtdtpt_end
+    sub x0, x0, #1
+        cvtd x9, c1
+        cvtd x10, c1
+        cvtd x11, c1
+        cvtd x12, c1
+        cvtd x13, c1
+        cvtd x14, c1
+        cvtd x15, c1
+        cvtd x9, c1
+        cvtd x10, c1
+        cvtd x11, c1
+        cvtd x12, c1
+        cvtd x13, c1
+        cvtd x14, c1
+        cvtd x15, c1
+        cvtd x9, c1
+        cvtd x10, c1
+    b cvtd_toptr_throughput_loop
+
+    cvtdtpt_end:
+        ret
+
+
+cthi_latency_loop:
+    cbz x0, cthil_end
+    sub x0, x0, #1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+        cthi c1, c1, x1
+    b cthi_latency_loop
+
+    cthil_end:
+        ret
+
+cthi_throughput_loop:
+    cbz x0, cthit_end
+    sub x0, x0, #1
+        cthi c1, c1, x1
+        cthi c2, c2, x2
+        cthi c3, c3, x3
+        cthi c4, c4, x4
+        cthi c5, c5, x5
+        cthi c6, c6, x6
+        cthi c7, c7, x7
+        cthi c1, c1, x1
+        cthi c2, c2, x2
+        cthi c3, c3, x3
+        cthi c4, c4, x4
+        cthi c5, c5, x5
+        cthi c6, c6, x6
+        cthi c1, c1, x1
+        cthi c2, c2, x2
+        cthi c3, c3, x3
+    b cthi_throughput_loop
+
+    cthit_end:
+        ret
+
+cfhi_latency_loop:
+    cbz x0, cfhil_end
+    sub x0, x0, #1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+        cfhi x1, c1
+    b cfhi_latency_loop
+
+    cfhil_end:
+        ret
+
+cfhi_throughput_loop:
+    cbz x0, cfhit_end
+    sub x0, x0, #1
+        cfhi x2, c2
+        cfhi x3, c3
+        cfhi x4, c4
+        cfhi x5, c5
+        cfhi x6, c6
+        cfhi x7, c7
+        cfhi x1, c1
+        cfhi x2, c2
+        cfhi x3, c3
+        cfhi x4, c4
+        cfhi x5, c5
+        cfhi x6, c6
+        cfhi x1, c1
+        cfhi x2, c2
+        cfhi x3, c3
+        cfhi x3, c3
+    b cfhi_throughput_loop
+
+    cfhit_end:
+        ret
+
+
+cvtd_tocap_latency_loop:
+    cbz x0, cvtdtcl_end
+    sub x0, x0, #1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+        cvtd c1, x1
+    b cvtd_tocap_latency_loop
+
+    cvtdtcl_end:
+        ret
+
+
+
+cvtd_tocap_throughput_loop:
+    cbz x0, cvtdtct_end
+    sub x0, x0, #1
+        cvtd c9, x1
+        cvtd c10, x1
+        cvtd c11, x1
+        cvtd c12, x1
+        cvtd c13, x1
+        cvtd c14, x1
+        cvtd c15, x1
+        cvtd c9, x1
+        cvtd c10, x1
+        cvtd c11, x1
+        cvtd c12, x1
+        cvtd c13, x1
+        cvtd c14, x1
+        cvtd c15, x1
+        cvtd c9, x1
+        cvtd c10, x1
+    b cvtd_tocap_throughput_loop
+
+    cvtdtct_end:
+        ret
+
+
+// extern void ldr_cap_latency_loop(long iterations, int* tmp);
+ldr_cap_latency_loop:
+    ldrcl_loop:
+    cbz x0, ldrcl_end
+        sub x0, x0, #1
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+        ldr c1, [c1]
+    b ldr_cap_latency_loop
+
+    ldrcl_end:
+        ret
+
+// extern void ldp_cap_latency_loop(long iterations, intptr_t* tmp);
+ldp_cap_latency_loop:
+    cbz x0, ldpcl_end
+        sub x0, x0, #1
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+        ldp c1, c2, [c1]
+    b ldp_cap_latency_loop
+
+    ldpcl_end:
+        ret
+
+
+stp_cap_throughput_loop:
+    stpct_loop:
+    cbz x0, stpct_end
+        sub x0, x0, #1
+        stp c1, c2, [c1, #0]
+        stp c1, c2, [c1, #32]
+        stp c1, c2, [c1, #64]
+        stp c1, c2, [c1, #96]
+        stp c1, c2, [c1, #0]
+        stp c1, c2, [c1, #32]
+        stp c1, c2, [c1, #64]
+        stp c1, c2, [c1, #96]
+        stp c1, c2, [c1, #0]
+        stp c1, c2, [c1, #32]
+        stp c1, c2, [c1, #64]
+        stp c1, c2, [c1, #96]
+        stp c1, c2, [c1, #0]
+        stp c1, c2, [c1, #32]
+        stp c1, c2, [c1, #64]
+        stp c1, c2, [c1, #96]
+    b stpct_loop
+
+    stpct_end:
+        ret
+
+stp_throughput_loop:
+    mov x9, #42
+    mov x10, #31
+    stpt_loop:
+    cbz x0, stpt_end
+        sub x0, x0, #1
+        stp x9, x10, [c1, #0]
+        stp x9, x10, [c1, #16]
+        stp x9, x10, [c1, #32]
+        stp x9, x10, [c1, #48]
+        stp x9, x10, [c1, #64]
+        stp x9, x10, [c1, #80]
+        stp x9, x10, [c1, #96]
+        stp x9, x10, [c1, #112]
+        stp x9, x10, [c1, #0]
+        stp x9, x10, [c1, #16]
+        stp x9, x10, [c1, #32]
+        stp x9, x10, [c1, #48]
+        stp x9, x10, [c1, #64]
+        stp x9, x10, [c1, #80]
+        stp x9, x10, [c1, #96]
+        stp x9, x10, [c1, #112]
+    b stpt_loop
+
+    stpt_end:
+        ret
+
+stp_cap_inplace_throughput_loop:
+    stpcit_loop:
+    cbz x0, stpcit_end
+        sub x0, x0, #1
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+        stp c1, c2, [c1]
+    b stpcit_loop
+
+    stpcit_end:
+        ret
+
+stp_inplace_throughput_loop:
+    mov x9, #42
+    mov x10, #31
+    stpit_loop:
+    cbz x0, stpit_end
+        sub x0, x0, #1
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+        stp x9, x10, [c1]
+    b stpit_loop
+
+    stpit_end:
+        ret
+
+// extern void str_cap_throughput_loop(long iterations, int* tmp);
+ldr_cap_throughput_loop:
+    cbz x0, ldrct_end
+        sub x0, x0, #1
+        ldr c10, [c1]
+        ldr c13, [c1]
+        ldr c14, [c1]
+        ldr c9, [c1]
+        ldr c12, [c1]
+        ldr c11, [c1]
+        ldr c15, [c1]
+        ldr c9, [c1]
+        ldr c12, [c1]
+        ldr c11, [c1]
+        ldr c13, [c1]
+        ldr c10, [c1]
+        ldr c14, [c1]
+        ldr c15, [c1]
+        ldr c9, [c1]
+        ldr c10, [c1]
+    b ldr_cap_throughput_loop
+
+    ldrct_end:
+        ret
+
+// extern void ldp_throughput_loop(long iterations, int* tmp);
+ldp_throughput_loop:
+    cbz x0, ldpt_end
+        sub x0, x0, #1
+        ldp x10, x11, [c1]
+        ldp x12, x13, [c1]
+        ldp x14, x15, [c1]
+        ldp x9, x10, [c1]
+        ldp x11, x12, [c1]
+        ldp x13, x14, [c1]
+        ldp x15, x9, [c1]
+        ldp x10, x11, [c1]
+        ldp x12, x13, [c1]
+        ldp x14, x15, [c1]
+        ldp x9, x10, [c1]
+        ldp x11, x12, [c1]
+        ldp x13, x14, [c1]
+        ldp x15, x9, [c1]
+        ldp x10, x11, [c1]
+        ldp x12, x13, [c1]
+    b ldp_throughput_loop
+
+    ldpt_end:
+        ret
+
+// extern void ldp_cap_throughput_loop(long iterations, int* tmp);
+ldp_cap_throughput_loop:
+    cbz x0, ldpcpt_end
+        sub x0, x0, #1
+        ldp c10, c11, [c1]
+        ldp c12, c13, [c1]
+        ldp c14, c15, [c1]
+        ldp c9, c10, [c1]
+        ldp c11, c12, [c1]
+        ldp c13, c14, [c1]
+        ldp c15, c9, [c1]
+        ldp c10, c11, [c1]
+        ldp c12, c13, [c1]
+        ldp c14, c15, [c1]
+        ldp c9, c10, [c1]
+        ldp c11, c12, [c1]
+        ldp c13, c14, [c1]
+        ldp c15, c9, [c1]
+        ldp c10, c11, [c1]
+        ldp c12, c13, [c1]
+    b ldp_cap_throughput_loop
+
+    ldpcpt_end:
+        ret
+
+ldr_throughput_loop:
+    cbz x0, ldrt_end
+        sub x0, x0, #1
+        ldr x10, [c1]
+        ldr x13, [c1]
+        ldr x14, [c1]
+        ldr x9, [c1]
+        ldr x12, [c1]
+        ldr x11, [c1]
+        ldr x15, [c1]
+        ldr x9, [c1]
+        ldr x12, [c1]
+        ldr x11, [c1]
+        ldr x13, [c1]
+        ldr x10, [c1]
+        ldr x14, [c1]
+        ldr x15, [c1]
+        ldr x9, [c1]
+        ldr x10, [c1]
+    b ldr_throughput_loop
+
+    ldrt_end:
+        ret
+
+ldr_latency_loop:
+    mov x9, #0
+    ldrl_loop:
+    cbz x0, ldrl_end
+        sub x0, x0, #1
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+        ldr x9, [c1, x9]
+    b ldrl_loop
+    ldrl_end:
+        ret
+
+str_throughput_loop:
+    mov x9, #42
+    strt_loop:
+    cbz x0, strt_end
+        sub x0, x0, #1
+        str x9, [c1, #0]
+        str x9, [c1, #8]
+        str x9, [c1, #16]
+        str x9, [c1, #24]
+        str x9, [c1, #32]
+        str x9, [c1, #40]
+        str x9, [c1, #48]
+        str x9, [c1, #56]
+        str x9, [c1, #64]
+        str x9, [c1, #72]
+        str x9, [c1, #80]
+        str x9, [c1, #88]
+        str x9, [c1, #96]
+        str x9, [c1, #104]
+        str x9, [c1, #112]
+        str x9, [c1, #120]
+            b strt_loop
+
+    strt_end:
+        ret
+
+str_inplace_throughput_loop:
+    mov x9, #42
+    strit_loop:
+    cbz x0, strit_end
+        sub x0, x0, #1
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+        str x9, [c1]
+            b strit_loop
+
+    strit_end:
+        ret
+
+str_cap_throughput_loop:
+    cbz x0, strct_end
+        sub x0, x0, #1
+        str c1, [c1, #0]
+        str c1, [c1, #16]
+        str c1, [c1, #32]
+        str c1, [c1, #48]
+        str c1, [c1, #64]
+        str c1, [c1, #80]
+        str c1, [c1, #96]
+        str c1, [c1, #112]
+        str c1, [c1, #0]
+        str c1, [c1, #16]
+        str c1, [c1, #32]
+        str c1, [c1, #48]
+        str c1, [c1, #64]
+        str c1, [c1, #80]
+        str c1, [c1, #96]
+        str c1, [c1, #112]
+            b str_cap_throughput_loop
+
+    strct_end:
+        ret
+
+str_cap_inplace_throughput_loop:
+    cbz x0, strcit_end
+        sub x0, x0, #1
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+        str c1, [c1]
+            b str_cap_inplace_throughput_loop
+
+    strcit_end:
+        ret
+
+
+ldar_throughput_loop:
+    cbz x0, ldart_end
+        sub x0, x0, #1
+        ldar x10, [c1]
+        ldar x13, [c1]
+        ldar x14, [c1]
+        ldar x9, [c1]
+        ldar x12, [c1]
+        ldar x11, [c1]
+        ldar x15, [c1]
+        ldar x9, [c1]
+        ldar x12, [c1]
+        ldar x11, [c1]
+        ldar x13, [c1]
+        ldar x10, [c1]
+        ldar x14, [c1]
+        ldar x15, [c1]
+        ldar x9, [c1]
+        ldar x10, [c1]
+    b ldar_throughput_loop
+
+    ldart_end:
+        ret
+
+// extern void stlr_throughput_loop(long iterations, int* tmp);
+stlr_throughput_loop:
+    mov x9, #42
+    stlrt_loop:
+    cbz x0, stlrt_end
+        sub x0, x0, #1
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+        stlr x9, [c1]
+            b stlrt_loop
+
+    stlrt_end:
+        ret
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/justfile b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/justfile
new file mode 100644
index 000000000..e22782e5b
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/justfile
@@ -0,0 +1,64 @@
+# Common flags for both variants
+common_flags := "-O2 -Wall -Wpedantic -Wextra"
+
+# Specific flags for each variant
+purecap_flags := "--target=aarch64-unknown-linux-musl_purecap -mabi=purecap -march=morello -fuse-ld=lld -nostdinc --sysroot $MUSL_PATH/ -isystem $MUSL_PATH/include -L$MUSL_PATH/lib -static -I\"$LLVM_PATH/lib/clang/14.0.0/include\""
+nocap_flags := ""
+hybrid_flags := "-march=morello -Wcheri"
+
+run_all:
+    just run_instructions
+    just run_memory_latency
+    just run_applications
+
+clean_all:
+    just clean_instructions
+    just clean_memory_latency
+    just clean_applications
+
+plot_applications:
+    just applications/polybench/plot
+
+run_applications:
+    just applications/polybench/run
+
+build_applications:
+    just applications/polybench/build
+
+clean_applications:
+    just applications/polybench/clean
+
+[working-directory : './instructions/output']
+run_instructions: build_instructions
+    python3 ../instructions.py
+
+[working-directory : './instructions']
+build_instructions: clean_instructions
+    $CLANG_PURECAP_PATH {{common_flags}} {{purecap_flags}} ./instructions_purecap.c ./instructions_purecap.s -o ./output/instructions_purecap.out
+    env -i $CLANG_HYBRID_PATH {{common_flags}} {{nocap_flags}} ./instructions_nocap.c ./instructions_nocap.s -o ./output/instructions_nocap.out
+
+[working-directory : './instructions']
+clean_instructions:
+    rm -rf ./output
+    mkdir ./output
+
+[working-directory : './memory_latency/output']
+plot_memory_latency:
+    python3 ../memory_latency_plot.py
+
+[working-directory : './memory_latency/output']
+run_memory_latency: build_memory_latency
+    ./memory_latency_nocap.out > memory_latency_nocap.csv
+    ./memory_latency_hybrid.out > memory_latency_hybrid.csv
+    ./memory_latency_purecap.out > memory_latency_purecap.csv
+
+[working-directory : './memory_latency']
+build_memory_latency: clean_memory_latency
+    env -i $CLANG_HYBRID_PATH {{common_flags}} {{nocap_flags}} ./memory_latency.c -o ./output/memory_latency_nocap.out
+    env -i $CLANG_HYBRID_PATH {{common_flags}} {{hybrid_flags}} ./memory_latency_hybrid.c -o ./output/memory_latency_hybrid.out
+    $CLANG_PURECAP_PATH {{common_flags}} {{purecap_flags}} ./memory_latency.c -o ./output/memory_latency_purecap.out
+
+[working-directory : './memory_latency']
+clean_memory_latency:
+    rm -rf ./output
+    mkdir ./output
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency.c
new file mode 100644
index 000000000..d31cb2308
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency.c
@@ -0,0 +1,76 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "time.h"
+
+// Taken from the Chips And Cheese MemoryLatency Benchmark:
+// https://github.com/ChipsandCheese/Microbenchmarks/blob/master/MemoryLatency/MemoryLatency.c
+int default_test_sizes[37] = {
+    2,     4,     8,      12,     16,     24,     32,     48,    64,    96,
+    128,   192,   256,    384,    512,    600,    768,    1024,  1536,  2048,
+    3072,  4096,  5120,   6144,   8192,   10240,  12288,  16384, 24567, 32768,
+    65536, 98304, 131072, 262144, 393216, 524288, 1048576};
+
+int main(void) {
+    long cache_line_size = 64;
+    // printf("Page size: %ld B\nCache line size: %ld B\n", page_size,
+    // cache_line_size);
+    printf("size (kB),time (ns),\n");
+
+    size_t pointer_size = sizeof(void*);
+    for (int i = 0; i < 37; ++i) {
+        uint64_t array_size = default_test_sizes[i] * 1024;
+
+        void** pointer_array = malloc(array_size);
+        if (!pointer_array) {
+            fprintf(stderr,
+                    "Allocation of pointer_array size: %ld kB failed.\n",
+                    array_size / 1024);
+            exit(EXIT_FAILURE);
+        }
+
+        // Fill array with pointers pointing to own location
+        uint32_t pointer_count = array_size / cache_line_size;
+        uint32_t pointer_offset = cache_line_size / pointer_size;
+        for (uint32_t i = 0; i < pointer_count; ++i) {
+            size_t current_index = i * pointer_offset;
+            pointer_array[current_index] = &pointer_array[current_index];
+        }
+
+        // Shuffling pointers to create circular list
+        for (uint32_t i = pointer_count - 1; i > 0; --i) {
+            uint32_t j = rand() % i;
+            void* tmp = pointer_array[j * pointer_offset];
+            pointer_array[j * pointer_offset] =
+                pointer_array[i * pointer_offset];
+            pointer_array[i * pointer_offset] = tmp;
+        }
+
+        struct timespec start, end;
+        clock_gettime(CLOCK_MONOTONIC, &start);
+
+        // TODO: Implement heuristic for accurate benchmarks
+        uint32_t iterations = 1000000;
+        void* current = pointer_array;
+        for (uint32_t i = 0; i < iterations; ++i) {
+            asm volatile("ldr %0, [%0]" : "+r"(current)::"memory");
+        }
+
+        clock_gettime(CLOCK_MONOTONIC, &end);
+
+        double total_time = (end.tv_sec - start.tv_sec) * 1000000000ULL +
+                            (end.tv_nsec - start.tv_nsec);
+        double single_time = total_time / iterations;
+
+        // printf("Array size: %ld B, time: %f nanoseconds\n", array_size,
+        // single_time);
+
+        printf("%ld,%f,\n", array_size / 1024, single_time);
+
+        free(pointer_array);
+    }
+
+    return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency_hybrid.c b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency_hybrid.c
new file mode 100644
index 000000000..7a6f389c7
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency_hybrid.c
@@ -0,0 +1,80 @@
+#include <cheriintrin.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "time.h"
+
+// Taken from the Chips And Cheese MemoryLatency Benchmark:
+// https://github.com/ChipsandCheese/Microbenchmarks/blob/master/MemoryLatency/MemoryLatency.c
+int default_test_sizes[37] = {
+    2,     4,     8,      12,     16,     24,     32,     48,    64,    96,
+    128,   192,   256,    384,    512,    600,    768,    1024,  1536,  2048,
+    3072,  4096,  5120,   6144,   8192,   10240,  12288,  16384, 24567, 32768,
+    65536, 98304, 131072, 262144, 393216, 524288, 1048576};
+
+int main(void) {
+    long cache_line_size = 64;
+    // printf("Page size: %ld B\nCache line size: %ld B\n", page_size,
+    // cache_line_size);
+    printf("size (kB),time (ns),\n");
+
+    size_t pointer_size = sizeof(void *__capability);
+    for (int i = 0; i < 37; ++i) {
+        uint64_t array_size = default_test_sizes[i] * 1024;
+
+        void *__capability ddc = cheri_ddc_get();
+        uintptr_t virtual_pointer_array = (uintptr_t)malloc(array_size);
+        if (!virtual_pointer_array) {
+            fprintf(stderr,
+                    "Allocation of pointer_array size: %ld kB failed.\n",
+                    array_size / 1024);
+            exit(EXIT_FAILURE);
+        }
+        void *__capability *__capability pointer_array =
+            cheri_address_set(ddc, virtual_pointer_array);
+
+        // Fill array with pointers pointing to own location
+        uint32_t pointer_count = array_size / cache_line_size;
+        uint32_t pointer_offset = cache_line_size / pointer_size;
+        for (uint32_t i = 0; i < pointer_count; ++i) {
+            size_t current_index = i * pointer_offset;
+            pointer_array[current_index] = &pointer_array[current_index];
+        }
+
+        // Shuffling pointers to create circular list
+        for (uint32_t i = pointer_count - 1; i > 0; --i) {
+            uint32_t j = rand() % i;
+            void *__capability tmp = pointer_array[j * pointer_offset];
+            pointer_array[j * pointer_offset] =
+                pointer_array[i * pointer_offset];
+            pointer_array[i * pointer_offset] = tmp;
+        }
+
+        struct timespec start, end;
+        clock_gettime(CLOCK_MONOTONIC, &start);
+
+        // TODO: Implement heuristic for accurate benchmarks
+        uint32_t iterations = 1000000;
+        void *__capability current = pointer_array;
+        for (uint32_t i = 0; i < iterations; ++i) {
+            asm volatile("ldr %0, [%0]" : "+r"(current)::"memory");
+        }
+
+        clock_gettime(CLOCK_MONOTONIC, &end);
+
+        double total_time = (end.tv_sec - start.tv_sec) * 1000000000ULL +
+                            (end.tv_nsec - start.tv_nsec);
+        double single_time = total_time / iterations;
+
+        // printf("Array size: %ld B, time: %f nanoseconds\n", array_size,
+        // single_time);
+
+        printf("%ld,%f,\n", array_size / 1024, single_time);
+
+        free((void *)virtual_pointer_array);
+    }
+
+    return 0;
+}
diff --git a/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency_plot.py b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency_plot.py
new file mode 100644
index 000000000..bbe1411dd
--- /dev/null
+++ b/archive/2024/winter/bsc_jiang_microarchitectural_analysis_of_cheri_on_the_morello_platform/memory_latency/memory_latency_plot.py
@@ -0,0 +1,35 @@
+import matplotlib.pyplot as plt
+import pandas as pd
+
+NOCAP_CSV = '/memory_latency_nocap.csv'
+HYRBID_CSV = '/memory_latency_hybrid.csv'
+PURECAP_CSV = '/memory_latency_purecap.csv'
+PLOT_SVG = '/memory_latency_plot.svg'
+
+def main():
+    nocap_data = pd.read_csv(NOCAP_CSV)
+    hybrid_data = pd.read_csv(HYRBID_CSV)
+    purecap_data = pd.read_csv(PURECAP_CSV)
+
+    x_label, y_label = nocap_data.columns[0], nocap_data.columns[1]
+
+    fig, ax = plt.subplots()
+
+    ax.plot(nocap_data[x_label], nocap_data[y_label], label='nocap', linestyle='-')
+    ax.plot(hybrid_data[x_label], hybrid_data[y_label], label='hybrid', linestyle='--')
+    ax.plot(purecap_data[x_label], purecap_data[y_label], label='purecap', linestyle='-.')
+
+    ax.set_xlabel(x_label)
+    ax.set_ylabel(y_label)
+
+    ax.set_xscale('log')
+
+    ax.legend()
+
+    ax.grid(True)
+
+    plt.savefig(PLOT_SVG, format='svg')
+    plt.close()
+
+if __name__ == '__main__':
+    main()