Use for loop for assembly memcopy.

This commit is contained in:
chriseth 2017-06-22 18:25:22 +02:00
parent f879489291
commit 0aaa6d876d

View File

@ -305,15 +305,9 @@ void CompilerUtils::memoryCopy32()
m_context.appendInlineAssembly(R"( m_context.appendInlineAssembly(R"(
{ {
jumpi(end, eq(len, 0)) for { let i := 0 } lt(i, len) { i := add(i, 32) } {
start: mstore(add(dst, i), mload(add(src, i)))
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:
} }
)", )",
{ "len", "dst", "src" } { "len", "dst", "src" }
@ -327,21 +321,19 @@ void CompilerUtils::memoryCopy()
m_context.appendInlineAssembly(R"( m_context.appendInlineAssembly(R"(
{ {
// copy 32 bytes at once // copy 32 bytes at once
start32: for {} iszero(lt(len, 32)) {
jumpi(end32, lt(len, 32)) dst := add(dst, 32)
mstore(dst, mload(src)) src := add(src, 32)
dst := add(dst, 32) len := sub(len, 32)
src := add(src, 32) }
len := sub(len, 32) { mstore(dst, mload(src)) }
jump(start32)
end32:
// copy the remainder (0 < len < 32) // copy the remainder (0 < len < 32)
let mask := sub(exp(256, sub(32, len)), 1) let mask := sub(exp(256, sub(32, len)), 1)
let srcpart := and(mload(src), not(mask)) let srcpart := and(mload(src), not(mask))
let dstpart := and(mload(dst), mask) let dstpart := and(mload(dst), mask)
mstore(dst, or(srcpart, dstpart)) mstore(dst, or(srcpart, dstpart))
} }
)", )",
{ "len", "dst", "src" } { "len", "dst", "src" }