diff options
author | chriseth <chris@ethereum.org> | 2017-06-27 20:37:45 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-27 20:37:45 +0800 |
commit | e715dd0b7e382b71abf50c974f943423048d138e (patch) | |
tree | b39a53434983fe7a89051697872b646101d725fe /libsolidity/codegen/CompilerUtils.cpp | |
parent | ec15df2aa76c4df532126ec34761b268a1e78b2d (diff) | |
parent | bc31d4969ccdea8804f573bcf5104c154df9aff6 (diff) | |
download | dexon-solidity-e715dd0b7e382b71abf50c974f943423048d138e.tar dexon-solidity-e715dd0b7e382b71abf50c974f943423048d138e.tar.gz dexon-solidity-e715dd0b7e382b71abf50c974f943423048d138e.tar.bz2 dexon-solidity-e715dd0b7e382b71abf50c974f943423048d138e.tar.lz dexon-solidity-e715dd0b7e382b71abf50c974f943423048d138e.tar.xz dexon-solidity-e715dd0b7e382b71abf50c974f943423048d138e.tar.zst dexon-solidity-e715dd0b7e382b71abf50c974f943423048d138e.zip |
Merge branch 'develop' into utf8-strict-parser
Diffstat (limited to 'libsolidity/codegen/CompilerUtils.cpp')
-rw-r--r-- | libsolidity/codegen/CompilerUtils.cpp | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp index 7fed1975..4edec155 100644 --- a/libsolidity/codegen/CompilerUtils.cpp +++ b/libsolidity/codegen/CompilerUtils.cpp @@ -305,15 +305,9 @@ void CompilerUtils::memoryCopy32() m_context.appendInlineAssembly(R"( { - jumpi(end, eq(len, 0)) - start: - mstore(dst, mload(src)) - jumpi(end, iszero(gt(len, 32))) - dst := add(dst, 32) - src := add(src, 32) - len := sub(len, 32) - jump(start) - end: + for { let i := 0 } lt(i, len) { i := add(i, 32) } { + mstore(add(dst, i), mload(add(src, i))) + } } )", { "len", "dst", "src" } @@ -327,21 +321,22 @@ void CompilerUtils::memoryCopy() m_context.appendInlineAssembly(R"( { - // copy 32 bytes at once - start32: - jumpi(end32, lt(len, 32)) - mstore(dst, mload(src)) - dst := add(dst, 32) - src := add(src, 32) - len := sub(len, 32) - jump(start32) - end32: + // copy 32 bytes at once + for + {} + iszero(lt(len, 32)) + { + dst := add(dst, 32) + src := add(src, 32) + len := sub(len, 32) + } + { mstore(dst, mload(src)) } - // copy the remainder (0 < len < 32) - let mask := sub(exp(256, sub(32, len)), 1) - let srcpart := and(mload(src), not(mask)) - let dstpart := and(mload(dst), mask) - mstore(dst, or(srcpart, dstpart)) + // copy the remainder (0 < len < 32) + let mask := sub(exp(256, sub(32, len)), 1) + let srcpart := and(mload(src), not(mask)) + let dstpart := and(mload(dst), mask) + mstore(dst, or(srcpart, dstpart)) } )", { "len", "dst", "src" } |