aboutsummaryrefslogtreecommitdiff
path: root/src/stage1/ir.cpp
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2021-04-15 18:12:11 +0200
committerLemonBoy <thatlemon@gmail.com>2021-04-15 18:12:11 +0200
commitf9481402f0c6f2eb4618bb0385aff18c12912c26 (patch)
treedec626fa96c0c21c8965bf19ef9fcf497a86adfd /src/stage1/ir.cpp
parentc59241bda00376b5a6ee20ca52358329b7482f7f (diff)
downloadzig-f9481402f0c6f2eb4618bb0385aff18c12912c26.tar.gz
zig-f9481402f0c6f2eb4618bb0385aff18c12912c26.zip
stage1: Fix negation for zero floating point values
Toggling the sign by computing 0-x doesn't really work for zero values.
Diffstat (limited to 'src/stage1/ir.cpp')
-rw-r--r--src/stage1/ir.cpp11
1 files changed, 3 insertions, 8 deletions
diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp
index 71a233c964..942b6028d9 100644
--- a/src/stage1/ir.cpp
+++ b/src/stage1/ir.cpp
@@ -11363,11 +11363,8 @@ static void float_negate(ZigValue *out_val, ZigValue *op) {
} else if (op->type->id == ZigTypeIdFloat) {
switch (op->type->data.floating.bit_count) {
case 16:
- {
- const float16_t zero = zig_double_to_f16(0);
- out_val->data.x_f16 = f16_sub(zero, op->data.x_f16);
- return;
- }
+ out_val->data.x_f16 = f16_neg(op->data.x_f16);
+ return;
case 32:
out_val->data.x_f32 = -op->data.x_f32;
return;
@@ -11375,9 +11372,7 @@ static void float_negate(ZigValue *out_val, ZigValue *op) {
out_val->data.x_f64 = -op->data.x_f64;
return;
case 128:
- float128_t zero_f128;
- ui32_to_f128M(0, &zero_f128);
- f128M_sub(&zero_f128, &op->data.x_f128, &out_val->data.x_f128);
+ f128M_neg(&op->data.x_f128, &out_val->data.x_f128);
return;
default:
zig_unreachable();