aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator
diff options
context:
space:
mode:
authorLukas Larsson <[email protected]>2012-08-24 12:06:20 +0200
committerLukas Larsson <[email protected]>2012-08-24 12:06:20 +0200
commit7bb7e63fbada714655f0860a2d1daacbdc0d4712 (patch)
treecb79a560f4a73095d7c3ff40efc3fc94b10c3cb1 /erts/emulator
parent0176b2a78f0257d88d9532803770eb0405beacb0 (diff)
parent0342137176c653c51cc3a78781888cfca8568650 (diff)
downloadotp-7bb7e63fbada714655f0860a2d1daacbdc0d4712.tar.gz
otp-7bb7e63fbada714655f0860a2d1daacbdc0d4712.tar.bz2
otp-7bb7e63fbada714655f0860a2d1daacbdc0d4712.zip
Merge branch 'maint'
* maint: Configure now assumed normal doubles Bumped version nr bumped revision make list_suffix/1 and list_prefix/1 handle erl_parse() cons sequences modernized and cleaned up edoc documentation removed obsolete @spec annotations and fixed some -spec and -type annotations preserve line numbers when reverting representation updated author e-mail removed CVS keywords from source files Revise the autoconf tests for double middle endianness. Add test for floating-point output to float_SUITE. Unbreak floating point on middle-endian machines. Add support for NULL value in odbc:param_query Conflicts: xcomp/README.md
Diffstat (limited to 'erts/emulator')
-rw-r--r--erts/emulator/beam/erl_bits.c10
-rw-r--r--erts/emulator/test/float_SUITE.erl9
2 files changed, 17 insertions, 2 deletions
diff --git a/erts/emulator/beam/erl_bits.c b/erts/emulator/beam/erl_bits.c
index 6f7309f493..b7c82935ff 100644
--- a/erts/emulator/beam/erl_bits.c
+++ b/erts/emulator/beam/erl_bits.c
@@ -1005,8 +1005,13 @@ erts_new_bs_put_float(Process *c_p, Eterm arg, Uint num_bits, int flags)
if (is_float(arg)) {
FloatDef *fdp = (FloatDef*)(float_val(arg) + 1);
+#ifdef DOUBLE_MIDDLE_ENDIAN
+ a = fdp->fw[1];
+ b = fdp->fw[0];
+#else
a = fdp->fw[0];
b = fdp->fw[1];
+#endif
} else if (is_small(arg)) {
u.f64 = (double) signed_val(arg);
a = u.i32[0];
@@ -1015,8 +1020,13 @@ erts_new_bs_put_float(Process *c_p, Eterm arg, Uint num_bits, int flags)
if (big_to_double(arg, &u.f64) < 0) {
return 0;
}
+#ifdef DOUBLE_MIDDLE_ENDIAN
+ a = u.i32[1];
+ b = u.i32[0];
+#else
a = u.i32[0];
b = u.i32[1];
+#endif
} else {
return 0;
}
diff --git a/erts/emulator/test/float_SUITE.erl b/erts/emulator/test/float_SUITE.erl
index 8e6923ce9f..abe01bf5ec 100644
--- a/erts/emulator/test/float_SUITE.erl
+++ b/erts/emulator/test/float_SUITE.erl
@@ -25,7 +25,7 @@
init_per_group/2,end_per_group/2,
init_per_testcase/2,end_per_testcase/2,
fpe/1,fp_drv/1,fp_drv_thread/1,denormalized/1,match/1,
- bad_float_unpack/1,cmp_zero/1, cmp_integer/1, cmp_bignum/1]).
+ bad_float_unpack/1, write/1, cmp_zero/1, cmp_integer/1, cmp_bignum/1]).
-export([otp_7178/1]).
-export([hidden_inf/1]).
@@ -42,7 +42,7 @@ suite() -> [{ct_hooks,[ts_install_cth]}].
all() ->
[fpe, fp_drv, fp_drv_thread, otp_7178, denormalized,
- match, bad_float_unpack, {group, comparison}
+ match, bad_float_unpack, write, {group, comparison}
,hidden_inf
].
@@ -190,6 +190,11 @@ bad_float_unpack(Config) when is_list(Config) ->
bad_float_unpack_match(<<F:64/float>>) -> F;
bad_float_unpack_match(<<I:64/integer-signed>>) -> I.
+%% Exposes endianness issues.
+
+write(Config) when is_list(Config) ->
+ "1.0" = io_lib:write(1.0).
+
cmp_zero(_Config) ->
cmp(0.5e-323,0).