aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/codegen/ABIFunctions.cpp
diff options
context:
space:
mode:
authorAlex Beregszaszi <alex@rtfs.hu>2018-04-06 20:54:21 +0800
committerAlex Beregszaszi <alex@rtfs.hu>2018-05-01 03:34:43 +0800
commit52c94418795f829c4a225fdf4742eec7a1961232 (patch)
treea62269e946982a1aaad47131390fedaf9478d99f /libsolidity/codegen/ABIFunctions.cpp
parentc3608eaf90b49771b2785d86bb0c73dca6e61046 (diff)
downloaddexon-solidity-52c94418795f829c4a225fdf4742eec7a1961232.tar
dexon-solidity-52c94418795f829c4a225fdf4742eec7a1961232.tar.gz
dexon-solidity-52c94418795f829c4a225fdf4742eec7a1961232.tar.bz2
dexon-solidity-52c94418795f829c4a225fdf4742eec7a1961232.tar.lz
dexon-solidity-52c94418795f829c4a225fdf4742eec7a1961232.tar.xz
dexon-solidity-52c94418795f829c4a225fdf4742eec7a1961232.tar.zst
dexon-solidity-52c94418795f829c4a225fdf4742eec7a1961232.zip
Do not use SAR instead of SDIV in shifts because it rounds differently
Diffstat (limited to 'libsolidity/codegen/ABIFunctions.cpp')
-rw-r--r--libsolidity/codegen/ABIFunctions.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/libsolidity/codegen/ABIFunctions.cpp b/libsolidity/codegen/ABIFunctions.cpp
index f6aa714d..6c4ddc02 100644
--- a/libsolidity/codegen/ABIFunctions.cpp
+++ b/libsolidity/codegen/ABIFunctions.cpp
@@ -1439,17 +1439,18 @@ string ABIFunctions::shiftRightFunction(size_t _numBits, bool _signed)
solAssert(_numBits < 256, "");
string functionName = "shift_right_" + to_string(_numBits) + (_signed ? "_signed" : "_unsigned");
- if (m_evmVersion.hasBitwiseShifting())
+
+ // NOTE: SAR rounds differently than SDIV
+ if (m_evmVersion.hasBitwiseShifting() && !_signed)
{
return createFunction(functionName, [&]() {
return
Whiskers(R"(
function <functionName>(value) -> newValue {
- newValue := <shiftOp>(<numBits>, value)
+ newValue := shr(<numBits>, value)
}
)")
("functionName", functionName)
- ("shiftOp", _signed ? "sar" : "shr")
("numBits", to_string(_numBits))
.render();
});