diff options
author | chriseth <chris@ethereum.org> | 2017-06-23 00:25:22 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2017-06-26 15:18:14 +0800 |
commit | 0aaa6d876d56e450ce907e5a8b1db6cfd220312f (patch) | |
tree | 6b51a3eda523a32270f33c758ef0b43d29834fe5 /libsolidity/codegen/CompilerUtils.cpp | |
parent | f879489291b78a7872c13d3235e1d345883880b4 (diff) | |
download | dexon-solidity-0aaa6d876d56e450ce907e5a8b1db6cfd220312f.tar.gz dexon-solidity-0aaa6d876d56e450ce907e5a8b1db6cfd220312f.tar.zst dexon-solidity-0aaa6d876d56e450ce907e5a8b1db6cfd220312f.zip |
Use for loop for assembly memcopy.
Diffstat (limited to 'libsolidity/codegen/CompilerUtils.cpp')
-rw-r--r-- | libsolidity/codegen/CompilerUtils.cpp | 38 |
1 files changed, 15 insertions, 23 deletions
diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp index 7fed1975..26eadf9d 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,19 @@ 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" } |