Add i64
remainder operation
This commit is contained in:
parent
d351920a51
commit
971ac382a5
@ -69,22 +69,6 @@ function Numeric.subtract(lhs, rhs)
|
|||||||
return from_u32(data_1, data_2)
|
return from_u32(data_1, data_2)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function set_absolute(lhs, rhs)
|
|
||||||
local has_negative = false
|
|
||||||
|
|
||||||
if num_is_negative(lhs) then
|
|
||||||
lhs = num_negate(lhs)
|
|
||||||
has_negative = not has_negative
|
|
||||||
end
|
|
||||||
|
|
||||||
if num_is_negative(rhs) then
|
|
||||||
rhs = num_negate(rhs)
|
|
||||||
has_negative = not has_negative
|
|
||||||
end
|
|
||||||
|
|
||||||
return has_negative, lhs, rhs
|
|
||||||
end
|
|
||||||
|
|
||||||
function Numeric.multiply(lhs, rhs)
|
function Numeric.multiply(lhs, rhs)
|
||||||
if num_is_zero(lhs) or num_is_zero(rhs) then
|
if num_is_zero(lhs) or num_is_zero(rhs) then
|
||||||
return NUM_ZERO
|
return NUM_ZERO
|
||||||
@ -140,9 +124,12 @@ function Numeric.divide_unsigned(lhs, rhs)
|
|||||||
if num_is_zero(rhs) then
|
if num_is_zero(rhs) then
|
||||||
error("division by zero")
|
error("division by zero")
|
||||||
elseif num_is_zero(lhs) then
|
elseif num_is_zero(lhs) then
|
||||||
return NUM_ZERO
|
return NUM_ZERO, NUM_ZERO
|
||||||
elseif num_is_less_unsigned(lhs, NUM_BIT_52) and num_is_less_unsigned(rhs, NUM_BIT_52) then
|
elseif num_is_less_unsigned(lhs, NUM_BIT_52) and num_is_less_unsigned(rhs, NUM_BIT_52) then
|
||||||
return from_u64(into_u64(lhs) / into_u64(rhs))
|
local lhs_u = into_u64(lhs)
|
||||||
|
local rhs_u = into_u64(rhs)
|
||||||
|
|
||||||
|
return from_u64(lhs_u / rhs_u), from_u64(lhs_u % rhs_u)
|
||||||
end
|
end
|
||||||
|
|
||||||
local quotient = NUM_ZERO
|
local quotient = NUM_ZERO
|
||||||
@ -170,17 +157,28 @@ function Numeric.divide_unsigned(lhs, rhs)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function Numeric.divide_signed(lhs, rhs)
|
function Numeric.divide_signed(lhs, rhs)
|
||||||
local has_negative
|
local left_negative = num_is_negative(lhs)
|
||||||
|
local right_negative = num_is_negative(rhs)
|
||||||
|
|
||||||
has_negative, lhs, rhs = set_absolute(lhs, rhs)
|
if left_negative then
|
||||||
|
lhs = num_negate(lhs)
|
||||||
local result = num_divide_unsigned(lhs, rhs)
|
|
||||||
|
|
||||||
if has_negative then
|
|
||||||
result = num_negate(result)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
return result
|
if right_negative then
|
||||||
|
rhs = num_negate(rhs)
|
||||||
|
end
|
||||||
|
|
||||||
|
local quotient, remainder = num_divide_unsigned(lhs, rhs)
|
||||||
|
|
||||||
|
if left_negative ~= right_negative then
|
||||||
|
quotient = num_negate(quotient)
|
||||||
|
end
|
||||||
|
|
||||||
|
if left_negative then
|
||||||
|
remainder = num_negate(remainder)
|
||||||
|
end
|
||||||
|
|
||||||
|
return quotient, remainder
|
||||||
end
|
end
|
||||||
|
|
||||||
function Numeric.negate(value)
|
function Numeric.negate(value)
|
||||||
|
@ -85,22 +85,6 @@ function Numeric.subtract(lhs, rhs)
|
|||||||
return from_u32(data_1, data_2)
|
return from_u32(data_1, data_2)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function set_absolute(lhs, rhs)
|
|
||||||
local has_negative = false
|
|
||||||
|
|
||||||
if num_is_negative(lhs) then
|
|
||||||
lhs = num_negate(lhs)
|
|
||||||
has_negative = not has_negative
|
|
||||||
end
|
|
||||||
|
|
||||||
if num_is_negative(rhs) then
|
|
||||||
rhs = num_negate(rhs)
|
|
||||||
has_negative = not has_negative
|
|
||||||
end
|
|
||||||
|
|
||||||
return has_negative, lhs, rhs
|
|
||||||
end
|
|
||||||
|
|
||||||
function Numeric.multiply(lhs, rhs)
|
function Numeric.multiply(lhs, rhs)
|
||||||
if num_is_zero(lhs) or num_is_zero(rhs) then
|
if num_is_zero(lhs) or num_is_zero(rhs) then
|
||||||
return NUM_ZERO
|
return NUM_ZERO
|
||||||
@ -159,9 +143,12 @@ function Numeric.divide_unsigned(lhs, rhs)
|
|||||||
if num_is_zero(rhs) then
|
if num_is_zero(rhs) then
|
||||||
error("division by zero")
|
error("division by zero")
|
||||||
elseif num_is_zero(lhs) then
|
elseif num_is_zero(lhs) then
|
||||||
return NUM_ZERO
|
return NUM_ZERO, NUM_ZERO
|
||||||
elseif num_is_less_unsigned(lhs, NUM_BIT_52) and num_is_less_unsigned(rhs, NUM_BIT_52) then
|
elseif num_is_less_unsigned(lhs, NUM_BIT_52) and num_is_less_unsigned(rhs, NUM_BIT_52) then
|
||||||
return from_u64(into_u64(lhs) / into_u64(rhs))
|
local lhs_u = into_u64(lhs)
|
||||||
|
local rhs_u = into_u64(rhs)
|
||||||
|
|
||||||
|
return from_u64(lhs_u / rhs_u), from_u64(lhs_u % rhs_u)
|
||||||
end
|
end
|
||||||
|
|
||||||
local quotient = NUM_ZERO
|
local quotient = NUM_ZERO
|
||||||
@ -191,17 +178,28 @@ function Numeric.divide_unsigned(lhs, rhs)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function Numeric.divide_signed(lhs, rhs)
|
function Numeric.divide_signed(lhs, rhs)
|
||||||
local has_negative
|
local left_negative = num_is_negative(lhs)
|
||||||
|
local right_negative = num_is_negative(rhs)
|
||||||
|
|
||||||
has_negative, lhs, rhs = set_absolute(lhs, rhs)
|
if left_negative then
|
||||||
|
lhs = num_negate(lhs)
|
||||||
local result = num_divide_unsigned(lhs, rhs)
|
|
||||||
|
|
||||||
if has_negative then
|
|
||||||
result = num_negate(result)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
return result
|
if right_negative then
|
||||||
|
rhs = num_negate(rhs)
|
||||||
|
end
|
||||||
|
|
||||||
|
local quotient, remainder = num_divide_unsigned(lhs, rhs)
|
||||||
|
|
||||||
|
if left_negative ~= right_negative then
|
||||||
|
quotient = num_negate(quotient)
|
||||||
|
end
|
||||||
|
|
||||||
|
if left_negative then
|
||||||
|
remainder = num_negate(remainder)
|
||||||
|
end
|
||||||
|
|
||||||
|
return quotient, remainder
|
||||||
end
|
end
|
||||||
|
|
||||||
function Numeric.negate(value)
|
function Numeric.negate(value)
|
||||||
|
@ -40,7 +40,6 @@ do
|
|||||||
|
|
||||||
local math_abs = math.abs
|
local math_abs = math.abs
|
||||||
local math_fmod = math.fmod
|
local math_fmod = math.fmod
|
||||||
local math_floor = math.floor
|
|
||||||
local math_round = math.round
|
local math_round = math.round
|
||||||
local math_sign = math.sign
|
local math_sign = math.sign
|
||||||
local math_min = math.min
|
local math_min = math.min
|
||||||
@ -49,6 +48,9 @@ do
|
|||||||
local string_byte = string.byte
|
local string_byte = string.byte
|
||||||
local string_pack = string.pack
|
local string_pack = string.pack
|
||||||
|
|
||||||
|
local num_divide_signed = Integer.divide_signed
|
||||||
|
local num_divide_unsigned = Integer.divide_unsigned
|
||||||
|
|
||||||
function add.i32(lhs, rhs)
|
function add.i32(lhs, rhs)
|
||||||
return to_u32(lhs + rhs)
|
return to_u32(lhs + rhs)
|
||||||
end
|
end
|
||||||
@ -100,8 +102,21 @@ do
|
|||||||
add.i64 = Integer.add
|
add.i64 = Integer.add
|
||||||
sub.i64 = Integer.subtract
|
sub.i64 = Integer.subtract
|
||||||
mul.i64 = Integer.multiply
|
mul.i64 = Integer.multiply
|
||||||
div.i64 = Integer.divide_signed
|
div.i64 = num_divide_signed
|
||||||
div.u64 = Integer.divide_unsigned
|
|
||||||
|
function rem.i64(lhs, rhs)
|
||||||
|
local _, remainder = num_divide_signed(lhs, rhs)
|
||||||
|
|
||||||
|
return remainder
|
||||||
|
end
|
||||||
|
|
||||||
|
div.u64 = num_divide_unsigned
|
||||||
|
|
||||||
|
function rem.u64(lhs, rhs)
|
||||||
|
local _, remainder = num_divide_unsigned(lhs, rhs)
|
||||||
|
|
||||||
|
return remainder
|
||||||
|
end
|
||||||
|
|
||||||
function neg.f32(num)
|
function neg.f32(num)
|
||||||
return -num
|
return -num
|
||||||
|
Loading…
x
Reference in New Issue
Block a user