Skip to content

Commit dfc6180

Browse files
Vectorized0xBeans
andcommitted
✨ Add raw operations (#324)
Co-authored-by: 0xBeans <[email protected]>
1 parent 52e0eed commit dfc6180

File tree

5 files changed

+309
-108
lines changed

5 files changed

+309
-108
lines changed

.gas-snapshot

Lines changed: 84 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -113,101 +113,113 @@ EIP712Test:testHashTypedDataOnClone() (gas: 40851)
113113
EIP712Test:testHashTypedDataOnCloneWithChaindIdChange() (gas: 50460)
114114
EIP712Test:testHashTypedDataWithChaindIdChange() (gas: 47387)
115115
EIP712Test:test__codesize() (gas: 9350)
116-
FixedPointMathLibTest:testAbs() (gas: 577)
117-
FixedPointMathLibTest:testAbs(int256) (runs: 256, μ: 515, ~: 484)
118-
FixedPointMathLibTest:testAbsEdgeCases() (gas: 433)
119-
FixedPointMathLibTest:testAvg() (gas: 409)
116+
FixedPointMathLibTest:testAbs() (gas: 600)
117+
FixedPointMathLibTest:testAbs(int256) (runs: 256, μ: 471, ~: 440)
118+
FixedPointMathLibTest:testAbsEdgeCases() (gas: 410)
119+
FixedPointMathLibTest:testAvg() (gas: 431)
120120
FixedPointMathLibTest:testAvgEdgeCase() (gas: 470)
121-
FixedPointMathLibTest:testClamp(uint256,uint256,uint256) (runs: 256, μ: 585, ~: 585)
122-
FixedPointMathLibTest:testDist() (gas: 613)
123-
FixedPointMathLibTest:testDist(int256,int256) (runs: 256, μ: 497, ~: 497)
124-
FixedPointMathLibTest:testDistEdgeCases() (gas: 527)
125-
FixedPointMathLibTest:testDivWad() (gas: 725)
126-
FixedPointMathLibTest:testDivWad(uint256,uint256) (runs: 256, μ: 680, ~: 768)
127-
FixedPointMathLibTest:testDivWadEdgeCases() (gas: 414)
128-
FixedPointMathLibTest:testDivWadOverflowReverts(uint256,uint256) (runs: 256, μ: 3683, ~: 3683)
129-
FixedPointMathLibTest:testDivWadUp() (gas: 3063)
121+
FixedPointMathLibTest:testAvgSigned() (gas: 875)
122+
FixedPointMathLibTest:testClamp(uint256,uint256,uint256) (runs: 256, μ: 586, ~: 586)
123+
FixedPointMathLibTest:testClampSigned(int256,int256,int256) (runs: 256, μ: 618, ~: 618)
124+
FixedPointMathLibTest:testDist() (gas: 657)
125+
FixedPointMathLibTest:testDist(int256,int256) (runs: 256, μ: 519, ~: 519)
126+
FixedPointMathLibTest:testDistEdgeCases() (gas: 549)
127+
FixedPointMathLibTest:testDivWad() (gas: 723)
128+
FixedPointMathLibTest:testDivWad(uint256,uint256) (runs: 256, μ: 658, ~: 746)
129+
FixedPointMathLibTest:testDivWadEdgeCases() (gas: 436)
130+
FixedPointMathLibTest:testDivWadOverflowReverts(uint256,uint256) (runs: 256, μ: 3728, ~: 3728)
131+
FixedPointMathLibTest:testDivWadUp() (gas: 3062)
130132
FixedPointMathLibTest:testDivWadUp(uint256,uint256) (runs: 256, μ: 793, ~: 942)
131133
FixedPointMathLibTest:testDivWadUpEdgeCases() (gas: 438)
132-
FixedPointMathLibTest:testDivWadUpOverflowReverts(uint256,uint256) (runs: 256, μ: 3708, ~: 3708)
133-
FixedPointMathLibTest:testDivWadUpZeroDenominatorReverts() (gas: 3163)
134+
FixedPointMathLibTest:testDivWadUpOverflowReverts(uint256,uint256) (runs: 256, μ: 3686, ~: 3686)
135+
FixedPointMathLibTest:testDivWadUpZeroDenominatorReverts() (gas: 3207)
134136
FixedPointMathLibTest:testDivWadUpZeroDenominatorReverts(uint256) (runs: 256, μ: 3239, ~: 3239)
135-
FixedPointMathLibTest:testDivWadZeroDenominatorReverts() (gas: 3163)
136-
FixedPointMathLibTest:testDivWadZeroDenominatorReverts(uint256) (runs: 256, μ: 3260, ~: 3260)
137+
FixedPointMathLibTest:testDivWadZeroDenominatorReverts() (gas: 3161)
138+
FixedPointMathLibTest:testDivWadZeroDenominatorReverts(uint256) (runs: 256, μ: 3239, ~: 3239)
137139
FixedPointMathLibTest:testExpWad() (gas: 7544)
138-
FixedPointMathLibTest:testFactorial() (gas: 43780)
140+
FixedPointMathLibTest:testFactorial() (gas: 43821)
139141
FixedPointMathLibTest:testFactorialOriginal() (gas: 94245)
140-
FixedPointMathLibTest:testFullMulDiv() (gas: 1192)
141-
FixedPointMathLibTest:testFullMulDiv(uint256,uint256,uint256):(uint256) (runs: 256, μ: 1382, ~: 996)
142-
FixedPointMathLibTest:testFullMulDivUp(uint256,uint256,uint256) (runs: 256, μ: 1740, ~: 1502)
142+
FixedPointMathLibTest:testFullMulDiv() (gas: 1191)
143+
FixedPointMathLibTest:testFullMulDiv(uint256,uint256,uint256):(uint256) (runs: 256, μ: 1391, ~: 996)
144+
FixedPointMathLibTest:testFullMulDivUp(uint256,uint256,uint256) (runs: 256, μ: 1747, ~: 1502)
143145
FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase1() (gas: 3635)
144-
FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase2() (gas: 3668)
146+
FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase2() (gas: 3645)
145147
FixedPointMathLibTest:testGcd() (gas: 4172)
146-
FixedPointMathLibTest:testGcd(uint256,uint256) (runs: 256, μ: 4840, ~: 2058)
147-
FixedPointMathLibTest:testLnWad() (gas: 2241)
148-
FixedPointMathLibTest:testLnWadBig() (gas: 2230)
148+
FixedPointMathLibTest:testGcd(uint256,uint256) (runs: 256, μ: 4879, ~: 2059)
149+
FixedPointMathLibTest:testLnWad() (gas: 2197)
150+
FixedPointMathLibTest:testLnWadBig() (gas: 2252)
149151
FixedPointMathLibTest:testLnWadNegativeReverts() (gas: 3187)
150-
FixedPointMathLibTest:testLnWadOverflowReverts() (gas: 3140)
151-
FixedPointMathLibTest:testLnWadSmall() (gas: 2884)
152-
FixedPointMathLibTest:testLog2() (gas: 304955)
153-
FixedPointMathLibTest:testLog2RevertsForZero() (gas: 3177)
152+
FixedPointMathLibTest:testLnWadOverflowReverts() (gas: 3185)
153+
FixedPointMathLibTest:testLnWadSmall() (gas: 2864)
154+
FixedPointMathLibTest:testLog2() (gas: 304977)
155+
FixedPointMathLibTest:testLog2RevertsForZero() (gas: 3155)
154156
FixedPointMathLibTest:testLog2Up() (gas: 361267)
155157
FixedPointMathLibTest:testLog2UpRevertsForZero() (gas: 3182)
156-
FixedPointMathLibTest:testMax(uint256,uint256) (runs: 256, μ: 496, ~: 492)
157-
FixedPointMathLibTest:testMaxCasted(uint32,uint32,uint256) (runs: 256, μ: 843, ~: 848)
158-
FixedPointMathLibTest:testMin(uint256,uint256) (runs: 256, μ: 520, ~: 525)
159-
FixedPointMathLibTest:testMulDiv() (gas: 1865)
160-
FixedPointMathLibTest:testMulDiv(uint256,uint256,uint256) (runs: 256, μ: 692, ~: 792)
161-
FixedPointMathLibTest:testMulDivEdgeCases() (gas: 740)
162-
FixedPointMathLibTest:testMulDivOverflowReverts(uint256,uint256,uint256) (runs: 256, μ: 3813, ~: 3813)
158+
FixedPointMathLibTest:testMax(uint256,uint256) (runs: 256, μ: 474, ~: 470)
159+
FixedPointMathLibTest:testMaxCasted(uint32,uint32,uint256) (runs: 256, μ: 844, ~: 849)
160+
FixedPointMathLibTest:testMaxSigned(int256,int256) (runs: 256, μ: 520, ~: 520)
161+
FixedPointMathLibTest:testMin(uint256,uint256) (runs: 256, μ: 477, ~: 482)
162+
FixedPointMathLibTest:testMinSigned(int256,int256) (runs: 256, μ: 475, ~: 475)
163+
FixedPointMathLibTest:testMulDiv() (gas: 1843)
164+
FixedPointMathLibTest:testMulDiv(uint256,uint256,uint256) (runs: 256, μ: 736, ~: 836)
165+
FixedPointMathLibTest:testMulDivEdgeCases() (gas: 762)
166+
FixedPointMathLibTest:testMulDivOverflowReverts(uint256,uint256,uint256) (runs: 256, μ: 3791, ~: 3791)
163167
FixedPointMathLibTest:testMulDivUp() (gas: 2147)
164168
FixedPointMathLibTest:testMulDivUp(uint256,uint256,uint256) (runs: 256, μ: 881, ~: 1099)
165-
FixedPointMathLibTest:testMulDivUpEdgeCases() (gas: 796)
166-
FixedPointMathLibTest:testMulDivUpOverflowReverts(uint256,uint256,uint256) (runs: 256, μ: 3770, ~: 3770)
167-
FixedPointMathLibTest:testMulDivUpZeroDenominator() (gas: 3176)
168-
FixedPointMathLibTest:testMulDivUpZeroDenominatorReverts(uint256,uint256) (runs: 256, μ: 3319, ~: 3319)
169-
FixedPointMathLibTest:testMulDivZeroDenominatorReverts() (gas: 3197)
170-
FixedPointMathLibTest:testMulDivZeroDenominatorReverts(uint256,uint256) (runs: 256, μ: 3278, ~: 3278)
171-
FixedPointMathLibTest:testMulWad() (gas: 692)
172-
FixedPointMathLibTest:testMulWad(uint256,uint256) (runs: 256, μ: 630, ~: 734)
173-
FixedPointMathLibTest:testMulWadEdgeCases() (gas: 737)
174-
FixedPointMathLibTest:testMulWadOverflowReverts(uint256,uint256) (runs: 256, μ: 3748, ~: 3748)
175-
FixedPointMathLibTest:testMulWadUp() (gas: 815)
176-
FixedPointMathLibTest:testMulWadUp(uint256,uint256) (runs: 256, μ: 802, ~: 1021)
177-
FixedPointMathLibTest:testMulWadUpEdgeCases() (gas: 793)
178-
FixedPointMathLibTest:testMulWadUpOverflowReverts(uint256,uint256) (runs: 256, μ: 3727, ~: 3727)
179-
FixedPointMathLibTest:testRawAddMod(uint256,uint256,uint256) (runs: 256, μ: 534, ~: 534)
180-
FixedPointMathLibTest:testRawBoolToUint(bool) (runs: 256, μ: 451, ~: 451)
181-
FixedPointMathLibTest:testRawDiv(uint256,uint256) (runs: 256, μ: 444, ~: 444)
182-
FixedPointMathLibTest:testRawMod(uint256,uint256) (runs: 256, μ: 443, ~: 443)
183-
FixedPointMathLibTest:testRawMulMod(uint256,uint256,uint256) (runs: 256, μ: 535, ~: 535)
184-
FixedPointMathLibTest:testRawSDiv(int256,int256) (runs: 256, μ: 421, ~: 421)
185-
FixedPointMathLibTest:testRawSMod(int256,int256) (runs: 256, μ: 455, ~: 455)
186-
FixedPointMathLibTest:testSqrt() (gas: 42575)
187-
FixedPointMathLibTest:testSqrt(uint256) (runs: 256, μ: 972, ~: 1021)
188-
FixedPointMathLibTest:testSqrtBack(uint256) (runs: 256, μ: 13730, ~: 363)
189-
FixedPointMathLibTest:testSqrtHashed(uint256) (runs: 256, μ: 53197, ~: 53527)
190-
FixedPointMathLibTest:testSqrtHashedSingle() (gas: 53086)
169+
FixedPointMathLibTest:testMulDivUpEdgeCases() (gas: 818)
170+
FixedPointMathLibTest:testMulDivUpOverflowReverts(uint256,uint256,uint256) (runs: 256, μ: 3793, ~: 3793)
171+
FixedPointMathLibTest:testMulDivUpZeroDenominator() (gas: 3220)
172+
FixedPointMathLibTest:testMulDivUpZeroDenominatorReverts(uint256,uint256) (runs: 256, μ: 3297, ~: 3297)
173+
FixedPointMathLibTest:testMulDivZeroDenominatorReverts() (gas: 3175)
174+
FixedPointMathLibTest:testMulDivZeroDenominatorReverts(uint256,uint256) (runs: 256, μ: 3300, ~: 3300)
175+
FixedPointMathLibTest:testMulWad() (gas: 737)
176+
FixedPointMathLibTest:testMulWad(uint256,uint256) (runs: 256, μ: 675, ~: 779)
177+
FixedPointMathLibTest:testMulWadEdgeCases() (gas: 715)
178+
FixedPointMathLibTest:testMulWadOverflowReverts(uint256,uint256) (runs: 256, μ: 3726, ~: 3726)
179+
FixedPointMathLibTest:testMulWadUp() (gas: 816)
180+
FixedPointMathLibTest:testMulWadUp(uint256,uint256) (runs: 256, μ: 803, ~: 1022)
181+
FixedPointMathLibTest:testMulWadUpEdgeCases() (gas: 794)
182+
FixedPointMathLibTest:testMulWadUpOverflowReverts(uint256,uint256) (runs: 256, μ: 3749, ~: 3749)
183+
FixedPointMathLibTest:testRawAdd(int256,int256) (runs: 256, μ: 418, ~: 418)
184+
FixedPointMathLibTest:testRawAdd(uint256,uint256) (runs: 256, μ: 441, ~: 441)
185+
FixedPointMathLibTest:testRawAddMod(uint256,uint256,uint256) (runs: 256, μ: 512, ~: 512)
186+
FixedPointMathLibTest:testRawDiv(uint256,uint256) (runs: 256, μ: 443, ~: 443)
187+
FixedPointMathLibTest:testRawMod(uint256,uint256) (runs: 256, μ: 442, ~: 442)
188+
FixedPointMathLibTest:testRawMul(int256,int256) (runs: 256, μ: 412, ~: 412)
189+
FixedPointMathLibTest:testRawMul(uint256,uint256) (runs: 256, μ: 442, ~: 442)
190+
FixedPointMathLibTest:testRawMulMod(uint256,uint256,uint256) (runs: 256, μ: 557, ~: 557)
191+
FixedPointMathLibTest:testRawSDiv(int256,int256) (runs: 256, μ: 442, ~: 442)
192+
FixedPointMathLibTest:testRawSMod(int256,int256) (runs: 256, μ: 422, ~: 422)
193+
FixedPointMathLibTest:testRawSub(int256,int256) (runs: 256, μ: 441, ~: 441)
194+
FixedPointMathLibTest:testRawSub(uint256,uint256) (runs: 256, μ: 461, ~: 461)
195+
FixedPointMathLibTest:testSqrt() (gas: 42598)
196+
FixedPointMathLibTest:testSqrt(uint256) (runs: 256, μ: 994, ~: 1043)
197+
FixedPointMathLibTest:testSqrtBack(uint256) (runs: 256, μ: 13653, ~: 341)
198+
FixedPointMathLibTest:testSqrtHashed(uint256) (runs: 256, μ: 53126, ~: 53505)
199+
FixedPointMathLibTest:testSqrtHashedSingle() (gas: 53064)
191200
FixedPointMathLibTest:testZeroFloorSub(uint256,uint256) (runs: 256, μ: 527, ~: 557)
192201
FixedPointMathLibTest:testZeroFloorSubCasted(uint32,uint32,uint256) (runs: 256, μ: 882, ~: 842)
193-
FixedPointMathLibTest:test__codesize() (gas: 16659)
202+
FixedPointMathLibTest:test__codesize() (gas: 17249)
203+
LibBitTest:testAnd(bool,bool) (runs: 256, μ: 541, ~: 540)
204+
LibBitTest:testBoolToUint(bool) (runs: 256, μ: 449, ~: 449)
194205
LibBitTest:testCLZ() (gas: 363996)
195-
LibBitTest:testFFS() (gas: 210199)
206+
LibBitTest:testFFS() (gas: 210221)
196207
LibBitTest:testFLS() (gas: 302851)
197-
LibBitTest:testIsPo2() (gas: 62329)
198-
LibBitTest:testIsPo2(uint256) (runs: 256, μ: 4833, ~: 1063)
208+
LibBitTest:testIsPo2() (gas: 62307)
209+
LibBitTest:testIsPo2(uint256) (runs: 256, μ: 4852, ~: 1031)
199210
LibBitTest:testIsPo2(uint8,uint8) (runs: 256, μ: 596, ~: 598)
200-
LibBitTest:testPopCount() (gas: 63694)
201-
LibBitTest:testPopCount(uint256) (runs: 256, μ: 4888, ~: 1118)
202-
LibBitTest:test__codesize() (gas: 4729)
211+
LibBitTest:testOr(bool,bool) (runs: 256, μ: 538, ~: 540)
212+
LibBitTest:testPopCount() (gas: 63760)
213+
LibBitTest:testPopCount(uint256) (runs: 256, μ: 4907, ~: 1086)
214+
LibBitTest:test__codesize() (gas: 4964)
203215
LibBitmapTest:testBitmapClaimWithGetSet() (gas: 27089)
204216
LibBitmapTest:testBitmapClaimWithToggle() (gas: 17479)
205217
LibBitmapTest:testBitmapFindLastSet() (gas: 1355871)
206-
LibBitmapTest:testBitmapFindLastSet(uint256,uint256) (runs: 256, μ: 76076, ~: 76189)
218+
LibBitmapTest:testBitmapFindLastSet(uint256,uint256) (runs: 256, μ: 76058, ~: 76127)
207219
LibBitmapTest:testBitmapGet() (gas: 2565)
208220
LibBitmapTest:testBitmapGet(uint256) (runs: 256, μ: 2593, ~: 2593)
209221
LibBitmapTest:testBitmapPopCount() (gas: 750426)
210-
LibBitmapTest:testBitmapPopCount(uint256,uint256,uint256) (runs: 256, μ: 203763, ~: 172592)
222+
LibBitmapTest:testBitmapPopCount(uint256,uint256,uint256) (runs: 256, μ: 198667, ~: 171981)
211223
LibBitmapTest:testBitmapPopCountAcrossMultipleBuckets() (gas: 73611)
212224
LibBitmapTest:testBitmapPopCountWithinSingleBucket() (gas: 34032)
213225
LibBitmapTest:testBitmapSet() (gas: 22527)
@@ -218,7 +230,7 @@ LibBitmapTest:testBitmapSetBatchAcrossMultipleBuckets() (gas: 452545)
218230
LibBitmapTest:testBitmapSetBatchWithinSingleBucket() (gas: 417119)
219231
LibBitmapTest:testBitmapSetTo() (gas: 14275)
220232
LibBitmapTest:testBitmapSetTo(uint256,bool,uint256) (runs: 256, μ: 9783, ~: 2860)
221-
LibBitmapTest:testBitmapSetTo(uint256,uint256) (runs: 256, μ: 44997, ~: 49952)
233+
LibBitmapTest:testBitmapSetTo(uint256,uint256) (runs: 256, μ: 45552, ~: 50109)
222234
LibBitmapTest:testBitmapToggle() (gas: 30815)
223235
LibBitmapTest:testBitmapToggle(uint256,bool) (runs: 256, μ: 20742, ~: 23150)
224236
LibBitmapTest:testBitmapUnset() (gas: 22572)

src/utils/FixedPointMathLib.sol

Lines changed: 80 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -577,9 +577,15 @@ library FixedPointMathLib {
577577

578578
/// @dev Returns the average of `x` and `y`.
579579
function avg(uint256 x, uint256 y) internal pure returns (uint256 z) {
580-
/// @solidity memory-safe-assembly
581-
assembly {
582-
z := add(and(x, y), shr(1, xor(x, y)))
580+
unchecked {
581+
z = (x & y) + ((x ^ y) >> 1);
582+
}
583+
}
584+
585+
/// @dev Returns the average of `x` and `y`.
586+
function avg(int256 x, int256 y) internal pure returns (int256 z) {
587+
unchecked {
588+
z = (x >> 1) + (y >> 1) + (((x & 1) + (y & 1)) >> 1);
583589
}
584590
}
585591

@@ -609,6 +615,14 @@ library FixedPointMathLib {
609615
}
610616
}
611617

618+
/// @dev Returns the minimum of `x` and `y`.
619+
function min(int256 x, int256 y) internal pure returns (int256 z) {
620+
/// @solidity memory-safe-assembly
621+
assembly {
622+
z := xor(x, mul(xor(x, y), slt(y, x)))
623+
}
624+
}
625+
612626
/// @dev Returns the maximum of `x` and `y`.
613627
function max(uint256 x, uint256 y) internal pure returns (uint256 z) {
614628
/// @solidity memory-safe-assembly
@@ -617,16 +631,11 @@ library FixedPointMathLib {
617631
}
618632
}
619633

620-
/// @dev Returns greatest common divisor of `x` and `y`.
621-
function gcd(uint256 x, uint256 y) internal pure returns (uint256 z) {
634+
/// @dev Returns the maximum of `x` and `y`.
635+
function max(int256 x, int256 y) internal pure returns (int256 z) {
622636
/// @solidity memory-safe-assembly
623637
assembly {
624-
// forgefmt: disable-next-item
625-
for { z := x } y {} {
626-
let t := y
627-
y := mod(z, y)
628-
z := t
629-
}
638+
z := xor(x, mul(xor(x, y), sgt(y, x)))
630639
}
631640
}
632641

@@ -639,10 +648,70 @@ library FixedPointMathLib {
639648
z = min(max(x, minValue), maxValue);
640649
}
641650

651+
/// @dev Returns `x`, bounded to `minValue` and `maxValue`.
652+
function clamp(int256 x, int256 minValue, int256 maxValue) internal pure returns (int256 z) {
653+
z = min(max(x, minValue), maxValue);
654+
}
655+
656+
/// @dev Returns greatest common divisor of `x` and `y`.
657+
function gcd(uint256 x, uint256 y) internal pure returns (uint256 z) {
658+
/// @solidity memory-safe-assembly
659+
assembly {
660+
// forgefmt: disable-next-item
661+
for { z := x } y {} {
662+
let t := y
663+
y := mod(z, y)
664+
z := t
665+
}
666+
}
667+
}
668+
642669
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
643670
/* RAW NUMBER OPERATIONS */
644671
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
645672

673+
/// @dev Returns `x + y`, without checking for overflow.
674+
function rawAdd(uint256 x, uint256 y) internal pure returns (uint256 z) {
675+
unchecked {
676+
z = x + y;
677+
}
678+
}
679+
680+
/// @dev Returns `x + y`, without checking for overflow.
681+
function rawAdd(int256 x, int256 y) internal pure returns (int256 z) {
682+
unchecked {
683+
z = x + y;
684+
}
685+
}
686+
687+
/// @dev Returns `x - y`, without checking for underflow.
688+
function rawSub(uint256 x, uint256 y) internal pure returns (uint256 z) {
689+
unchecked {
690+
z = x - y;
691+
}
692+
}
693+
694+
/// @dev Returns `x - y`, without checking for underflow.
695+
function rawSub(int256 x, int256 y) internal pure returns (int256 z) {
696+
unchecked {
697+
z = x - y;
698+
}
699+
}
700+
701+
/// @dev Returns `x * y`, without checking for overflow.
702+
function rawMul(uint256 x, uint256 y) internal pure returns (uint256 z) {
703+
unchecked {
704+
z = x * y;
705+
}
706+
}
707+
708+
/// @dev Returns `x * y`, without checking for overflow.
709+
function rawMul(int256 x, int256 y) internal pure returns (int256 z) {
710+
unchecked {
711+
z = x * y;
712+
}
713+
}
714+
646715
/// @dev Returns `x / y`, returning 0 if `y` is zero.
647716
function rawDiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
648717
/// @solidity memory-safe-assembly
@@ -690,13 +759,4 @@ library FixedPointMathLib {
690759
z := mulmod(x, y, d)
691760
}
692761
}
693-
694-
/// @dev Returns a non-zero number if `b` is true, else 0.
695-
/// If `b` is from plain Solidity, the non-zero number will be 1.
696-
function rawBoolToUint(bool b) internal pure returns (uint256 z) {
697-
/// @solidity memory-safe-assembly
698-
assembly {
699-
z := b
700-
}
701-
}
702762
}

src/utils/LibBit.sol

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.4;
33

4-
/// @notice Library for bit twiddling operations.
4+
/// @notice Library for bit twiddling and boolean operations.
55
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBit.sol)
66
/// @author Inspired by (https://graphics.stanford.edu/~seander/bithacks.html)
77
library LibBit {
8+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
9+
/* BIT TWIDDLING OPERATIONS */
10+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
11+
812
/// @dev Find last set.
913
/// Returns the index of the most significant bit of `x`,
1014
/// counting from the least significant bit position.
@@ -105,4 +109,33 @@ library LibBit {
105109
result := iszero(add(and(x, sub(x, 1)), iszero(x)))
106110
}
107111
}
112+
113+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
114+
/* BOOLEAN OPERATIONS */
115+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
116+
117+
/// @dev Returns `x & y`.
118+
function and(bool x, bool y) internal pure returns (bool z) {
119+
/// @solidity memory-safe-assembly
120+
assembly {
121+
z := and(x, y)
122+
}
123+
}
124+
125+
/// @dev Returns `x | y`.
126+
function or(bool x, bool y) internal pure returns (bool z) {
127+
/// @solidity memory-safe-assembly
128+
assembly {
129+
z := or(x, y)
130+
}
131+
}
132+
133+
/// @dev Returns a non-zero number if `b` is true, else 0.
134+
/// If `b` is from plain Solidity, the non-zero number will be 1.
135+
function toUint(bool b) internal pure returns (uint256 z) {
136+
/// @solidity memory-safe-assembly
137+
assembly {
138+
z := b
139+
}
140+
}
108141
}

0 commit comments

Comments
 (0)