aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/utils.c')
-rw-r--r--erts/emulator/beam/utils.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c
index ae62a7a708..8f6335d5dd 100644
--- a/erts/emulator/beam/utils.c
+++ b/erts/emulator/beam/utils.c
@@ -2920,16 +2920,16 @@ Sint cmp(Eterm a, Eterm b)
#if HALFWORD_HEAP
static Sint erts_cmp_compound_rel_opt(Eterm a, Eterm* a_base,
- Eterm b, Eterm* b_base,
- int exact, int eq_only);
+ Eterm b, Eterm* b_base,
+ int exact, int eq_only);
#else
static Sint erts_cmp_compound(Eterm a, Eterm b, int exact, int eq_only);
#endif
#if HALFWORD_HEAP
-Sint erts_cmp(Eterm a, Eterm* a_base,
- Eterm b, Eterm* b_base,
- int exact, int eq_only)
+Sint erts_cmp_rel_opt(Eterm a, Eterm* a_base,
+ Eterm b, Eterm* b_base,
+ int exact, int eq_only)
#else
Sint erts_cmp(Eterm a, Eterm b, int exact, int eq_only)
#endif
@@ -2938,9 +2938,14 @@ Sint erts_cmp(Eterm a, Eterm b, int exact, int eq_only)
return cmp_atoms(a, b);
} else if (is_both_small(a, b)) {
return (signed_val(a) - signed_val(b));
+ } else if (is_float_rel(a, a_base) && is_float_rel(b, b_base)) {
+ FloatDef af, bf;
+ GET_DOUBLE_REL(a, af, a_base);
+ GET_DOUBLE_REL(b, bf, b_base);
+ return float_comp(af.fd, bf.fd);
}
#if HALFWORD_HEAP
- return erts_cmp_compound(a,a_base,b,b_base,exact,eq_only);
+ return erts_cmp_compound_rel_opt(a,a_base,b,b_base,exact,eq_only);
#else
return erts_cmp_compound(a,b,exact,eq_only);
#endif
@@ -2952,8 +2957,9 @@ Sint erts_cmp(Eterm a, Eterm b, int exact, int eq_only)
* exact = 0 -> arith-based compare
*/
#if HALFWORD_HEAP
-static Sint erts_cmp_compound_rel_opt(Eterm a, Eterm* a_base, Eterm b, Eterm* b_base,
- int exact, int eq_only)
+static Sint erts_cmp_compound_rel_opt(Eterm a, Eterm* a_base,
+ Eterm b, Eterm* b_base,
+ int exact, int eq_only)
#else
static Sint erts_cmp_compound(Eterm a, Eterm b, int exact, int eq_only)
#endif