allocate floats in dedicated buffer

This commit is contained in:
Mark Thom
2022-04-04 23:56:30 -06:00
parent 0ab928063e
commit 8c99d748e2
14 changed files with 204 additions and 195 deletions

View File

@@ -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);

View File

@@ -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)
}

View File

@@ -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(())
}

View File

@@ -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;
}

View File

@@ -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!(

View File

@@ -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]);
}