mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Use for loop for assembly memcopy.
This commit is contained in:
parent
f879489291
commit
0aaa6d876d
@ -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" }
|
||||||
@ -328,14 +322,12 @@ 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))
|
|
||||||
mstore(dst, mload(src))
|
|
||||||
dst := add(dst, 32)
|
dst := add(dst, 32)
|
||||||
src := add(src, 32)
|
src := add(src, 32)
|
||||||
len := sub(len, 32)
|
len := sub(len, 32)
|
||||||
jump(start32)
|
}
|
||||||
end32:
|
{ mstore(dst, mload(src)) }
|
||||||
|
|
||||||
// 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)
|
||||||
|
Loading…
Reference in New Issue
Block a user