mirror of git://gcc.gnu.org/git/gcc.git
runtime: Return random number of hash of NaN.
From-SVN: r191632
This commit is contained in:
parent
a7a9045662
commit
2afc1e0b30
|
|
@ -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)
|
||||||
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)
|
||||||
|
|
||||||
__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)
|
||||||
|
|
||||||
__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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue