mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-28 15:54:18 +00:00
Branches: main Support unboxed float fields in high-level C grades. When the representation of `float' is no wider than a machine word, d.u. functor arguments of type `float' (or equivalent) will be stored directly within cells constructed for that functor, instead of a pointer to the box containing the value. This was already so for low-level C grades. compiler/mlds.m: Add an option to mlds_type, equivalent to `mlds_array_type(mlds_generic_type)' except that some elements are known to be floats. Update some comments. compiler/ml_global_data.m: Remember the `--unboxed-float' option in `ml_global_data'. Special case generic arrays in `ml_gen_static_scalar_const_addr' and `ml_gen_static_scalar_const_value'. Float literals cannot be used to initialize an element of a generic array in C. If any appear, replace the generic array type by an instance of `mlds_mostly_generic_array_type' with float fields in the positions which have float initializers. compiler/ml_code_util.m: Make `ml_must_box_field_type' and `ml_gen_box_const_rval' depend on the `--unboxed-float' option. Delete some now-misleading comments. Delete an unused predicate. compiler/mlds_to_c.m: Update code that writes out scalar static data to handle `mlds_mostly_generic_array_type'. In one case, for `--high-level-data' only, output float constants by their integer representation, so that they may be cast to pointer types. compiler/ml_unify_gen.m: Rename some predicates for clarity. compiler/ml_accurate_gc.m: compiler/ml_lookup_switch.m: compiler/ml_proc_gen.m: compiler/ml_simplify_switch.m: compiler/mlds_to_cs.m: compiler/mlds_to_gcc.m: compiler/mlds_to_il.m: compiler/mlds_to_java.m: Conform to changes. library/float.m: Add hidden functions to return the integer representation of the bit layout of floating point values. library/exception.m: Delete mention of MR_AVOID_MACROS. runtime/mercury.c: runtime/mercury.h: Make MR_box_float/MR_unbox_float act like "casts" when MR_BOXED_FLOAT is undefined, and only define them in high-level grades. I think they should be replaced by MR_float_to_word/MR_word_to_float (which have less confusing names when there is no boxing) but that would require some header file reshuffling which I don't want to undertake yet. Delete references to MR_AVOID_MACROS. Apparently it existed to support the defunct gcc back-end but I cannot see it ever being defined. runtime/mercury_conf_param.h: MR_HIGHLEVEL_CODE no longer implies MR_BOXED_FLOAT. Delete mention of MR_AVOID_MACROS. runtime/mercury_float.h: Fix a comment. tests/hard_coded/Mmakefile: tests/hard_coded/float_ground_term.exp: tests/hard_coded/float_ground_term.m: Add a test case.
52 lines
1.4 KiB
Mathematica
52 lines
1.4 KiB
Mathematica
%-----------------------------------------------------------------------------%
|
|
|
|
:- module float_ground_term.
|
|
:- interface.
|
|
|
|
:- import_module io.
|
|
|
|
:- pred main(io::di, io::uo) is det.
|
|
|
|
%-----------------------------------------------------------------------------%
|
|
%-----------------------------------------------------------------------------%
|
|
|
|
:- implementation.
|
|
|
|
:- import_module list.
|
|
|
|
:- type mono
|
|
---> mono(float).
|
|
|
|
:- type list_of_mono
|
|
---> []
|
|
; [mono | list_of_mono].
|
|
|
|
:- type poly(T)
|
|
---> poly(T).
|
|
|
|
main(!IO) :-
|
|
T1 = [
|
|
mono(1.1), mono(1.1), mono(1.1), mono(1.1), mono(1.1),
|
|
mono(1.1), mono(1.1), mono(1.1), mono(1.1), mono(1.1),
|
|
mono(1.1), mono(1.1), mono(1.1), mono(1.1), mono(1.1)
|
|
] : list(mono),
|
|
T2 = [
|
|
mono(2.2), mono(2.2), mono(2.2), mono(2.2), mono(2.2),
|
|
mono(2.2), mono(2.2), mono(2.2), mono(2.2), mono(2.2),
|
|
mono(2.2), mono(2.2), mono(2.2), mono(2.2), mono(2.2)
|
|
] : list_of_mono,
|
|
T3 =[
|
|
poly(3.3), poly(3.3), poly(3.3), poly(3.3), poly(3.3),
|
|
poly(3.3), poly(3.3), poly(3.3), poly(3.3), poly(3.3),
|
|
poly(3.3), poly(3.3), poly(3.3), poly(3.3), poly(3.3)
|
|
],
|
|
io.write(T1, !IO),
|
|
io.nl(!IO),
|
|
io.write(T2, !IO),
|
|
io.nl(!IO),
|
|
io.write(T3, !IO),
|
|
io.nl(!IO).
|
|
|
|
%-----------------------------------------------------------------------------%
|
|
% vim: ft=mercury ts=4 sts=4 sw=4 et
|