14 auto operator+(
const evmc::uint256be& lhs,
const evmc::uint256be& rhs)
16 auto ret = evmc::uint256be{};
17 auto tmp = uint64_t{};
18 auto carry = uint8_t{};
19 constexpr uint64_t max_val = std::numeric_limits<uint8_t>::max();
20 for(
int i =
sizeof(lhs.bytes) - 1; i >= 0; i--) {
21 tmp = lhs.bytes[i] + rhs.bytes[i] + carry;
22 carry =
static_cast<unsigned char>(tmp > max_val);
23 ret.bytes[i] = (tmp & max_val);
28 auto operator-(
const evmc::uint256be& lhs,
const evmc::uint256be& rhs)
30 auto ret = evmc::uint256be{};
31 auto tmp1 = uint64_t{};
32 auto tmp2 = uint64_t{};
33 auto res = uint64_t{};
34 auto borrow = uint8_t{};
35 constexpr uint64_t max_val = std::numeric_limits<uint8_t>::max();
36 for(
int i =
sizeof(lhs.bytes) - 1; i >= 0; i--) {
37 tmp1 = lhs.bytes[i] + (max_val + 1);
38 tmp2 = rhs.bytes[i] + borrow;
40 ret.bytes[i] = (res & max_val);
41 borrow =
static_cast<unsigned char>(res <= max_val);
46 auto operator*(
const evmc::uint256be& lhs,
const evmc::uint256be& rhs)
48 auto ret = evmc::uint256be{};
49 for(
size_t i = 0; i <
sizeof(lhs.bytes); i++) {
50 auto row = evmc::uint256be{};
51 if(lhs.bytes[i] == 0) {
54 for(
size_t j = 0; j <
sizeof(rhs.bytes); j++) {
55 if(rhs.bytes[j] == 0) {
58 auto shift = (
sizeof(lhs.bytes) - i - 1)
59 + (
sizeof(rhs.bytes) - j - 1);
60 if(shift >=
sizeof(ret.bytes)) {
64 =
static_cast<uint64_t
>(lhs.bytes[i] * rhs.bytes[j]);
65 auto tmp = evmc::uint256be(intermediate);
66 tmp = tmp << static_cast<size_t>(shift);
74 auto operator<<(
const evmc::uint256be& lhs,
size_t count)
76 auto ret = evmc::uint256be{};
77 if(count >=
sizeof(lhs.bytes)) {
80 for(
size_t i = 0; i + count <
sizeof(lhs.bytes); i++) {
81 ret.bytes[i] = lhs.bytes[i + count];
auto operator+(const evmc::uint256be &lhs, const evmc::uint256be &rhs) -> evmc::uint256be
Adds two uint256be values.
auto operator*(const evmc::uint256be &lhs, const evmc::uint256be &rhs) -> evmc::uint256be
Multiplies two uint256be values.
auto operator<<(const evmc::uint256be &lhs, size_t count) -> evmc::uint256be
Left shifts a uint256be value by a given number of bytes.
auto operator-(const evmc::uint256be &lhs, const evmc::uint256be &rhs) -> evmc::uint256be
Subtracts two uint256be values.