diff options
author | Daniel Cederman <cederman@gaisler.com> | 2024-08-19 07:59:58 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-19 07:59:58 +0200 |
commit | 7faf1a0868cb6a6a05e454044239292c454e0a71 (patch) | |
tree | 1bfce16350f7e752440e8cdf428d2eecc2d481f5 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 82fdfd4aa7f60b1f8e715211b925a7f2bfe57ea9 (diff) | |
download | llvm-7faf1a0868cb6a6a05e454044239292c454e0a71.zip llvm-7faf1a0868cb6a6a05e454044239292c454e0a71.tar.gz llvm-7faf1a0868cb6a6a05e454044239292c454e0a71.tar.bz2 |
[Sparc] Add errata workaround pass for GR712RC and UT700 (#103843)
This patch adds a pass that provides workarounds for the errata
described in GRLIB-TN-0009, GRLIB-TN-0010, GRLIB-TN-0011, GRLIB-TN-0012,
and GRLIB-TN-0013, that are applicable to the GR712RC and UT700. The
documents are available for download from here:
https://www.gaisler.com/index.php/information/app-tech-notes
The pass will detect certain sensitive instruction sequences and prevent
them from occurring by inserting NOP instruction. Below is an overview
of each of the workarounds. A similar implementation is available in
GCC.
GRLIB-TN-0009:
* Insert NOPs to prevent the sequence (stb/sth/st/stf) -> (single
non-store/load instruction) -> (any store)
* Insert NOPs to prevent the sequence (std/stdf) -> (any store)
GRLIB-TN-0010:
* Insert a NOP between load instruction and atomic instruction (swap and
casa).
* Insert a NOP at branch target if load in delay slot and atomic
instruction at branch target.
* Do not allow functions to begin with atomic instruction.
GRLIB-TN-0011:
* Insert .p2align 4 before atomic instructions (swap and casa).
GRLIB-TN-0012:
* Place a NOP at the branch target of an integer branch if it is a
floating-point operation or a floating-point branch.
GRLIB-TN-0013:
* Prevent (div/sqrt) instructions in the delay slot.
* Insert NOPs to prevent the sequence (div/sqrt) -> (two or three
floating point operations or loads) -> (div/sqrt).
* Do not insert NOPs if any of the floating point operations have a
dependency on the destination register of the first (div/sqrt).
* Do not insert NOPs if one of the floating point operations is a
(div/sqrt).
* Insert NOPs to prevent (div/sqrt) followed by a branch.
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
0 files changed, 0 insertions, 0 deletions