Fix ternary tests and optimize TERNARY macro #97
Merged
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.
Old
TERNARY
macro:When the condition is true, the operations are:
iszero push jumpi swap jumpdest pop
= 23 gasWhen it's false:
iszero push jumpi jumpdest pop
= 20 gasIf we use branchless logic we can get this down to 17 for both cases:
swap1 dup3 xor mul xor
= 17 gasI don't think it's possible to do the same optimization for the inverse macro
NOT_TERNARY
because you would either need to swap x and y in the formula, adding an additional swap operation, or use iszero. Since that macro is already 3 gas less than theTERNARY
macro, adding another operation to the branchless version makes it equivalent for one case and more expensive for the other.For reference, there are two formulae you can use:
And for the inverse