Adding Fp128 implementation based on fiat-crypto. #758
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 is an implementation of Fp128 using fiat-crypto. The code generated needs a wrapper to implement the traits required by FieldElement.
The downside of this implementation is the performance observed. The latency for field multiplication is almost twice as the current human-produced code (#165 ).
Closes #757
Timings
Analisis
The critical part are the primitives: addcarryx, subborrowx, and mulx which are implemented using native-rust code.
Usually these primitives should be replaced by the compiler emitting a single assembler instruction (ADC,SBB,MUL, respectively).
Potential Solution:
It is possible to implement the primitives using intrinsics such as: carrying_add, borrowing_sub, and
widening_mul. However, they are only available in the nightly version.
I tested this approach in nightly, however there is still a performance regression.