Commit 2afc1e0b by Ian Lance Taylor

runtime: Return random number of hash of NaN.

From-SVN: r191632
parent a7a90456
...@@ -32,10 +32,14 @@ __go_type_hash_complex (const void *vkey, uintptr_t key_size) ...@@ -32,10 +32,14 @@ __go_type_hash_complex (const void *vkey, uintptr_t key_size)
cf = ucf.cf; cf = ucf.cf;
cfr = __builtin_crealf (cf); cfr = __builtin_crealf (cf);
cfi = __builtin_cimagf (cf); cfi = __builtin_cimagf (cf);
if (__builtin_isinff (cfr) || __builtin_isinff (cfi) if (__builtin_isinff (cfr) || __builtin_isinff (cfi))
|| __builtin_isnanf (cfr) || __builtin_isnanf (cfi))
return 0; return 0;
/* NaN != NaN, so the hash code of a NaN is irrelevant. Make it
random so that not all NaNs wind up in the same place. */
if (__builtin_isnanf (cfr) || __builtin_isnanf (cfi))
return runtime_fastrand1 ();
/* Avoid negative zero. */ /* Avoid negative zero. */
if (cfr == 0 && cfi == 0) if (cfr == 0 && cfi == 0)
return 0; return 0;
...@@ -62,10 +66,12 @@ __go_type_hash_complex (const void *vkey, uintptr_t key_size) ...@@ -62,10 +66,12 @@ __go_type_hash_complex (const void *vkey, uintptr_t key_size)
cd = ucd.cd; cd = ucd.cd;
cdr = __builtin_crealf (cd); cdr = __builtin_crealf (cd);
cdi = __builtin_cimagf (cd); cdi = __builtin_cimagf (cd);
if (__builtin_isinf (cdr) || __builtin_isinf (cdi) if (__builtin_isinf (cdr) || __builtin_isinf (cdi))
|| __builtin_isnan (cdr) || __builtin_isnan (cdi))
return 0; return 0;
if (__builtin_isnan (cdr) || __builtin_isnan (cdi))
return runtime_fastrand1 ();
/* Avoid negative zero. */ /* Avoid negative zero. */
if (cdr == 0 && cdi == 0) if (cdr == 0 && cdi == 0)
return 0; return 0;
......
...@@ -29,8 +29,14 @@ __go_type_hash_float (const void *vkey, uintptr_t key_size) ...@@ -29,8 +29,14 @@ __go_type_hash_float (const void *vkey, uintptr_t key_size)
__builtin_memcpy (uf.a, vkey, 4); __builtin_memcpy (uf.a, vkey, 4);
f = uf.f; f = uf.f;
if (__builtin_isinff (f) || __builtin_isnanf (f) || f == 0) if (__builtin_isinff (f) || f == 0)
return 0; return 0;
/* NaN != NaN, so the hash code of a NaN is irrelevant. Make it
random so that not all NaNs wind up in the same place. */
if (__builtin_isnanf (f))
return runtime_fastrand1 ();
return (uintptr_t) uf.si; return (uintptr_t) uf.si;
} }
else if (key_size == 8) else if (key_size == 8)
...@@ -45,8 +51,12 @@ __go_type_hash_float (const void *vkey, uintptr_t key_size) ...@@ -45,8 +51,12 @@ __go_type_hash_float (const void *vkey, uintptr_t key_size)
__builtin_memcpy (ud.a, vkey, 8); __builtin_memcpy (ud.a, vkey, 8);
d = ud.d; d = ud.d;
if (__builtin_isinf (d) || __builtin_isnan (d) || d == 0) if (__builtin_isinf (d) || d == 0)
return 0; return 0;
if (__builtin_isnan (d))
return runtime_fastrand1 ();
return (uintptr_t) ud.di; return (uintptr_t) ud.di;
} }
else else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment