Improve numeric from_u64
and shifting
This commit is contained in:
parent
81fbbd455f
commit
2a6033c6f4
@ -39,7 +39,7 @@ function Numeric.from_u64(value)
|
|||||||
if value < 0 then
|
if value < 0 then
|
||||||
return num_negate(from_u64(-value))
|
return num_negate(from_u64(-value))
|
||||||
else
|
else
|
||||||
return from_u32(value % BIT_SET_32, math_floor(value / BIT_SET_32))
|
return from_u32(bit_and(value), math_floor(value / BIT_SET_32))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -267,10 +267,11 @@ function Numeric.shift_left(lhs, rhs)
|
|||||||
local count = into_u64(rhs)
|
local count = into_u64(rhs)
|
||||||
|
|
||||||
if count < 32 then
|
if count < 32 then
|
||||||
|
local pad = 32 - count
|
||||||
local data_l_1, data_l_2 = into_u32(lhs)
|
local data_l_1, data_l_2 = into_u32(lhs)
|
||||||
|
|
||||||
local data_1 = bit_lshift(data_l_1, count)
|
local data_1 = bit_lshift(data_l_1, count)
|
||||||
local data_2 = bit_or(bit_lshift(data_l_2, count), bit_rshift(data_l_1, 32 - count))
|
local data_2 = bit_replace(bit_rshift(data_l_1, pad), data_l_2, count, pad)
|
||||||
|
|
||||||
return from_u32(data_1, data_2)
|
return from_u32(data_1, data_2)
|
||||||
elseif count == 32 then
|
elseif count == 32 then
|
||||||
@ -290,7 +291,7 @@ function Numeric.shift_right_unsigned(lhs, rhs)
|
|||||||
if count < 32 then
|
if count < 32 then
|
||||||
local data_l_1, data_l_2 = into_u32(lhs)
|
local data_l_1, data_l_2 = into_u32(lhs)
|
||||||
|
|
||||||
local data_1 = bit_or(bit_rshift(data_l_1, count), bit_lshift(data_l_2, 32 - count))
|
local data_1 = bit_replace(bit_rshift(data_l_1, count), data_l_2, 32 - count, count)
|
||||||
local data_2 = bit_rshift(data_l_2, count)
|
local data_2 = bit_rshift(data_l_2, count)
|
||||||
|
|
||||||
return from_u32(data_1, data_2)
|
return from_u32(data_1, data_2)
|
||||||
@ -311,7 +312,7 @@ function Numeric.shift_right_signed(lhs, rhs)
|
|||||||
if count < 32 then
|
if count < 32 then
|
||||||
local data_l_1, data_l_2 = into_u32(lhs)
|
local data_l_1, data_l_2 = into_u32(lhs)
|
||||||
|
|
||||||
local data_1 = bit_or(bit_rshift(data_l_1, count), bit_lshift(data_l_2, 32 - count))
|
local data_1 = bit_replace(bit_rshift(data_l_1, count), data_l_2, 32 - count, count)
|
||||||
local data_2 = bit_arshift(data_l_2, count)
|
local data_2 = bit_arshift(data_l_2, count)
|
||||||
|
|
||||||
return from_u32(data_1, data_2)
|
return from_u32(data_1, data_2)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user