diff options
author | Johannes Weißl <[email protected]> | 2013-06-14 15:23:59 +0200 |
---|---|---|
committer | Johannes Weißl <[email protected]> | 2013-06-14 15:25:12 +0200 |
commit | 5adbd7d22bccc57e17ed00cac09fe8a336bb39c7 (patch) | |
tree | bd7bd69c78661b96840b97e9b03febfb9e555325 /erts/emulator/beam/erl_bits.c | |
parent | 29465408c90b2271b68e9559b5482fc6c4fcdde5 (diff) | |
download | otp-5adbd7d22bccc57e17ed00cac09fe8a336bb39c7.tar.gz otp-5adbd7d22bccc57e17ed00cac09fe8a336bb39c7.tar.bz2 otp-5adbd7d22bccc57e17ed00cac09fe8a336bb39c7.zip |
Fix binary matching on floating point middle-endian machines
This complements 933e701 (OTP-10209). Without this patch the test case
"bs_match_misc_SUITE:t_float/1" fails.
Simple error example:
1> <<_,_,_,_,_,_,_,_>> = <<1.25/float>>.
<<63,244,0,0,0,0,0,0>>
2> <<1.25/float>> = <<63,244,0,0,0,0,0,0>>.
** exception error: no match of right hand side value <<63,244,0,0,0,0,0,0>>
The additional test case is added because in a former version of this
patch the ERTS_FP_ERROR_THOROUGH check for NaN/infinity was mistakenly
applied on the still word-switched double.
Diffstat (limited to 'erts/emulator/beam/erl_bits.c')
-rw-r--r-- | erts/emulator/beam/erl_bits.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_bits.c b/erts/emulator/beam/erl_bits.c index 3753b618e1..06d53efb5e 100644 --- a/erts/emulator/beam/erl_bits.c +++ b/erts/emulator/beam/erl_bits.c @@ -484,8 +484,16 @@ erts_bs_get_float_2(Process *p, Uint num_bits, unsigned flags, ErlBinMatchBuffer ERTS_FP_ERROR_THOROUGH(p, f32, return THE_NON_VALUE); f.fd = f32; } else { +#ifdef DOUBLE_MIDDLE_ENDIAN + FloatDef ftmp; + ftmp.fd = f64; + f.fw[0] = ftmp.fw[1]; + f.fw[1] = ftmp.fw[0]; + ERTS_FP_ERROR_THOROUGH(p, f.fd, return THE_NON_VALUE); +#else ERTS_FP_ERROR_THOROUGH(p, f64, return THE_NON_VALUE); f.fd = f64; +#endif } mb->offset += num_bits; hp = HeapOnlyAlloc(p, FLOAT_SIZE_OBJECT); |