diff --git a/src/c/ffi.d b/src/c/ffi.d index 8174977a6..05b0a2fd6 100644 --- a/src/c/ffi.d +++ b/src/c/ffi.d @@ -491,9 +491,9 @@ ecl_foreign_data_ref_elt(void *p, enum ecl_ffi_tag tag) case ECL_FFI_OBJECT: return *(cl_object *)p; case ECL_FFI_FLOAT: - return ecl_make_single_float(*(float *)p); + return ecl_make_single_float_unchecked(*(float *)p); case ECL_FFI_DOUBLE: - return ecl_make_double_float(*(double *)p); + return ecl_make_double_float_unchecked(*(double *)p); case ECL_FFI_VOID: return ECL_NIL; default: diff --git a/src/c/number.d b/src/c/number.d index 32c651d74..212d11208 100644 --- a/src/c/number.d +++ b/src/c/number.d @@ -526,6 +526,59 @@ ecl_make_long_float(long double f) } #endif +cl_object +ecl_make_single_float_unchecked(float f) +{ + cl_object x; + + if (f == (float)0.0) { +#if defined(ECL_SIGNED_ZERO) + if (signbit(f)) + return cl_core.singlefloat_minus_zero; +#endif + return cl_core.singlefloat_zero; + } + x = ecl_alloc_object(t_singlefloat); + ecl_single_float(x) = f; + return(x); +} + +cl_object +ecl_make_double_float_unchecked(double f) +{ + cl_object x; + + if (f == (double)0.0) { +#if defined(ECL_SIGNED_ZERO) + if (signbit(f)) + return cl_core.doublefloat_minus_zero; +#endif + return cl_core.doublefloat_zero; + } + x = ecl_alloc_object(t_doublefloat); + ecl_double_float(x) = f; + return(x); +} + +#ifdef ECL_LONG_FLOAT +cl_object +ecl_make_long_float_unchecked(long double f) +{ + cl_object x; + + if (f == (long double)0.0) { +#if defined(ECL_SIGNED_ZERO) + if (signbit(f)) + return cl_core.longfloat_minus_zero; +#endif + return cl_core.longfloat_zero; + } + x = ecl_alloc_object(t_longfloat); + x->longfloat.value = f; + return x; +} +#endif + cl_object ecl_make_complex(cl_object r, cl_object i) { diff --git a/src/cmp/cmpc-machine.lsp b/src/cmp/cmpc-machine.lsp index 7f5b70249..7bafa6445 100644 --- a/src/cmp/cmpc-machine.lsp +++ b/src/cmp/cmpc-machine.lsp @@ -31,9 +31,9 @@ (:cl-index integer "cl_index" "ecl_make_unsigned_integer" "ecl_to_cl_index" "ecl_fixnum") (:long-long integer "ecl_long_long_t" "ecl_make_long_long" "ecl_to_long_long" "ecl_to_long_long") (:unsigned-long-long integer "ecl_ulong_long_t" "ecl_make_ulong_long" "ecl_to_ulong_long" "ecl_to_ulong_long") - (:float single-float "float" "ecl_make_single_float" "ecl_to_float" "ecl_single_float") - (:double double-float "double" "ecl_make_double_float" "ecl_to_double" "ecl_double_float") - (:long-double long-float "long double" "ecl_make_long_float" "ecl_to_long_double" "ecl_long_float") + (:float single-float "float" "ecl_make_single_float_unchecked" "ecl_to_float" "ecl_single_float") + (:double double-float "double" "ecl_make_double_float_unchecked" "ecl_to_double" "ecl_double_float") + (:long-double long-float "long double" "ecl_make_long_float_unchecked" "ecl_to_long_double" "ecl_long_float") (:unsigned-char base-char "unsigned char" "CODE_CHAR" "ecl_base_char_code" "CHAR_CODE") (:char base-char "char" "CODE_CHAR" "ecl_base_char_code" "CHAR_CODE") (:wchar character "ecl_character" "CODE_CHAR" "ecl_char_code" "CHAR_CODE") diff --git a/src/cmp/cmptop.lsp b/src/cmp/cmptop.lsp index 74b1243cf..a4fd10bd2 100644 --- a/src/cmp/cmptop.lsp +++ b/src/cmp/cmptop.lsp @@ -478,10 +478,10 @@ (wt-nl "return " (case return-type (FIXNUM "ecl_make_fixnum") (CHARACTER "CODE_CHAR") - (DOUBLE-FLOAT "ecl_make_double_float") - (SINGLE-FLOAT "ecl_make_single_float") + (DOUBLE-FLOAT "ecl_make_double_float_unchecked") + (SINGLE-FLOAT "ecl_make_single_float_unchecked") #+long-float - (LONG-FLOAT "ecl_make_long_float") + (LONG-FLOAT "ecl_make_long_float_unchecked") (otherwise "")) "(LI" cfun "(") (do ((types arg-types (cdr types))