|
|
@ -297,7 +297,7 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, RuntimeManager& _runti |
|
|
|
auto r = m_builder.CreateSDiv(d, n); |
|
|
|
r = m_builder.CreateSelect(divByZero, Constant::get(0), r); |
|
|
|
auto dNeg = m_builder.CreateSub(Constant::get(0), d); |
|
|
|
r = m_builder.CreateSelect(divByMinusOne, dNeg, r); |
|
|
|
r = m_builder.CreateSelect(divByMinusOne, dNeg, r); // protect against undef i256.min / -1
|
|
|
|
stack.push(r); |
|
|
|
break; |
|
|
|
} |
|
|
@ -319,9 +319,11 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, RuntimeManager& _runti |
|
|
|
auto d = stack.pop(); |
|
|
|
auto n = stack.pop(); |
|
|
|
auto divByZero = m_builder.CreateICmpEQ(n, Constant::get(0)); |
|
|
|
auto divByMinusOne = m_builder.CreateICmpEQ(n, Constant::get(-1)); |
|
|
|
n = m_builder.CreateSelect(divByZero, Constant::get(1), n); // protect against hardware signal
|
|
|
|
auto r = m_builder.CreateSRem(d, n); |
|
|
|
r = m_builder.CreateSelect(divByZero, Constant::get(0), r); |
|
|
|
r = m_builder.CreateSelect(divByMinusOne, Constant::get(0), r); // protect against undef i256.min / -1
|
|
|
|
stack.push(r); |
|
|
|
break; |
|
|
|
} |
|
|
|