diff --git a/test/libsolidity/semanticTests/externalContracts/prbmath_signed.sol b/test/libsolidity/semanticTests/externalContracts/prbmath_signed.sol new file mode 100644 index 000000000..c04bc3cde --- /dev/null +++ b/test/libsolidity/semanticTests/externalContracts/prbmath_signed.sol @@ -0,0 +1,95 @@ +==== ExternalSource: _prbmath/PRBMathCommon.sol ==== +==== ExternalSource: _prbmath/PRBMathSD59x18.sol ==== +==== Source: prbmath.sol ==== +import "_prbmath/PRBMathSD59x18.sol"; + +contract test { + using PRBMathSD59x18 for int256; + + function div(int256 x, int256 y) external pure returns (int256 ret) { + ret = x.div(y); + } + function exp(int256 x) external pure returns (int256 ret) { + ret = x.log10(); + } + function exp2(int256 x) external pure returns (int256 ret) { + ret = x.exp2(); + } + function gm(int256 x, int256 y) external pure returns (int256 ret) { + ret = x.gm(y); + } + function log10(int256 x) external pure returns (int256 ret) { + ret = x.log10(); + } + function log2(int256 x) external pure returns (int256 ret) { + ret = x.log2(); + } + function mul(int256 x, int256 y) external pure returns (int256 ret) { + ret = x.mul(y); + } + function pow(int256 x, uint256 y) external pure returns (int256 ret) { + ret = x.pow(y); + } + function sqrt(int256 x) external pure returns (int256 ret) { + ret = x.sqrt(); + } + function benchmark(int256 x) external pure returns (int256 ret, int256 z1, int256 z2) { + int256 y = x.mul(3).ceil(); + int256 z = y.div(x); + for (uint i = 0; i < 10; i++) + z = z.sqrt(); + ret = z; + + // Check precision + z1 = z.ceil(); + z2 = z.sqrt().pow(2).ceil(); + assert(z1 == z2); + } +} +// ==== +// compileViaYul: also +// ---- +// constructor() +// gas irOptimized: 2149588 +// gas legacy: 2561184 +// gas legacyOptimized: 1874610 +// div(int256,int256): 3141592653589793238, 88714123 -> 35412542528203691288251815328 +// gas irOptimized: 22303 +// gas legacy: 22767 +// gas legacyOptimized: 22282 +// exp(int256): 3141592653589793238 -> 4971498726941338506 +// gas irOptimized: 31438 +// gas legacy: 32933 +// gas legacyOptimized: 30322 +// exp2(int256): 3141592653589793238 -> 8824977827076287620 +// gas irOptimized: 24808 +// gas legacy: 24864 +// gas legacyOptimized: 24110 +// gm(int256,int256): 3141592653589793238, 88714123 -> 16694419339601 +// gas irOptimized: 23573 +// gas legacy: 23228 +// gas legacyOptimized: 22683 +// log10(int256): 3141592653589793238 -> 4971498726941338506 +// gas irOptimized: 31328 +// gas legacy: 32934 +// gas legacyOptimized: 30323 +// log2(int256): 3141592653589793238 -> 1651496129472318782 +// gas irOptimized: 29484 +// gas legacy: 31067 +// gas legacyOptimized: 28426 +// mul(int256,int256): 3141592653589793238, 88714123 -> 278703637 +// gas irOptimized: 22414 +// gas legacy: 22807 +// gas legacyOptimized: 22295 +// pow(int256,uint256): 3141592653589793238, 5 -> 306019684785281453040 +// gas irOptimized: 22974 +// gas legacy: 23508 +// gas legacyOptimized: 22921 +// sqrt(int256): 3141592653589793238 -> 1772453850905516027 +// gas irOptimized: 23246 +// gas legacy: 22802 +// gas legacyOptimized: 22422 +// benchmark(int256): 3141592653589793238 -> 998882724338592125, 1000000000000000000, 1000000000000000000 +// gas irOptimized: 43323 +// gas legacy: 36673 +// gas legacyOptimized: 34729 diff --git a/test/libsolidity/semanticTests/externalContracts/prbmath_unsigned.sol b/test/libsolidity/semanticTests/externalContracts/prbmath_unsigned.sol new file mode 100644 index 000000000..a81d2ecf7 --- /dev/null +++ b/test/libsolidity/semanticTests/externalContracts/prbmath_unsigned.sol @@ -0,0 +1,95 @@ +==== ExternalSource: _prbmath/PRBMathCommon.sol ==== +==== ExternalSource: _prbmath/PRBMathUD60x18.sol ==== +==== Source: prbmath.sol ==== +import "_prbmath/PRBMathUD60x18.sol"; + +contract test { + using PRBMathUD60x18 for uint256; + + function div(uint256 x, uint256 y) external pure returns (uint256 ret) { + ret = x.div(y); + } + function exp(uint256 x) external pure returns (uint256 ret) { + ret = x.log10(); + } + function exp2(uint256 x) external pure returns (uint256 ret) { + ret = x.exp2(); + } + function gm(uint256 x, uint256 y) external pure returns (uint256 ret) { + ret = x.gm(y); + } + function log10(uint256 x) external pure returns (uint256 ret) { + ret = x.log10(); + } + function log2(uint256 x) external pure returns (uint256 ret) { + ret = x.log2(); + } + function mul(uint256 x, uint256 y) external pure returns (uint256 ret) { + ret = x.mul(y); + } + function pow(uint256 x, uint256 y) external pure returns (uint256 ret) { + ret = x.pow(y); + } + function sqrt(uint256 x) external pure returns (uint256 ret) { + ret = x.sqrt(); + } + function benchmark(uint256 x) external pure returns (uint256 ret, uint256 z1, uint256 z2) { + uint256 y = x.mul(3).ceil(); + uint256 z = y.div(x); + for (uint i = 0; i < 10; i++) + z = z.sqrt(); + ret = z; + + // Check precision + z1 = z.ceil(); + z2 = z.sqrt().pow(2).ceil(); + assert(z1 == z2); + } +} +// ==== +// compileViaYul: also +// ---- +// constructor() +// gas irOptimized: 1945345 +// gas legacy: 2326345 +// gas legacyOptimized: 1750080 +// div(uint256,uint256): 3141592653589793238, 88714123 -> 35412542528203691288251815328 +// gas irOptimized: 22103 +// gas legacy: 22497 +// gas legacyOptimized: 22010 +// exp(uint256): 3141592653589793238 -> 0x44fe4fc084a52b8a +// gas irOptimized: 30892 +// gas legacy: 32854 +// gas legacyOptimized: 29881 +// exp2(uint256): 3141592653589793238 -> 8824977827076287620 +// gas irOptimized: 24746 +// gas legacy: 24814 +// gas legacyOptimized: 24062 +// gm(uint256,uint256): 3141592653589793238, 88714123 -> 16694419339601 +// gas irOptimized: 23575 +// gas legacy: 23269 +// gas legacyOptimized: 22724 +// log10(uint256): 3141592653589793238 -> 0x44fe4fc084a52b8a +// gas irOptimized: 30936 +// gas legacy: 32898 +// gas legacyOptimized: 29925 +// log2(uint256): 3141592653589793238 -> 1651496129472318782 +// gas irOptimized: 28838 +// gas legacy: 30986 +// gas legacyOptimized: 28001 +// mul(uint256,uint256): 3141592653589793238, 88714123 -> 278703637 +// gas irOptimized: 22146 +// gas legacy: 22604 +// gas legacyOptimized: 22090 +// pow(uint256,uint256): 3141592653589793238, 5 -> 306019684785281453040 +// gas irOptimized: 22653 +// gas legacy: 23245 +// gas legacyOptimized: 22646 +// sqrt(uint256): 3141592653589793238 -> 1772453850905516027 +// gas irOptimized: 23264 +// gas legacy: 22820 +// gas legacyOptimized: 22440 +// benchmark(uint256): 3141592653589793238 -> 998882724338592125, 1000000000000000000, 1000000000000000000 +// gas irOptimized: 42063 +// gas legacy: 35385 +// gas legacyOptimized: 33449