From 52c94418795f829c4a225fdf4742eec7a1961232 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 6 Apr 2018 14:54:21 +0200 Subject: Do not use SAR instead of SDIV in shifts because it rounds differently --- libsolidity/codegen/CompilerUtils.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'libsolidity/codegen/CompilerUtils.cpp') diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp index 46e81d49..45ad1f47 100644 --- a/libsolidity/codegen/CompilerUtils.cpp +++ b/libsolidity/codegen/CompilerUtils.cpp @@ -1274,8 +1274,9 @@ void CompilerUtils::leftShiftNumberOnStack(unsigned _bits) void CompilerUtils::rightShiftNumberOnStack(unsigned _bits, bool _isSigned) { solAssert(_bits < 256, ""); - if (m_context.evmVersion().hasBitwiseShifting()) - m_context << _bits << (_isSigned ? Instruction::SAR : Instruction::SHR); + // NOTE: SAR rounds differently than SDIV + if (m_context.evmVersion().hasBitwiseShifting() && !_isSigned) + m_context << _bits << Instruction::SHR; else m_context << (u256(1) << _bits) << Instruction::SWAP1 << (_isSigned ? Instruction::SDIV : Instruction::DIV); } -- cgit