Skip to content

Commit 6dcce42

Browse files
committed
[X86] Use correct fp immediate types in _mm_set_ss/sd
Avoids implicit sint_to_fp which wasn't occurring on strict fp codegen Fixes #104848
1 parent 3b49d27 commit 6dcce42

File tree

3 files changed

+6
-12
lines changed

3 files changed

+6
-12
lines changed

clang/lib/Headers/emmintrin.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1774,7 +1774,7 @@ static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_undefined_pd(void) {
17741774
/// lower 64 bits contain the value of the parameter. The upper 64 bits are
17751775
/// set to zero.
17761776
static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_set_sd(double __w) {
1777-
return __extension__(__m128d){__w, 0};
1777+
return __extension__(__m128d){__w, 0.0};
17781778
}
17791779

17801780
/// Constructs a 128-bit floating-point vector of [2 x double], with each

clang/lib/Headers/xmmintrin.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1925,7 +1925,7 @@ _mm_undefined_ps(void)
19251925
static __inline__ __m128 __DEFAULT_FN_ATTRS
19261926
_mm_set_ss(float __w)
19271927
{
1928-
return __extension__ (__m128){ __w, 0, 0, 0 };
1928+
return __extension__ (__m128){ __w, 0.0f, 0.0f, 0.0f };
19291929
}
19301930

19311931
/// Constructs a 128-bit floating-point vector of [4 x float], with each

clang/test/CodeGen/X86/strictfp_patterns.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@
33

44
#include <immintrin.h>
55

6-
// TODO: PR104848 - ensure the _mm_set_ss/d headers don't implicity promote any integer/fp values.
6+
// PR104848 - ensure the _mm_set_ss/d headers don't implicity promote any integer/fp values.
77

88
// CHECK-LABEL: @test_mm_set_ss(
99
// CHECK-NEXT: entry:
10-
// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <4 x float> poison, float [[NUM:%.*]], i64 0
11-
// CHECK-NEXT: [[CONV_I:%.*]] = tail call float @llvm.experimental.constrained.sitofp.f32.i32(i32 0, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR2:[0-9]+]]
12-
// CHECK-NEXT: [[VECINIT1_I:%.*]] = insertelement <4 x float> [[VECINIT_I]], float [[CONV_I]], i64 1
13-
// CHECK-NEXT: [[VECINIT3_I:%.*]] = insertelement <4 x float> [[VECINIT1_I]], float [[CONV_I]], i64 2
14-
// CHECK-NEXT: [[VECINIT5_I:%.*]] = insertelement <4 x float> [[VECINIT3_I]], float [[CONV_I]], i64 3
15-
// CHECK-NEXT: ret <4 x float> [[VECINIT5_I]]
10+
// CHECK-NEXT: [[VECINIT3_I:%.*]] = insertelement <4 x float> <float poison, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, float [[NUM:%.*]], i64 0
11+
// CHECK-NEXT: ret <4 x float> [[VECINIT3_I]]
1612
//
1713
__m128 test_mm_set_ss(float num)
1814
{
@@ -21,9 +17,7 @@ __m128 test_mm_set_ss(float num)
2117

2218
// CHECK-LABEL: @test_mm_set_sd(
2319
// CHECK-NEXT: entry:
24-
// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <2 x double> poison, double [[NUM:%.*]], i64 0
25-
// CHECK-NEXT: [[CONV_I:%.*]] = tail call double @llvm.experimental.constrained.sitofp.f64.i32(i32 0, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR2]]
26-
// CHECK-NEXT: [[VECINIT1_I:%.*]] = insertelement <2 x double> [[VECINIT_I]], double [[CONV_I]], i64 1
20+
// CHECK-NEXT: [[VECINIT1_I:%.*]] = insertelement <2 x double> <double poison, double 0.000000e+00>, double [[NUM:%.*]], i64 0
2721
// CHECK-NEXT: ret <2 x double> [[VECINIT1_I]]
2822
//
2923
__m128d test_mm_set_sd(double num)

0 commit comments

Comments
 (0)