Skip to content

Commit f23173b

Browse files
Use -0.0 in intrinsics::simd::reduce_add_unordered
-0.0 is the actual neutral additive float, not +0.0, and this matters to codegen.
1 parent 0307e40 commit f23173b

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

compiler/rustc_codegen_llvm/src/intrinsic.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -2090,14 +2090,14 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
20902090
};
20912091
}
20922092

2093-
arith_red!(simd_reduce_add_ordered: vector_reduce_add, vector_reduce_fadd, true, add, 0.0);
2093+
arith_red!(simd_reduce_add_ordered: vector_reduce_add, vector_reduce_fadd, true, add, -0.0);
20942094
arith_red!(simd_reduce_mul_ordered: vector_reduce_mul, vector_reduce_fmul, true, mul, 1.0);
20952095
arith_red!(
20962096
simd_reduce_add_unordered: vector_reduce_add,
20972097
vector_reduce_fadd_reassoc,
20982098
false,
20992099
add,
2100-
0.0
2100+
-0.0
21012101
);
21022102
arith_red!(
21032103
simd_reduce_mul_unordered: vector_reduce_mul,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//@ assembly-output: emit-asm
2+
//@ compile-flags: --crate-type=lib -O
3+
//@ only-aarch64
4+
#![feature(portable_simd)]
5+
#![feature(core_intrinsics)]
6+
use std::intrinsics::simd as intrinsics;
7+
use std::simd::*;
8+
9+
// CHECK-LABEL: reduce_fadd_negative_zero
10+
pub unsafe fn reduce_fadd_negative_zero(v: f32x4) -> f32 {
11+
// CHECK-NEXT: ldr
12+
// CHECK-NEXT: faddp
13+
// CHECK-NEXT: faddp
14+
// CHECK-NEXT: ret
15+
intrinsics::simd_reduce_add_unordered(v)
16+
}

0 commit comments

Comments
 (0)