allocate floats in dedicated buffer
This commit is contained in:
@@ -281,8 +281,8 @@ pub(crate) fn div(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
|
||||
}
|
||||
|
||||
pub(crate) fn float_pow(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
|
||||
let f1 = result_f(&n1, rnd_f);
|
||||
let f2 = result_f(&n2, rnd_f);
|
||||
let f1 = result_f(&n1);
|
||||
let f2 = result_f(&n2);
|
||||
|
||||
let stub_gen = || {
|
||||
let pow_atom = atom!("**");
|
||||
@@ -292,7 +292,7 @@ pub(crate) fn float_pow(n1: Number, n2: Number) -> Result<Number, MachineStubGen
|
||||
let f1 = try_numeric_result!(f1, stub_gen)?;
|
||||
let f2 = try_numeric_result!(f2, stub_gen)?;
|
||||
|
||||
let result = result_f(&Number::Float(OrderedFloat(f1.powf(f2))), rnd_f);
|
||||
let result = result_f(&Number::Float(OrderedFloat(f1.powf(f2))));
|
||||
|
||||
Ok(Number::Float(OrderedFloat(try_numeric_result!(
|
||||
result, stub_gen
|
||||
@@ -404,7 +404,7 @@ pub(crate) fn float(n: Number) -> Result<f64, MachineStubGen> {
|
||||
functor_stub(is_atom, 2)
|
||||
};
|
||||
|
||||
try_numeric_result!(result_f(&n, rnd_f), stub_gen)
|
||||
try_numeric_result!(result_f(&n), stub_gen)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -420,8 +420,8 @@ where
|
||||
functor_stub(is_atom, 2)
|
||||
};
|
||||
|
||||
let f1 = try_numeric_result!(result_f(&n1, rnd_f), stub_gen)?;
|
||||
let f1 = result_f(&Number::Float(OrderedFloat(f(f1))), rnd_f);
|
||||
let f1 = try_numeric_result!(result_f(&n1), stub_gen)?;
|
||||
let f1 = result_f(&Number::Float(OrderedFloat(f(f1))));
|
||||
|
||||
try_numeric_result!(f1, stub_gen)
|
||||
}
|
||||
@@ -462,8 +462,8 @@ pub(crate) fn max(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
|
||||
functor_stub(max_atom, 2)
|
||||
};
|
||||
|
||||
let f1 = try_numeric_result!(result_f(&n1, rnd_f), stub_gen)?;
|
||||
let f2 = try_numeric_result!(result_f(&n2, rnd_f), stub_gen)?;
|
||||
let f1 = try_numeric_result!(result_f(&n1), stub_gen)?;
|
||||
let f2 = try_numeric_result!(result_f(&n2), stub_gen)?;
|
||||
|
||||
Ok(Number::Float(cmp::max(OrderedFloat(f1), OrderedFloat(f2))))
|
||||
}
|
||||
@@ -506,8 +506,8 @@ pub(crate) fn min(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
|
||||
functor_stub(min_atom, 2)
|
||||
};
|
||||
|
||||
let f1 = try_numeric_result!(result_f(&n1, rnd_f), stub_gen)?;
|
||||
let f2 = try_numeric_result!(result_f(&n2, rnd_f), stub_gen)?;
|
||||
let f1 = try_numeric_result!(result_f(&n1), stub_gen)?;
|
||||
let f2 = try_numeric_result!(result_f(&n2), stub_gen)?;
|
||||
|
||||
Ok(Number::Float(cmp::min(OrderedFloat(f1), OrderedFloat(f2))))
|
||||
}
|
||||
@@ -1314,7 +1314,7 @@ impl MachineState {
|
||||
self.interms.push(Number::Fixnum(n));
|
||||
}
|
||||
(HeapCellValueTag::F64, fl) => {
|
||||
self.interms.push(Number::Float(**fl));
|
||||
self.interms.push(Number::Float(*fl));
|
||||
}
|
||||
(HeapCellValueTag::Cons, ptr) => {
|
||||
match_untyped_arena_ptr!(ptr,
|
||||
@@ -1324,9 +1324,6 @@ impl MachineState {
|
||||
(ArenaHeaderTag::Rational, r) => {
|
||||
self.interms.push(Number::Rational(r));
|
||||
}
|
||||
(ArenaHeaderTag::F64, fl) => {
|
||||
self.interms.push(Number::Float(*fl));
|
||||
}
|
||||
_ => {
|
||||
std::mem::drop(iter);
|
||||
|
||||
|
||||
@@ -163,8 +163,7 @@ impl MachineState {
|
||||
match self.get_number(&at)? {
|
||||
Number::Fixnum(n) => self.unify_fixnum(n, n1),
|
||||
Number::Float(n) => {
|
||||
// TODO: argghh.. allocate floats to their own area.
|
||||
let n = arena_alloc!(n, &mut self.arena);
|
||||
let n = float_alloc!(n.into_inner(), self.arena);
|
||||
self.unify_f64(n, n1)
|
||||
}
|
||||
Number::Integer(n) => self.unify_big_int(n, n1),
|
||||
@@ -366,8 +365,7 @@ impl Machine {
|
||||
}
|
||||
(HeapCellValueTag::Cons, ptr) => {
|
||||
match ptr.get_tag() {
|
||||
ArenaHeaderTag::Rational | ArenaHeaderTag::Integer |
|
||||
ArenaHeaderTag::F64 => {
|
||||
ArenaHeaderTag::Rational | ArenaHeaderTag::Integer => {
|
||||
c
|
||||
}
|
||||
_ => {
|
||||
@@ -428,9 +426,6 @@ impl Machine {
|
||||
(ArenaHeaderTag::Rational, r) => {
|
||||
Literal::Rational(r)
|
||||
}
|
||||
(ArenaHeaderTag::F64, f) => {
|
||||
Literal::Float(F64Ptr(f))
|
||||
}
|
||||
(ArenaHeaderTag::Integer, n) => {
|
||||
Literal::Integer(n)
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ use crate::machine::partial_string::*;
|
||||
use crate::parser::ast::*;
|
||||
use crate::types::*;
|
||||
|
||||
use ordered_float::OrderedFloat;
|
||||
use rug::{Integer, Rational};
|
||||
|
||||
use std::convert::TryFrom;
|
||||
@@ -66,10 +65,6 @@ impl TryFrom<HeapCellValue> for Literal {
|
||||
(ArenaHeaderTag::Rational, n) => {
|
||||
Ok(Literal::Rational(n))
|
||||
}
|
||||
(ArenaHeaderTag::F64, f) => {
|
||||
// remove this redundancy.
|
||||
Ok(Literal::Float(F64Ptr(f)))
|
||||
}
|
||||
_ => {
|
||||
Err(())
|
||||
}
|
||||
|
||||
@@ -14,8 +14,6 @@ use crate::machine::stack::*;
|
||||
use crate::parser::ast::*;
|
||||
use crate::parser::rug::{Integer, Rational};
|
||||
|
||||
use ordered_float::*;
|
||||
|
||||
use indexmap::IndexSet;
|
||||
|
||||
use std::cmp::Ordering;
|
||||
@@ -673,7 +671,7 @@ impl MachineState {
|
||||
|
||||
pub fn unify_f64(&mut self, f1: F64Ptr, value: HeapCellValue) {
|
||||
if let Some(r) = value.as_var() {
|
||||
self.bind(r, typed_arena_ptr_as_cell!(f1));
|
||||
self.bind(r, HeapCellValue::from(f1));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -681,16 +679,6 @@ impl MachineState {
|
||||
(HeapCellValueTag::F64, f2) => {
|
||||
self.fail = **f1 != **f2;
|
||||
}
|
||||
(HeapCellValueTag::Cons, cons_ptr) => {
|
||||
match_untyped_arena_ptr!(cons_ptr,
|
||||
(ArenaHeaderTag::F64, f2) => {
|
||||
self.fail = **f1 != **F64Ptr(f2);
|
||||
}
|
||||
_ => {
|
||||
self.fail = true;
|
||||
}
|
||||
);
|
||||
}
|
||||
_ => {
|
||||
self.fail = true;
|
||||
}
|
||||
|
||||
@@ -609,7 +609,6 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_term_compare() {
|
||||
use ordered_float::OrderedFloat;
|
||||
use std::cmp::Ordering;
|
||||
|
||||
let mut wam = MachineState::new();
|
||||
@@ -777,9 +776,7 @@ mod tests {
|
||||
Some(Ordering::Greater)
|
||||
);
|
||||
|
||||
let one_p_one = typed_arena_ptr_as_cell!(
|
||||
arena_alloc!(OrderedFloat(1.1), &mut wam.arena)
|
||||
);
|
||||
let one_p_one = HeapCellValue::from(float_alloc!(1.1, &mut wam.arena));
|
||||
|
||||
assert_eq!(
|
||||
compare_term_test!(
|
||||
|
||||
@@ -3232,7 +3232,7 @@ impl Machine {
|
||||
#[inline(always)]
|
||||
pub(crate) fn cpu_now(&mut self) {
|
||||
let secs = ProcessTime::now().as_duration().as_secs_f64();
|
||||
let secs = arena_alloc!(OrderedFloat(secs), &mut self.machine_st.arena);
|
||||
let secs = float_alloc!(secs, self.machine_st.arena);
|
||||
|
||||
self.machine_st.unify_f64(secs, self.machine_st.registers[1]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user