Skip to content

Commit e281d96

Browse files
committed
[clang][x86] Add constexpr support for _mm_add_epi32/64 and _mm_sub_epi32/64
1 parent f257e9b commit e281d96

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

clang/lib/Headers/emmintrin.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2110,8 +2110,8 @@ static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_add_epi16(__m128i __a,
21102110
/// A 128-bit vector of [4 x i32].
21112111
/// \returns A 128-bit vector of [4 x i32] containing the sums of both
21122112
/// parameters.
2113-
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_add_epi32(__m128i __a,
2114-
__m128i __b) {
2113+
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
2114+
_mm_add_epi32(__m128i __a, __m128i __b) {
21152115
return (__m128i)((__v4su)__a + (__v4su)__b);
21162116
}
21172117

@@ -2147,8 +2147,8 @@ static __inline__ __m64 __DEFAULT_FN_ATTRS _mm_add_si64(__m64 __a, __m64 __b) {
21472147
/// A 128-bit vector of [2 x i64].
21482148
/// \returns A 128-bit vector of [2 x i64] containing the sums of both
21492149
/// parameters.
2150-
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_add_epi64(__m128i __a,
2151-
__m128i __b) {
2150+
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
2151+
_mm_add_epi64(__m128i __a, __m128i __b) {
21522152
return (__m128i)((__v2du)__a + (__v2du)__b);
21532153
}
21542154

@@ -2539,8 +2539,8 @@ static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_sub_epi16(__m128i __a,
25392539
/// A 128-bit integer vector containing the subtrahends.
25402540
/// \returns A 128-bit integer vector containing the differences of the values
25412541
/// in the operands.
2542-
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_sub_epi32(__m128i __a,
2543-
__m128i __b) {
2542+
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
2543+
_mm_sub_epi32(__m128i __a, __m128i __b) {
25442544
return (__m128i)((__v4su)__a - (__v4su)__b);
25452545
}
25462546

@@ -2573,8 +2573,8 @@ static __inline__ __m64 __DEFAULT_FN_ATTRS _mm_sub_si64(__m64 __a, __m64 __b) {
25732573
/// A 128-bit integer vector containing the subtrahends.
25742574
/// \returns A 128-bit integer vector containing the differences of the values
25752575
/// in the operands.
2576-
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_sub_epi64(__m128i __a,
2577-
__m128i __b) {
2576+
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
2577+
_mm_sub_epi64(__m128i __a, __m128i __b) {
25782578
return (__m128i)((__v2du)__a - (__v2du)__b);
25792579
}
25802580

clang/test/CodeGen/X86/builtin_test_helpers.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ constexpr bool match_m128i(__m128i v, unsigned long long a, unsigned long long b
1616
return v[0] == a && v[1] == b;
1717
}
1818

19+
constexpr bool match_v2di(__m128i v, long long a, long long b) {
20+
return v[0] == a && v[1] == b;
21+
}
22+
23+
constexpr bool match_v4si(__m128i _v, int a, int b, int c, int d) {
24+
__v4si v = (__v4si)_v;
25+
return v[0] == a && v[1] == b && v[2] == c && v[3] == d;
26+
}
27+
1928
constexpr bool match_m256(__m256 v, float a, float b, float c, float d, float e, float f, float g, float h) {
2029
return v[0] == a && v[1] == b && v[2] == c && v[3] == d && v[4] == e && v[5] == f && v[6] == g && v[7] == h;
2130
}

clang/test/CodeGen/X86/sse2-builtins.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@ __m128i test_mm_add_epi32(__m128i A, __m128i B) {
3232
// CHECK: add <4 x i32>
3333
return _mm_add_epi32(A, B);
3434
}
35+
TEST_CONSTEXPR(match_v4si(_mm_add_epi32((__m128i)(__v4si){+1, -2, +3, -4}, (__m128i)(__v4si){-10, +8, +6, -4}), -9, +6, +9, -8));
3536

3637
__m128i test_mm_add_epi64(__m128i A, __m128i B) {
3738
// CHECK-LABEL: test_mm_add_epi64
3839
// CHECK: add <2 x i64>
3940
return _mm_add_epi64(A, B);
4041
}
42+
TEST_CONSTEXPR(match_v2di(_mm_add_epi64((__m128i)(__v2di){+5, -3}, (__m128i)(__v2di){-9, +8}), -4, +5));
4143

4244
__m128d test_mm_add_pd(__m128d A, __m128d B) {
4345
// CHECK-LABEL: test_mm_add_pd
@@ -1634,12 +1636,14 @@ __m128i test_mm_sub_epi32(__m128i A, __m128i B) {
16341636
// CHECK: sub <4 x i32>
16351637
return _mm_sub_epi32(A, B);
16361638
}
1639+
TEST_CONSTEXPR(match_v4si(_mm_sub_epi32((__m128i)(__v4si){+1, -2, +3, -4}, (__m128i)(__v4si){-10, +8, +6, -4}), +11, -10, -3, 0));
16371640

16381641
__m128i test_mm_sub_epi64(__m128i A, __m128i B) {
16391642
// CHECK-LABEL: test_mm_sub_epi64
16401643
// CHECK: sub <2 x i64>
16411644
return _mm_sub_epi64(A, B);
16421645
}
1646+
TEST_CONSTEXPR(match_v2di(_mm_sub_epi64((__m128i)(__v2di){+5, -3}, (__m128i)(__v2di){-9, +8}), +14, -11));
16431647

16441648
__m128d test_mm_sub_pd(__m128d A, __m128d B) {
16451649
// CHECK-LABEL: test_mm_sub_pd

0 commit comments

Comments
 (0)