[B ISA extension] add single-bit instructions (Zbs) support #259
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR adds another sub-extension to the recently ratified RISC-V bit-manipulation ISA extension "
B
":Zbs
- single-bit instructionsThe NEORV32 CPU now supports three of the four
B
subsets (if the bit-manipulation is enabled by setting theCPU_EXTENSION_RISCV_B
top generic true):Zbb
- basic bit-manipulation instructionsZba
- address-computation instructionsZbs
- single-bit instructionsZbc
- carry-less multiplication instructions - not supported yet (but coming soon)Since there is no upstream gcc support yet,
Zbs
intrinsics and emulation functions have been added tosw/example/bitmanip_test/neorv32_b_extension_intrinsics.h
to verify correct operations. Furthermore, according test cases have been added tosw/example/bitmanip_test/main.c
. The new testcases also check that instructions from theZbc
subset do raise an illegal instruction exception (as they are not supported yet).🐛 This PR also fixes a minor bug in the CPU's co-processor arbitration logic: multi-cycle ALU operations (= CPU co-processor operations) that are triggered by an illegal instruction are allowed to complete execution even though there will be no data committed (for example no register file write-back). This is required to ensure that no co-processor operation is still in progress when the CPU enters trap state.