Replace load_d1 load_d2 with into_u32
This commit is contained in:
parent
b7cfd3d405
commit
895c028ae8
@ -48,21 +48,25 @@ local function load_d2(value)
|
|||||||
return bit_replace(bit_and(value.Y, 0x3FFFFF), bit_rshift(value.Z, 10), 22, 10)
|
return bit_replace(bit_and(value.Y, 0x3FFFFF), bit_rshift(value.Z, 10), 22, 10)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Numeric.into_u32(value)
|
local function into_u32(value)
|
||||||
return load_d1(value), load_d2(value)
|
return load_d1(value), load_d2(value)
|
||||||
end
|
end
|
||||||
|
Numeric.into_u32 = into_u32
|
||||||
|
|
||||||
function Numeric.from_u64(value)
|
function Numeric.from_u64(value)
|
||||||
return from_u32(bit_and(value % 0x100000000), bit_and(value / 0x100000000))
|
return from_u32(bit_and(value % 0x100000000), bit_and(value / 0x100000000))
|
||||||
end
|
end
|
||||||
|
|
||||||
function Numeric.into_u64(value)
|
function Numeric.into_u64(value)
|
||||||
return load_d1(value) + load_d2(value) * 0x100000000
|
local value_1, value_2 = into_u32(value)
|
||||||
|
return value_1 + value_2 * 0x100000000
|
||||||
end
|
end
|
||||||
|
|
||||||
function Numeric.add(lhs, rhs)
|
function Numeric.add(lhs, rhs)
|
||||||
local data_1 = load_d1(lhs) + load_d1(rhs)
|
local lhs_1, lhs_2 = into_u32(lhs)
|
||||||
local data_2 = load_d2(lhs) + load_d2(rhs)
|
local rhs_1, rhs_2 = into_u32(rhs)
|
||||||
|
local data_1 = lhs_1 + rhs_1
|
||||||
|
local data_2 = lhs_2 + rhs_2
|
||||||
|
|
||||||
if data_1 >= 0x100000000 then
|
if data_1 >= 0x100000000 then
|
||||||
data_1 = data_1 - 0x100000000
|
data_1 = data_1 - 0x100000000
|
||||||
@ -77,8 +81,10 @@ function Numeric.add(lhs, rhs)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function Numeric.subtract(lhs, rhs)
|
function Numeric.subtract(lhs, rhs)
|
||||||
local data_1 = load_d1(lhs) - load_d1(rhs)
|
local lhs_1, lhs_2 = into_u32(lhs)
|
||||||
local data_2 = load_d2(lhs) - load_d2(rhs)
|
local rhs_1, rhs_2 = into_u32(rhs)
|
||||||
|
local data_1 = lhs_1 - rhs_1
|
||||||
|
local data_2 = lhs_2 - rhs_2
|
||||||
|
|
||||||
if data_1 < 0 then
|
if data_1 < 0 then
|
||||||
data_1 = data_1 + 0x100000000
|
data_1 = data_1 + 0x100000000
|
||||||
@ -101,8 +107,8 @@ function Numeric.multiply(lhs, rhs)
|
|||||||
|
|
||||||
-- Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
|
-- Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
|
||||||
-- We can skip products that would overflow.
|
-- We can skip products that would overflow.
|
||||||
local lhs_1, lhs_2 = load_d1(lhs), load_d2(lhs)
|
local lhs_1, lhs_2 = into_u32(lhs)
|
||||||
local rhs_1, rhs_2 = load_d1(rhs), load_d2(rhs)
|
local rhs_1, rhs_2 = into_u32(rhs)
|
||||||
|
|
||||||
local a48 = bit_rshift(lhs_2, 16)
|
local a48 = bit_rshift(lhs_2, 16)
|
||||||
local a32 = bit_and(lhs_2, 0xFFFF)
|
local a32 = bit_and(lhs_2, 0xFFFF)
|
||||||
@ -161,11 +167,10 @@ function Numeric.divide_unsigned(lhs, rhs)
|
|||||||
local quotient = NUM_ZERO
|
local quotient = NUM_ZERO
|
||||||
local remainder = NUM_ZERO
|
local remainder = NUM_ZERO
|
||||||
|
|
||||||
local num_1, num_2 = load_d1(lhs), load_d2(lhs)
|
local num_1, num_2 = into_u32(lhs)
|
||||||
|
|
||||||
for i = 63, 0, -1 do
|
for i = 63, 0, -1 do
|
||||||
local temp = num_shift_left(remainder, NUM_ONE)
|
local rem_1, rem_2 = into_u32(num_shift_left(remainder, NUM_ONE))
|
||||||
local rem_1, rem_2 = load_d1(temp), load_d2(temp)
|
|
||||||
|
|
||||||
if i > 31 then
|
if i > 31 then
|
||||||
rem_1 = bit_or(rem_1, bit_extract(num_2, i - 32, 1))
|
rem_1 = bit_or(rem_1, bit_extract(num_2, i - 32, 1))
|
||||||
@ -214,8 +219,9 @@ function Numeric.divide_signed(lhs, rhs)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function Numeric.negate(value)
|
function Numeric.negate(value)
|
||||||
local data_1 = bit_not(load_d1(value)) + 1
|
local value_1, value_2 = into_u32(value)
|
||||||
local data_2 = bit_not(load_d2(value))
|
local data_1 = bit_not(value_1) + 1
|
||||||
|
local data_2 = bit_not(value_2)
|
||||||
|
|
||||||
if data_1 >= 0x100000000 then
|
if data_1 >= 0x100000000 then
|
||||||
data_1 = data_1 - 0x100000000
|
data_1 = data_1 - 0x100000000
|
||||||
@ -268,7 +274,7 @@ function Numeric.shift_left(lhs, rhs)
|
|||||||
return lhs
|
return lhs
|
||||||
elseif count < 32 then
|
elseif count < 32 then
|
||||||
local pad = 32 - count
|
local pad = 32 - count
|
||||||
local lhs_1, lhs_2 = load_d1(lhs), load_d2(lhs)
|
local lhs_1, lhs_2 = into_u32(lhs)
|
||||||
|
|
||||||
local data_1 = bit_lshift(lhs_1, count)
|
local data_1 = bit_lshift(lhs_1, count)
|
||||||
local data_2 = bit_replace(bit_rshift(lhs_1, pad), lhs_2, count, pad)
|
local data_2 = bit_replace(bit_rshift(lhs_1, pad), lhs_2, count, pad)
|
||||||
@ -287,7 +293,7 @@ function Numeric.shift_right_unsigned(lhs, rhs)
|
|||||||
if count == 0 then
|
if count == 0 then
|
||||||
return lhs
|
return lhs
|
||||||
elseif count < 32 then
|
elseif count < 32 then
|
||||||
local lhs_1, lhs_2 = load_d1(lhs), load_d2(lhs)
|
local lhs_1, lhs_2 = into_u32(lhs)
|
||||||
|
|
||||||
local data_1 = bit_replace(bit_rshift(lhs_1, count), lhs_2, 32 - count, count)
|
local data_1 = bit_replace(bit_rshift(lhs_1, count), lhs_2, 32 - count, count)
|
||||||
local data_2 = bit_rshift(lhs_2, count)
|
local data_2 = bit_rshift(lhs_2, count)
|
||||||
@ -306,7 +312,7 @@ function Numeric.shift_right_signed(lhs, rhs)
|
|||||||
if count == 0 then
|
if count == 0 then
|
||||||
return lhs
|
return lhs
|
||||||
elseif count < 32 then
|
elseif count < 32 then
|
||||||
local lhs_1, lhs_2 = load_d1(lhs), load_d2(lhs)
|
local lhs_1, lhs_2 = into_u32(lhs)
|
||||||
|
|
||||||
local data_1 = bit_replace(bit_rshift(lhs_1, count), lhs_2, 32 - count, count)
|
local data_1 = bit_replace(bit_rshift(lhs_1, count), lhs_2, 32 - count, count)
|
||||||
local data_2 = bit_arshift(lhs_2, count)
|
local data_2 = bit_arshift(lhs_2, count)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user