diff --git a/core/runtime/internal.odin b/core/runtime/internal.odin index 16930185e..4f3488eb7 100644 --- a/core/runtime/internal.odin +++ b/core/runtime/internal.odin @@ -258,15 +258,72 @@ memory_compare_zero :: proc "contextless" (a: rawptr, n: int) -> int #no_bounds_ return 0 } -string_eq :: proc "contextless" (a, b: string) -> bool { - x := transmute(Raw_String)a - y := transmute(Raw_String)b +string_eq :: proc "contextless" (lhs, rhs: string) -> bool { + x := transmute(Raw_String)lhs + y := transmute(Raw_String)rhs switch { - case x.len != y.len: return false - case x.len == 0: return true - case x.data == y.data: return true + case x.len != y.len: return false + case x.len == 0: return true + case x.data == y.data: return true + } + + a, b := x.data, y.data + length := uint(x.len) + + when size_of(uint) == 8 { + if word_length := length >> 3; word_length != 0 { + for i in 0..> 2; word_length != 0 { + for i in 0.. int { @@ -708,7 +765,7 @@ floattidf :: proc "c" (a: i128) -> f64 { a += 1 a >>= 2 - if a & (1 << DBL_MANT_DIG) != 0 { + if a & (i128(1) << DBL_MANT_DIG) != 0 { a >>= 1 e += 1 }