1 /* go-type-float.c -- hash and equality float functions.
3 Copyright 2012 The Go Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style
5 license that can be found in the LICENSE file. */
10 /* The 32-bit and 64-bit types. */
12 typedef unsigned int SItype __attribute__ ((mode (SI)));
13 typedef unsigned int DItype __attribute__ ((mode (DI)));
15 /* Hash function for float types. */
18 __go_type_hash_float (const void *vkey, uintptr_t key_size)
30 __builtin_memcpy (uf.a, vkey, 4);
32 if (__builtin_isinff (f) || __builtin_isnanf (f) || f == 0)
34 return (uintptr_t) uf.si;
36 else if (key_size == 8)
46 __builtin_memcpy (ud.a, vkey, 8);
48 if (__builtin_isinf (d) || __builtin_isnan (d) || d == 0)
50 return (uintptr_t) ud.di;
53 runtime_throw ("__go_type_hash_float: invalid float size");
56 /* Equality function for float types. */
59 __go_type_equal_float (const void *vk1, const void *vk2, uintptr_t key_size)
71 __builtin_memcpy (uf.a, vk1, 4);
73 __builtin_memcpy (uf.a, vk2, 4);
77 else if (key_size == 8)
88 __builtin_memcpy (ud.a, vk1, 8);
90 __builtin_memcpy (ud.a, vk2, 8);
95 runtime_throw ("__go_type_equal_float: invalid float size");