aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-03-06 15:16:11 +0000
committergingerBill <bill@gingerbill.org>2024-03-06 15:16:11 +0000
commitb1903b915bbfe4e325589fc70bbf1c1663fdae7d (patch)
treeb25501064e252e469e54fc0b28a5461c7ec020a0 /src
parenta7bab89c934d181ddbfa6e17103b2587581ee5e9 (diff)
Change to IEEE 754-2008 conformance for `min`/`max` runtime operations.
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend_utility.cpp18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp
index 2c80f9c6a..f18aa5521 100644
--- a/src/llvm_backend_utility.cpp
+++ b/src/llvm_backend_utility.cpp
@@ -126,12 +126,13 @@ gb_internal lbValue lb_emit_min(lbProcedure *p, Type *t, lbValue x, lbValue y) {
y = lb_emit_conv(p, y, t);
bool use_llvm_intrinsic = is_type_float(t) || (is_type_simd_vector(t) && is_type_float(base_array_type(t)));
if (use_llvm_intrinsic) {
- // NOTE(bill): f either operand is a NaN, returns NaN. Otherwise returns the lesser of the two arguments.
- // -0.0 is considered to be less than +0.0 for this intrinsic.
- // These semantics are specified by IEEE 754-2019.
LLVMValueRef args[2] = {x.value, y.value};
LLVMTypeRef types[1] = {lb_type(p->module, t)};
- LLVMValueRef v = lb_call_intrinsic(p, "llvm.minimum", args, gb_count_of(args), types, gb_count_of(types));
+
+ // NOTE(bill): f either operand is a NaN, returns NaN. Otherwise returns the lesser of the two arguments.
+ // -0.0 is considered to be less than +0.0 for this intrinsic.
+ // These semantics are specified by IEEE 754-2008.
+ LLVMValueRef v = lb_call_intrinsic(p, "llvm.minnum", args, gb_count_of(args), types, gb_count_of(types));
return {v, t};
}
return lb_emit_select(p, lb_emit_comp(p, Token_Lt, x, y), x, y);
@@ -141,12 +142,13 @@ gb_internal lbValue lb_emit_max(lbProcedure *p, Type *t, lbValue x, lbValue y) {
y = lb_emit_conv(p, y, t);
bool use_llvm_intrinsic = is_type_float(t) || (is_type_simd_vector(t) && is_type_float(base_array_type(t)));
if (use_llvm_intrinsic) {
- // NOTE(bill): If either operand is a NaN, returns NaN. Otherwise returns the greater of the two arguments.
- // -0.0 is considered to be less than +0.0 for this intrinsic.
- // These semantics are specified by IEEE 754-2019.
LLVMValueRef args[2] = {x.value, y.value};
LLVMTypeRef types[1] = {lb_type(p->module, t)};
- LLVMValueRef v = lb_call_intrinsic(p, "llvm.maximum", args, gb_count_of(args), types, gb_count_of(types));
+
+ // NOTE(bill): If either operand is a NaN, returns NaN. Otherwise returns the greater of the two arguments.
+ // -0.0 is considered to be less than +0.0 for this intrinsic.
+ // These semantics are specified by IEEE 754-2008.
+ LLVMValueRef v = lb_call_intrinsic(p, "llvm.maxnum", args, gb_count_of(args), types, gb_count_of(types));
return {v, t};
}
return lb_emit_select(p, lb_emit_comp(p, Token_Gt, x, y), x, y);