This patch adds a pass that provides workarounds for the errata described in the technical notes GRLIB-TN-0009, GRLIB-TN-0011, GRLIB-TN-0012, and GRLIB-TN-0013, that are applicable to the GR712RC. 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 instructions. 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-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.