mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-13 14:51:26 -07:00
Change hashing rules for float-like types to make 0 == -0
This commit is contained in:
@@ -2774,6 +2774,21 @@ gb_internal void add_map_key_type_dependencies(CheckerContext *ctx, Type *key) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (key->kind == Type_Basic) {
|
||||
if (key->Basic.flags & BasicFlag_Quaternion) {
|
||||
add_package_dependency(ctx, "runtime", "default_hasher_f64");
|
||||
add_package_dependency(ctx, "runtime", "default_hasher_quaternion256");
|
||||
return;
|
||||
} else if (key->Basic.flags & BasicFlag_Complex) {
|
||||
add_package_dependency(ctx, "runtime", "default_hasher_f64");
|
||||
add_package_dependency(ctx, "runtime", "default_hasher_complex128");
|
||||
return;
|
||||
} else if (key->Basic.flags & BasicFlag_Float) {
|
||||
add_package_dependency(ctx, "runtime", "default_hasher_f64");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (key->kind == Type_Struct) {
|
||||
add_package_dependency(ctx, "runtime", "default_hasher");
|
||||
for_array(i, key->Struct.fields) {
|
||||
|
||||
@@ -563,6 +563,53 @@ gb_internal lbValue lb_hasher_proc_for_type(lbModule *m, Type *type) {
|
||||
lbValue res = lb_emit_runtime_call(p, "default_hasher_string", args);
|
||||
lb_add_callsite_force_inline(p, res);
|
||||
LLVMBuildRet(p->builder, res.value);
|
||||
} else if (is_type_float(type)) {
|
||||
lbValue ptr = lb_emit_conv(p, data, pt);
|
||||
lbValue v = lb_emit_load(p, ptr);
|
||||
v = lb_emit_conv(p, v, t_f64);
|
||||
|
||||
auto args = array_make<lbValue>(temporary_allocator(), 2);
|
||||
args[0] = v;
|
||||
args[1] = seed;
|
||||
lbValue res = lb_emit_runtime_call(p, "default_hasher_f64", args);
|
||||
lb_add_callsite_force_inline(p, res);
|
||||
LLVMBuildRet(p->builder, res.value);
|
||||
} else if (is_type_complex(type)) {
|
||||
lbValue ptr = lb_emit_conv(p, data, pt);
|
||||
lbValue xp = lb_emit_struct_ep(p, ptr, 0);
|
||||
lbValue yp = lb_emit_struct_ep(p, ptr, 1);
|
||||
|
||||
lbValue x = lb_emit_conv(p, lb_emit_load(p, xp), t_f64);
|
||||
lbValue y = lb_emit_conv(p, lb_emit_load(p, yp), t_f64);
|
||||
|
||||
auto args = array_make<lbValue>(temporary_allocator(), 3);
|
||||
args[0] = x;
|
||||
args[1] = y;
|
||||
args[2] = seed;
|
||||
lbValue res = lb_emit_runtime_call(p, "default_hasher_complex128", args);
|
||||
lb_add_callsite_force_inline(p, res);
|
||||
LLVMBuildRet(p->builder, res.value);
|
||||
} else if (is_type_quaternion(type)) {
|
||||
lbValue ptr = lb_emit_conv(p, data, pt);
|
||||
lbValue xp = lb_emit_struct_ep(p, ptr, 0);
|
||||
lbValue yp = lb_emit_struct_ep(p, ptr, 1);
|
||||
lbValue zp = lb_emit_struct_ep(p, ptr, 2);
|
||||
lbValue wp = lb_emit_struct_ep(p, ptr, 3);
|
||||
|
||||
lbValue x = lb_emit_conv(p, lb_emit_load(p, xp), t_f64);
|
||||
lbValue y = lb_emit_conv(p, lb_emit_load(p, yp), t_f64);
|
||||
lbValue z = lb_emit_conv(p, lb_emit_load(p, zp), t_f64);
|
||||
lbValue w = lb_emit_conv(p, lb_emit_load(p, wp), t_f64);
|
||||
|
||||
auto args = array_make<lbValue>(temporary_allocator(), 5);
|
||||
args[0] = x;
|
||||
args[1] = y;
|
||||
args[2] = z;
|
||||
args[3] = w;
|
||||
args[4] = seed;
|
||||
lbValue res = lb_emit_runtime_call(p, "default_hasher_quaternion256", args);
|
||||
lb_add_callsite_force_inline(p, res);
|
||||
LLVMBuildRet(p->builder, res.value);
|
||||
} else {
|
||||
GB_PANIC("Unhandled type for hasher: %s", type_to_string(type));
|
||||
}
|
||||
|
||||
+1
-1
@@ -111,7 +111,7 @@ enum BasicFlag {
|
||||
BasicFlag_Ordered = BasicFlag_Integer | BasicFlag_Float | BasicFlag_String | BasicFlag_Pointer | BasicFlag_Rune,
|
||||
BasicFlag_OrderedNumeric = BasicFlag_Integer | BasicFlag_Float | BasicFlag_Rune,
|
||||
BasicFlag_ConstantType = BasicFlag_Boolean | BasicFlag_Numeric | BasicFlag_String | BasicFlag_Pointer | BasicFlag_Rune,
|
||||
BasicFlag_SimpleCompare = BasicFlag_Boolean | BasicFlag_Numeric | BasicFlag_Pointer | BasicFlag_Rune,
|
||||
BasicFlag_SimpleCompare = BasicFlag_Boolean | BasicFlag_Integer | BasicFlag_Pointer | BasicFlag_Rune,
|
||||
};
|
||||
|
||||
struct BasicType {
|
||||
|
||||
Reference in New Issue
Block a user