mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 04:36:42 +00:00
SDIV & SMOD fixed
This commit is contained in:
parent
58d2bfbd8a
commit
5362d5056d
1 changed files with 25 additions and 3 deletions
|
|
@ -96,6 +96,29 @@ llvm::Value* Arith256::mulmod(llvm::Value* _arg1, llvm::Value* _arg2, llvm::Valu
|
||||||
return ternaryOp(m_mulmod, _arg1, _arg2, _arg3);
|
return ternaryOp(m_mulmod, _arg1, _arg2, _arg3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
using s256 = boost::multiprecision::int256_t;
|
||||||
|
|
||||||
|
inline s256 u2s(u256 _u)
|
||||||
|
{
|
||||||
|
static const bigint c_end = (bigint)1 << 256;
|
||||||
|
static const u256 c_send = (u256)1 << 255;
|
||||||
|
if (_u < c_send)
|
||||||
|
return (s256)_u;
|
||||||
|
else
|
||||||
|
return (s256)-(c_end - _u);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline u256 s2u(s256 _u)
|
||||||
|
{
|
||||||
|
static const bigint c_end = (bigint)1 << 256;
|
||||||
|
if (_u >= 0)
|
||||||
|
return (u256)_u;
|
||||||
|
else
|
||||||
|
return (u256)(c_end + _u);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -106,7 +129,6 @@ extern "C"
|
||||||
{
|
{
|
||||||
|
|
||||||
using namespace dev::eth::jit;
|
using namespace dev::eth::jit;
|
||||||
using s256 = boost::multiprecision::int256_t;
|
|
||||||
|
|
||||||
EXPORT void arith_mul(i256* _arg1, i256* _arg2, i256* o_result)
|
EXPORT void arith_mul(i256* _arg1, i256* _arg2, i256* o_result)
|
||||||
{
|
{
|
||||||
|
|
@ -133,14 +155,14 @@ extern "C"
|
||||||
{
|
{
|
||||||
auto arg1 = llvm2eth(*_arg1);
|
auto arg1 = llvm2eth(*_arg1);
|
||||||
auto arg2 = llvm2eth(*_arg2);
|
auto arg2 = llvm2eth(*_arg2);
|
||||||
*o_result = eth2llvm(arg2 == 0 ? arg2 : (arg1.convert_to<s256>() / arg2.convert_to<s256>()).convert_to<u256>());
|
*o_result = eth2llvm(arg2 == 0 ? arg2 : s2u(u2s(arg1) / u2s(arg2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT void arith_smod(i256* _arg1, i256* _arg2, i256* o_result)
|
EXPORT void arith_smod(i256* _arg1, i256* _arg2, i256* o_result)
|
||||||
{
|
{
|
||||||
auto arg1 = llvm2eth(*_arg1);
|
auto arg1 = llvm2eth(*_arg1);
|
||||||
auto arg2 = llvm2eth(*_arg2);
|
auto arg2 = llvm2eth(*_arg2);
|
||||||
*o_result = eth2llvm(arg2 == 0 ? arg2 : (arg1.convert_to<s256>() % arg2.convert_to<s256>()).convert_to<u256>());
|
*o_result = eth2llvm(arg2 == 0 ? arg2 : s2u(u2s(arg1) % u2s(arg2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT void arith_exp(i256* _arg1, i256* _arg2, i256* o_result)
|
EXPORT void arith_exp(i256* _arg1, i256* _arg2, i256* o_result)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue