Support shl/shr in LLL

This commit is contained in:
Alex Beregszaszi 2017-06-14 12:20:19 +01:00
parent 0b99c81f85
commit 600e3ad240
2 changed files with 23 additions and 0 deletions

View File

@ -74,6 +74,9 @@ void CompilerState::populateStandard()
"(def 'szabo 1000000000000)"
"(def 'finney 1000000000000000)"
"(def 'ether 1000000000000000000)"
// these could be replaced by native instructions once supported by EVM
"(def 'shl (val shift) (mul val (exp 2 shift)))"
"(def 'shr (val shift) (div val (exp 2 shift)))"
"}";
CodeFragment::compile(s, *this);
}

View File

@ -328,6 +328,26 @@ BOOST_AUTO_TEST_CASE(sha3_one_arg)
fromHex("b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6")));
}
BOOST_AUTO_TEST_CASE(shift_left)
{
char const* sourceCode = R"(
(returnlll
(return (shl 1 8)))
)";
compileAndRun(sourceCode);
BOOST_CHECK(callFallback() == encodeArgs(u256(256)));
}
BOOST_AUTO_TEST_CASE(shift_right)
{
char const* sourceCode = R"(
(returnlll
(return (shr 65536 8)))
)";
compileAndRun(sourceCode);
BOOST_CHECK(callFallback() == encodeArgs(u256(256)));
}
BOOST_AUTO_TEST_SUITE_END()
}